From 9b99173c9fe0a1370fcbb870ddafe7930f96731b Mon Sep 17 00:00:00 2001 From: Ali Hassani <68103095+alihassanijr@users.noreply.github.com> Date: Fri, 8 Mar 2024 00:35:03 -0500 Subject: [PATCH] Fused neighborhood attention (#111) * Fused neighborhood attention (FNA) kernels (forward pass only for now) * 1D, 2D and 3D Neighborhood Attention are supported, * Causal neighborhood attention is implemented, * Window (kernel) size, dilation, and causality can be defined *per-axis*, * All GPU architectures since Maxwell (SM50) are supported, * SM50 up to SM70 are SIMT-only, but support both FP16 and FP32, * SM70 and SM75 target Tensor Cores in FP16, and SIMT-style in FP32, * SM80 and above target Tensor Cores in FP16, BF16, and FP32. * Relative positional biases are implemented (not defined for causal masking yet), * Memory layout in FNA is different from existing kernels (`[B, *, heads, dim]` instead of `[B, heads, *, dim]`.) * Eventually this layout can skip over the permute/explicit reshape step in the attention module following the QKV projection. * Naive kernels now implement and allow causal masking, * Naive kernels (CPU and CUDA) now allow varying parameters (window size, dilation, causal) across axes, * Major bug fix in Volta GEMM kernels * The epilogue was different for Volta, and it slipped through unit tests, * Tests are now more aggressive, and the issue has been fixed. * Minor torch bug fixed * Streams were not being selected correctly if users set a tensor to a device other than cuda:0. Thanks to @AdityaKane2001 for discovering it. * Documentation (finally): * Better late than never, but finally added more documentation and reorganized docs under docs/ instead of shoving everything into the readme. * So much more that I forgot (in part due to lack of documentation). --- CHANGELOG.md | 19 + LICENSE | 34 + Makefile | 2 +- README.md | 382 +- assets/README_pypi.md | 356 +- assets/cudamemory_dark.png | Bin 172479 -> 0 bytes assets/cudamemory_light.png | Bin 162966 -> 0 bytes assets/cudatime_dark.png | Bin 137097 -> 0 bytes assets/cudatime_light.png | Bin 130284 -> 0 bytes assets/gemm_vs_naive.png | Bin 436915 -> 0 bytes csrc/CMakeLists.txt | 2 + .../natten_autogen/cpu/naive/kernels.h | 476 +- .../natten_autogen/cuda/fna/dispatch_cm.h | 775 + .../natten_autogen/cuda/fna/dispatch_device.h | 85 + .../natten_autogen/cuda/fna/dispatch_dtype.h | 220 + .../natten_autogen/cuda/fna/interface.h | 38 + .../include/natten_autogen/cuda/fna/kernels.h | 14094 +++++++++++++ .../cuda/gemm/2d/sm70/dispatch_align.h | 1218 +- .../cuda/gemm/2d/sm70/dispatch_kernel_size.h | 135 + .../cuda/gemm/2d/sm70/kernels.h | 2801 ++- .../cuda/gemm/2d/sm75/dispatch_align.h | 1218 +- .../cuda/gemm/2d/sm75/dispatch_kernel_size.h | 135 + .../cuda/gemm/2d/sm75/kernels.h | 2801 ++- .../cuda/gemm/2d/sm80/dispatch_align.h | 5023 ++++- .../cuda/gemm/2d/sm80/dispatch_kernel_size.h | 540 + .../cuda/gemm/2d/sm80/kernels.h | 9760 ++++++++- .../natten_autogen/cuda/naive/dispatch_cm.h | 1192 ++ .../natten_autogen/cuda/naive/dispatch_di.h | 4216 ---- .../natten_autogen/cuda/naive/dispatch_ks.h | 1516 -- .../natten_autogen/cuda/naive/interface.h | 158 +- .../natten_autogen/cuda/naive/kernels.h | 16470 +++------------- csrc/autogen/src/cpu/naive/source_0.cpp | 269 +- csrc/autogen/src/cpu/naive/source_1.cpp | 279 +- csrc/autogen/src/cuda/fna/source_0.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_1.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_10.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_11.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_12.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_13.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_14.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_15.cu | 781 + csrc/autogen/src/cuda/fna/source_2.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_3.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_4.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_5.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_6.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_7.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_8.cu | 2573 +++ csrc/autogen/src/cuda/fna/source_9.cu | 2573 +++ .../autogen/src/cuda/gemm/2d/sm70/source_0.cu | 956 +- .../autogen/src/cuda/gemm/2d/sm70/source_1.cu | 1167 +- .../autogen/src/cuda/gemm/2d/sm70/source_2.cu | 1114 +- .../autogen/src/cuda/gemm/2d/sm70/source_3.cu | 1039 +- .../autogen/src/cuda/gemm/2d/sm75/source_0.cu | 956 +- .../autogen/src/cuda/gemm/2d/sm75/source_1.cu | 1167 +- .../autogen/src/cuda/gemm/2d/sm75/source_2.cu | 1114 +- .../autogen/src/cuda/gemm/2d/sm75/source_3.cu | 1039 +- .../autogen/src/cuda/gemm/2d/sm80/source_0.cu | 424 +- .../autogen/src/cuda/gemm/2d/sm80/source_1.cu | 578 +- .../src/cuda/gemm/2d/sm80/source_10.cu | 449 +- .../src/cuda/gemm/2d/sm80/source_11.cu | 603 +- .../src/cuda/gemm/2d/sm80/source_12.cu | 619 +- .../src/cuda/gemm/2d/sm80/source_13.cu | 619 +- .../src/cuda/gemm/2d/sm80/source_14.cu | 465 +- .../src/cuda/gemm/2d/sm80/source_15.cu | 469 +- .../src/cuda/gemm/2d/sm80/source_16.cu | 469 +- .../src/cuda/gemm/2d/sm80/source_17.cu | 469 +- .../src/cuda/gemm/2d/sm80/source_18.cu | 477 +- .../src/cuda/gemm/2d/sm80/source_19.cu | 469 +- .../autogen/src/cuda/gemm/2d/sm80/source_2.cu | 634 +- .../src/cuda/gemm/2d/sm80/source_20.cu | 469 +- .../src/cuda/gemm/2d/sm80/source_21.cu | 629 +- .../src/cuda/gemm/2d/sm80/source_22.cu | 709 +- .../src/cuda/gemm/2d/sm80/source_23.cu | 619 +- .../src/cuda/gemm/2d/sm80/source_24.cu | 559 +- .../src/cuda/gemm/2d/sm80/source_25.cu | 505 +- .../src/cuda/gemm/2d/sm80/source_26.cu | 469 +- .../src/cuda/gemm/2d/sm80/source_27.cu | 469 +- .../src/cuda/gemm/2d/sm80/source_28.cu | 517 +- .../src/cuda/gemm/2d/sm80/source_29.cu | 469 +- .../autogen/src/cuda/gemm/2d/sm80/source_3.cu | 634 +- .../src/cuda/gemm/2d/sm80/source_30.cu | 469 +- .../src/cuda/gemm/2d/sm80/source_31.cu | 409 - .../autogen/src/cuda/gemm/2d/sm80/source_4.cu | 440 +- .../autogen/src/cuda/gemm/2d/sm80/source_5.cu | 484 +- .../autogen/src/cuda/gemm/2d/sm80/source_6.cu | 484 +- .../autogen/src/cuda/gemm/2d/sm80/source_7.cu | 452 +- .../autogen/src/cuda/gemm/2d/sm80/source_8.cu | 484 +- .../autogen/src/cuda/gemm/2d/sm80/source_9.cu | 484 +- csrc/autogen/src/cuda/naive/source_0.cu | 12093 ++---------- csrc/autogen/src/cuda/naive/source_1.cu | 12315 ++---------- csrc/include/natten/config.h | 2 +- csrc/include/natten/cpu/na1d.h | 85 +- csrc/include/natten/cpu/na2d.h | 93 +- csrc/include/natten/cpu/na3d.h | 109 +- .../cpu/naive/inverse_neighborhood_1d.hpp | 99 +- .../cpu/naive/inverse_neighborhood_2d.hpp | 143 +- .../cpu/naive/inverse_neighborhood_3d.hpp | 198 +- .../natten/cpu/naive/natten_cpu_commons.h | 136 +- .../naive/neighborhood_neighborhood_1d.hpp | 89 +- .../naive/neighborhood_neighborhood_2d.hpp | 143 +- .../naive/neighborhood_neighborhood_3d.hpp | 193 +- .../cpu/naive/pointwise_neighborhood_1d.hpp | 278 +- .../cpu/naive/pointwise_neighborhood_2d.hpp | 420 +- .../cpu/naive/pointwise_neighborhood_3d.hpp | 363 +- .../natten/cpu/naive/rel_pos_bias_1d.hpp | 57 +- .../natten/cpu/naive/rel_pos_bias_2d.hpp | 82 +- .../natten/cpu/naive/rel_pos_bias_3d.hpp | 117 +- .../cuda/fna/epilogue/epilogue_pipelined.h | 638 + .../fna/epilogue/epilogue_rescale_output.h | 266 + .../epilogue_thread_apply_logsumexp.h | 181 + .../fna/epilogue/predicated_tile_iterator.h | 629 + .../predicated_tile_iterator_params.h | 152 + csrc/include/natten/cuda/fna/fna_forward.cuh | 183 + .../include/natten/cuda/fna/gemm/custom_mma.h | 139 + .../natten/cuda/fna/gemm/custom_mma_base.h | 189 + .../cuda/fna/gemm/custom_mma_multistage.h | 765 + .../cuda/fna/gemm/custom_mma_pipelined.h | 408 + .../natten/cuda/fna/gemm/find_default_mma.h | 272 + .../cuda/fna/gemm/mma_accum_lambda_iterator.h | 393 + .../natten/cuda/fna/gemm/mma_from_smem.h | 1966 ++ .../cuda/fna/gemm/replace_mma_iterators.h | 123 + .../natten/cuda/fna/gemm_kernel_utils.h | 186 + .../default_warp_iterator_from_smem.h | 149 + .../epilogue_predicated_tile_iterator.h | 760 + .../cuda/fna/iterators/make_residual_last.h | 108 + .../predicated_tile_access_iterator.h | 1662 ++ ...cated_tile_access_iterator_residual_last.h | 976 + .../fna/iterators/predicated_tile_iterator.h | 831 + .../predicated_tile_iterator_residual_last.h | 617 + .../fna/iterators/transpose_warp_iterator.h | 60 + .../fna/iterators/warp_iterator_from_smem.h | 290 + csrc/include/natten/cuda/fna/kernel_forward.h | 1168 ++ csrc/include/natten/cuda/fna/na_utils.cuh | 1158 ++ .../cuda/fna/transform/tile_smem_loader.h | 95 + .../natten/cuda/gemm/kernel/default_na.cuh | 21 +- .../cuda/gemm/kernel/default_na1d_in.cuh | 375 +- .../cuda/gemm/kernel/default_na1d_nn.cuh | 375 +- .../cuda/gemm/kernel/default_na1d_pn.cuh | 382 +- .../cuda/gemm/kernel/default_na2d_in.cuh | 395 +- .../cuda/gemm/kernel/default_na2d_nn.cuh | 395 +- .../cuda/gemm/kernel/default_na2d_pn.cuh | 402 +- csrc/include/natten/cuda/gemm/na1d.cuh | 8 +- csrc/include/natten/cuda/gemm/na2d.cuh | 17 +- .../threadblock/default_epilogue_simt.cuh | 167 - .../default_epilogue_tensor_op.cuh | 173 - .../na1d_in_output_tile_iterator.cuh | 38 +- .../na1d_nn_output_tile_iterator.cuh | 38 +- .../na1d_pn_output_tile_iterator.cuh | 50 +- .../na2d_in_output_tile_iterator.cuh | 38 +- .../na2d_nn_output_tile_iterator.cuh | 38 +- .../na2d_pn_output_tile_iterator.cuh | 50 +- csrc/include/natten/cuda/na1d.cuh | 196 +- csrc/include/natten/cuda/na2d.cuh | 251 +- csrc/include/natten/cuda/na3d.cuh | 228 +- .../cuda/naive/inverse_neighborhood_1d.cuh | 165 +- .../cuda/naive/inverse_neighborhood_2d.cuh | 217 +- .../cuda/naive/inverse_neighborhood_3d.cuh | 319 +- .../natten/cuda/naive/natten_commons.cuh | 273 +- .../naive/neighborhood_neighborhood_1d.cuh | 146 +- .../naive/neighborhood_neighborhood_2d.cuh | 196 +- .../naive/neighborhood_neighborhood_3d.cuh | 283 +- .../cuda/naive/pointwise_neighborhood_1d.cuh | 272 +- .../cuda/naive/pointwise_neighborhood_2d.cuh | 705 +- .../cuda/naive/pointwise_neighborhood_3d.cuh | 517 +- .../natten/cuda/naive/rel_pos_bias_1d.cuh | 127 +- .../natten/cuda/naive/rel_pos_bias_2d.cuh | 172 +- .../natten/cuda/naive/rel_pos_bias_3d.cuh | 267 +- csrc/include/natten/cuda/naive/tiled/base.cuh | 105 +- ...wise_neighborhood_2d_tiled_11x11_13x13.cuh | 264 +- .../pointwise_neighborhood_2d_tiled_3x3.cuh | 208 +- .../pointwise_neighborhood_2d_tiled_5x5.cuh | 138 +- ...ointwise_neighborhood_2d_tiled_7x7_9x9.cuh | 260 +- csrc/include/natten/cuda/utils/cuda.h | 35 + .../cuda/{gemm/utils.cuh => utils/cutlass.h} | 4 +- csrc/include/natten/naive_argpack.h | 38 +- csrc/include/natten/natten.h | 130 + csrc/include/natten/pytorch/cpu/na1d.h | 71 +- csrc/include/natten/pytorch/cpu/na2d.h | 80 +- csrc/include/natten/pytorch/cpu/na3d.h | 97 +- csrc/include/natten/pytorch/cuda/helpers.cuh | 9 +- csrc/include/natten/pytorch/cuda/na1d.cuh | 71 +- csrc/include/natten/pytorch/cuda/na2d.cuh | 80 +- csrc/include/natten/pytorch/cuda/na3d.cuh | 97 +- csrc/include/natten/pytorch/helpers.h | 149 +- csrc/include/natten/pytorch/na1d.h | 35 +- csrc/include/natten/pytorch/na2d.h | 35 +- csrc/include/natten/pytorch/na3d.h | 43 +- csrc/natten.cpp | 9 + csrc/src/pytorch/cpu/na1d.cpp | 91 +- csrc/src/pytorch/cpu/na2d.cpp | 100 +- csrc/src/pytorch/cpu/na3d.cpp | 117 +- csrc/src/pytorch/cuda/na1d.cu | 111 +- csrc/src/pytorch/cuda/na2d.cu | 121 +- csrc/src/pytorch/cuda/na3d.cu | 139 +- csrc/src/pytorch/na1d.cpp | 139 +- csrc/src/pytorch/na2d.cpp | 153 +- csrc/src/pytorch/na3d.cpp | 187 +- docs/README.md | 20 + docs/api.md | 95 + docs/assets/batched_gemm_na_dark.png | Bin 0 -> 253611 bytes docs/assets/batched_gemm_na_light.png | Bin 0 -> 252970 bytes .../dilated_neighborhood_attn_2d_vis_dark.png | Bin 0 -> 2229500 bytes ...dilated_neighborhood_attn_2d_vis_light.png | Bin 0 -> 2228650 bytes docs/assets/fna_dark.png | Bin 0 -> 133179 bytes docs/assets/fna_light.png | Bin 0 -> 128466 bytes docs/assets/neighborhood_attn_2d_vis_dark.png | Bin 0 -> 2225546 bytes .../assets/neighborhood_attn_2d_vis_light.png | Bin 0 -> 2224460 bytes docs/assets/old_natten_dark.png | Bin 0 -> 23076 bytes docs/assets/old_natten_light.png | Bin 0 -> 23071 bytes docs/backend.md | 45 + docs/build.md | 19 + docs/frontend.md | 349 + docs/history.md | 50 + docs/install.md | 140 + docs/methodology/README.md | 13 + docs/methodology/bmm.md | 21 + docs/methodology/fused.md | 19 + docs/tests.md | 30 + scripts/autogen_cpu_naive.py | 93 +- scripts/autogen_cuda_fna.py | 689 + scripts/autogen_cuda_gemm_1d.py | 158 +- scripts/autogen_cuda_gemm_2d.py | 2 +- scripts/autogen_cuda_naive.py | 453 +- src/natten/__init__.py | 14 +- src/natten/autotuner.py | 497 + src/natten/flops.py | 82 + src/natten/fna.py | 47 + src/natten/functional.py | 880 +- src/natten/natten1d.py | 118 +- src/natten/natten2d.py | 120 +- src/natten/natten3d.py | 148 +- src/natten/nested.py | 129 +- src/natten/utils/__init__.py | 14 + src/natten/utils/checks.py | 129 + src/natten/utils/testing.py | 16 +- tests/test_fna1d.py | 356 + tests/test_fna2d.py | 379 + tests/test_fna3d.py | 400 + tests/test_na1d.py | 421 +- tests/test_na2d.py | 593 +- tests/test_na3d.py | 527 +- tools/profile_1d.py | 44 +- tools/profile_2d.py | 44 +- ..._2d_with_extra_tokens.py => profile_3d.py} | 81 +- tools/requirements.txt | 1 + tools/utils/__init__.py | 13 +- tools/utils/{utils.py => formatting.py} | 360 +- tools/utils/mappings.py | 188 + tools/utils/na_profiler.py | 350 + tools/utils/ops.py | 57 + tools/utils/problem.py | 172 + tools/utils/profiler_1d.py | 180 - tools/utils/profiler_2d.py | 296 - 254 files changed, 133543 insertions(+), 55740 deletions(-) delete mode 100644 assets/cudamemory_dark.png delete mode 100644 assets/cudamemory_light.png delete mode 100644 assets/cudatime_dark.png delete mode 100644 assets/cudatime_light.png delete mode 100644 assets/gemm_vs_naive.png create mode 100644 csrc/autogen/include/natten_autogen/cuda/fna/dispatch_cm.h create mode 100644 csrc/autogen/include/natten_autogen/cuda/fna/dispatch_device.h create mode 100644 csrc/autogen/include/natten_autogen/cuda/fna/dispatch_dtype.h create mode 100644 csrc/autogen/include/natten_autogen/cuda/fna/interface.h create mode 100644 csrc/autogen/include/natten_autogen/cuda/fna/kernels.h create mode 100644 csrc/autogen/include/natten_autogen/cuda/naive/dispatch_cm.h delete mode 100644 csrc/autogen/include/natten_autogen/cuda/naive/dispatch_di.h delete mode 100644 csrc/autogen/include/natten_autogen/cuda/naive/dispatch_ks.h create mode 100644 csrc/autogen/src/cuda/fna/source_0.cu create mode 100644 csrc/autogen/src/cuda/fna/source_1.cu create mode 100644 csrc/autogen/src/cuda/fna/source_10.cu create mode 100644 csrc/autogen/src/cuda/fna/source_11.cu create mode 100644 csrc/autogen/src/cuda/fna/source_12.cu create mode 100644 csrc/autogen/src/cuda/fna/source_13.cu create mode 100644 csrc/autogen/src/cuda/fna/source_14.cu create mode 100644 csrc/autogen/src/cuda/fna/source_15.cu create mode 100644 csrc/autogen/src/cuda/fna/source_2.cu create mode 100644 csrc/autogen/src/cuda/fna/source_3.cu create mode 100644 csrc/autogen/src/cuda/fna/source_4.cu create mode 100644 csrc/autogen/src/cuda/fna/source_5.cu create mode 100644 csrc/autogen/src/cuda/fna/source_6.cu create mode 100644 csrc/autogen/src/cuda/fna/source_7.cu create mode 100644 csrc/autogen/src/cuda/fna/source_8.cu create mode 100644 csrc/autogen/src/cuda/fna/source_9.cu create mode 100644 csrc/include/natten/cuda/fna/epilogue/epilogue_pipelined.h create mode 100644 csrc/include/natten/cuda/fna/epilogue/epilogue_rescale_output.h create mode 100644 csrc/include/natten/cuda/fna/epilogue/epilogue_thread_apply_logsumexp.h create mode 100644 csrc/include/natten/cuda/fna/epilogue/predicated_tile_iterator.h create mode 100644 csrc/include/natten/cuda/fna/epilogue/predicated_tile_iterator_params.h create mode 100644 csrc/include/natten/cuda/fna/fna_forward.cuh create mode 100644 csrc/include/natten/cuda/fna/gemm/custom_mma.h create mode 100644 csrc/include/natten/cuda/fna/gemm/custom_mma_base.h create mode 100644 csrc/include/natten/cuda/fna/gemm/custom_mma_multistage.h create mode 100644 csrc/include/natten/cuda/fna/gemm/custom_mma_pipelined.h create mode 100644 csrc/include/natten/cuda/fna/gemm/find_default_mma.h create mode 100644 csrc/include/natten/cuda/fna/gemm/mma_accum_lambda_iterator.h create mode 100644 csrc/include/natten/cuda/fna/gemm/mma_from_smem.h create mode 100644 csrc/include/natten/cuda/fna/gemm/replace_mma_iterators.h create mode 100644 csrc/include/natten/cuda/fna/gemm_kernel_utils.h create mode 100644 csrc/include/natten/cuda/fna/iterators/default_warp_iterator_from_smem.h create mode 100644 csrc/include/natten/cuda/fna/iterators/epilogue_predicated_tile_iterator.h create mode 100644 csrc/include/natten/cuda/fna/iterators/make_residual_last.h create mode 100644 csrc/include/natten/cuda/fna/iterators/predicated_tile_access_iterator.h create mode 100644 csrc/include/natten/cuda/fna/iterators/predicated_tile_access_iterator_residual_last.h create mode 100644 csrc/include/natten/cuda/fna/iterators/predicated_tile_iterator.h create mode 100644 csrc/include/natten/cuda/fna/iterators/predicated_tile_iterator_residual_last.h create mode 100644 csrc/include/natten/cuda/fna/iterators/transpose_warp_iterator.h create mode 100644 csrc/include/natten/cuda/fna/iterators/warp_iterator_from_smem.h create mode 100644 csrc/include/natten/cuda/fna/kernel_forward.h create mode 100644 csrc/include/natten/cuda/fna/na_utils.cuh create mode 100644 csrc/include/natten/cuda/fna/transform/tile_smem_loader.h delete mode 100644 csrc/include/natten/cuda/gemm/threadblock/default_epilogue_simt.cuh delete mode 100644 csrc/include/natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh create mode 100644 csrc/include/natten/cuda/utils/cuda.h rename csrc/include/natten/cuda/{gemm/utils.cuh => utils/cutlass.h} (97%) create mode 100644 csrc/include/natten/natten.h create mode 100644 docs/README.md create mode 100644 docs/api.md create mode 100644 docs/assets/batched_gemm_na_dark.png create mode 100644 docs/assets/batched_gemm_na_light.png create mode 100644 docs/assets/dilated_neighborhood_attn_2d_vis_dark.png create mode 100644 docs/assets/dilated_neighborhood_attn_2d_vis_light.png create mode 100644 docs/assets/fna_dark.png create mode 100644 docs/assets/fna_light.png create mode 100644 docs/assets/neighborhood_attn_2d_vis_dark.png create mode 100644 docs/assets/neighborhood_attn_2d_vis_light.png create mode 100644 docs/assets/old_natten_dark.png create mode 100644 docs/assets/old_natten_light.png create mode 100644 docs/backend.md create mode 100644 docs/build.md create mode 100644 docs/frontend.md create mode 100644 docs/history.md create mode 100644 docs/install.md create mode 100644 docs/methodology/README.md create mode 100644 docs/methodology/bmm.md create mode 100644 docs/methodology/fused.md create mode 100644 docs/tests.md create mode 100644 scripts/autogen_cuda_fna.py create mode 100644 src/natten/autotuner.py create mode 100644 src/natten/fna.py create mode 100644 src/natten/utils/checks.py create mode 100644 tests/test_fna1d.py create mode 100644 tests/test_fna2d.py create mode 100644 tests/test_fna3d.py rename tools/{profile_2d_with_extra_tokens.py => profile_3d.py} (64%) rename tools/utils/{utils.py => formatting.py} (55%) create mode 100644 tools/utils/mappings.py create mode 100644 tools/utils/na_profiler.py create mode 100644 tools/utils/ops.py create mode 100644 tools/utils/problem.py delete mode 100644 tools/utils/profiler_1d.py delete mode 100644 tools/utils/profiler_2d.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 05b1b96..4128d7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## [Main branch] +* Fused neighborhood attention (FNA) kernels (forward pass only for now) + * 1D, 2D and 3D Neighborhood Attention are supported, + * Causal neighborhood attention is implemented, + * Window (kernel) size, dilation, and causality can be defined *per-axis*, + * All GPU architectures since Maxwell (SM50) are supported, + * SM50 up to SM70 are SIMT-only, but support both FP16 and FP32, + * SM70 and SM75 target Tensor Cores in FP16, and SIMT-style in FP32, + * SM80 and above target Tensor Cores in FP16, BF16, and FP32. + * Relative positional biases are implemented (not defined for causal masking yet), + * Memory layout in FNA is different from existing kernels (`[B, *, heads, dim]` instead of `[B, heads, *, dim]`.) + * Eventually this layout can skip over the permute/explicit reshape step in the attention module following + the QKV projection. +* Naive kernels now implement and allow causal masking, +* Naive kernels (CPU and CUDA) now allow varying parameters (window size, dilation, causal) across axes, +* Major bug fix in Volta GEMM kernels + * The epilogue was different for Volta, and it slipped through unit tests, + * Tests are now more aggressive, and the issue has been fixed. + ## [0.15.1] - 2024-01-24 * Attention tensors can now be views, which allows combining neighborhood and any other attention pattern (i.e. registers, cross attention tokens, and the like) without extra copies. ([#85](https://github.com/SHI-Labs/NATTEN/pull/85) and [#87](https://github.com/SHI-Labs/NATTEN/pull/87)). diff --git a/LICENSE b/LICENSE index 7c099a3..22378b5 100644 --- a/LICENSE +++ b/LICENSE @@ -19,3 +19,37 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Fused Neighborhood Attention kernels are heavily based on the memory-efficient +attention kernels from the xFormers project by Meta Platforms, Inc. + +Copyright (c) Facebook, Inc. and its affiliates + +BSD 3-Clause License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC Laboratories America + and IDIAP Research Institute nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/Makefile b/Makefile index a441400..b3a3e50 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ install: NATTEN_CUDA_ARCH="${CUDA_ARCH}" NATTEN_N_WORKERS="${WORKERS}" NATTEN_VERBOSE="${VERBOSE}" pip install -v -e . 2>&1 | tee install.out test: - pytest -v -x ./tests + PYTORCH_NO_CUDA_MEMORY_CACHING=1 pytest -v -x ./tests style: ufmt format $(check_dirs) diff --git a/README.md b/README.md index b2ab7dd..ea08ee0 100644 --- a/README.md +++ b/README.md @@ -1,325 +1,117 @@ ![NATTENLogo](assets/natten_dark.png#gh-dark-mode-only) ![NATTENLogo](assets/natten_light.png#gh-light-mode-only) +| [Documentation](docs/) *Neighborhood Attention Extension* Bringing attention to a neighborhood near you! +
+ + + Visualization of neighborhood attention in 2D. + + + + Visualization of dilated neighborhood attention in 2D. + +
+ NATTEN is an open-source project dedicated to providing fast implementations for -[Neighborhood Attention](https://scholar.google.com/citations?view_op=view_citation&citation_for_view=Ndu0dUcAAAAJ:b0M2c_1WBrUC), +[Neighborhood Attention](https://openaccess.thecvf.com/content/CVPR2023/html/Hassani_Neighborhood_Attention_Transformer_CVPR_2023_paper.html), a sliding window self-attention mechanism. -If you're not familiar with neighborhood attention, we recommend referring to -[our papers](https://github.com/SHI-Labs/Neighborhood-Attention-Transformer), or watching our +If you're not familiar with neighborhood attention, please refer to +[our papers](https://github.com/SHI-Labs/Neighborhood-Attention-Transformer), or watch our [YouTube video](https://www.youtube.com/watch?v=Ya4BfioxIHA) from CVPR 2023. -NATTEN is primarily a C++/CUDA library, which has so far only supported binding with the torch API, and therefore is mostly -usable through PyTorch. We plan to eliminate the torch dependency in the future and possibly support other frameworks / -engines. - -NATTEN's python interface provides Neighborhood Attention (local attention) -and Dilated Neighborhood Attention -(sparse global attention, a.k.a. dilated local attention) as autograd-compatible PyTorch modules for both 1D, 2D, and 3D data. - -It also has experimental support for -[forward mode automatic differentiation](https://pytorch.org/tutorials/intermediate/forward_ad_usage.html), -and nested tensors. - -## CPU support -Our CPU implementations are very limited and barely performance-optimized. -While we aim to provide the best implementation for different devices, optimizing our CUDA kernels is higher up on the list of -priorities. Contributions are always welcomed. - - -## CUDA support -NATTEN generally supports all architectures supported by PyTorch. More specifically, architectures since Kepler (SM35) are -supported. However, our most-performant kernels only support architectures since Volta, targeting tensor core math. - -### Half-precision support -Devices with compute capability greater than or equal to 6.0 (Pascal and later) allow running in FP16. - -Devices with compute capability greater than or equal to 8.0 (Ampere and later) allow running in BF16. - -### Naive kernels -NATTEN provides more than one set of kernel. Our naive kernels, which were developed during the first phase of the project, -provide a very basic implementation of neighborhood attention, and are the last resort for every problem. This means that if -your device and software support alternatives to our naive kernels (i.e. GEMM kernels), and your problem size is supported, -NATTEN will automatically pick the better kernels for you. (NOTE: this is done based on the class of kernels and not by actual -performance via profiling.) - -Naive kernels are always usable across different architectures, though not the most performant. - -### Tiled kernels -Naive kernels for the 2-dimensional neighborhood attention also come with a tiled implementation for one of the three -underlying operations, which is considerably more performant than the original. However, the tiled kernels only support problem -sizes with head dim 32, and up to kernel size 13x13. -Tiled kernels are also not supported in devices with compute capability smaller than 6.0. - -### GEMM kernels. - -Our GEMM-based kernels depend on and are modeled after -[CUTLASS](https://github.com/NVIDIA/cutlass/)'s [Implicit GEMM](https://github.com/NVIDIA/cutlass/blob/main/media/docs/implicit_gemm_convolution.md) -kernels for convolution. - -Devices with compute capability greater than or equal to 7.0 (Volta, Turing, Ampere, Ada Lovelace, Hopper), can run our GEMM -kernels, which are somewhat performance-optimized, thanks to the underlying mainloop from CUTLASS, and target Tensor Core math. - -However, do note that their current float16/bfloat16 implementations do not typically result in improved latency, -due to a memory alignment issue, which we aim to resolve in future kernels. - -Devices with compute capability greater than or equal to 8.0 (Ampere and later) support GEMM kernels with double, full, and -half precision (FP64, FP32, FP16, BF16). - -Devices with compute capability 7.0 or 7.5 (Volta and Turing) only support GEMM kernels with half precision (FP16). This is -because their tensor cores only allow FP16 math. - -![GEMMvsNaive](assets/gemm_vs_naive.png) - -NOTE: the table presents the average improvement in latency over different problem sizes with full precision (tfloat32). - -### How do I check my compute capability / architecture? -Simple, just Google your GPU model, and check its compute capability. -If you've already set up NATTEN, you could also run: -```python -from natten.functional import get_device_cc - -cc = get_device_cc() -cc = get_device_cc(0) # Optionally select a specific GPU - -print(f"Your device is SM{cc}.") -``` - -### How do I know if I'm using the new kernels? -The new NATTEN library sets up constants that are binded to the python interface, which will allow you to -check whether you've compiled with: a. CUDA, b. Float16 (half) support, c. Bfloat16 support, d. New GEMM kernels. - -```python -import natten - -# Whether NATTEN was built with CUDA kernels, -# and supports running them on this system. -print(natten.has_cuda()) - -# Whether NATTEN supports running float16 on -# the selected device. -print(natten.has_half()) -print(natten.has_half(0)) # Optionally specify a GPU index. - -# Whether NATTEN supports running bfloat16 on -# the selected device. -print(natten.has_bfloat()) -print(natten.has_bfloat(0)) # Optionally specify a GPU index. - -# Whether NATTEN supports running GEMM kernels -# on the selected device. -print(natten.has_gemm()) -print(natten.has_gemm(0)) # Optionally specify a GPU index. - -# Whether NATTEN supports running GEMM kernels -# in full precision on the selected device. -print(natten.has_fp32_gemm()) -print(natten.has_fp32_gemm(0)) # Optionally specify a GPU index. -``` - -If `natten.has_gemm()` returns true, by default NATTEN will call the faster GEMM kernels instead of the original naive kernels -for both NA1D and NA2D. 3D Neighborhood attention is not supported at this time, but you can still use the naive kernels. - -In addition, we will be adding scripts that allow you to profile and observe latency from the kernels with those options -available. - -## About NATTEN -Sliding window self attention mechanisms have been relatively overlooked, in part due to implementation difficulties. -For example, in a paper proposing one of the earliest examples of such methods, -[SASA](https://proceedings.neurips.cc/paper/2019/file/3416a75f4cea9109507cacd8e2f2aefc-Paper.pdf), -it was noted that -although such methods are theoretically efficient, they're relatively slow in practice, compared to convolutions, -which have been implemented in most well-known deep learning libraries. - -That is why we started developing NATTEN, an extension to existing libraries with efficient implementations of sliding window -attention mechanisms, which will enable research in this direction including building powerful hierarchical vision -transformers. - -For more information, we highly recommend reading our preprints [NAT](https://arxiv.org/abs/2204.07143) and -[DiNAT](https://arxiv.org/abs/2209.15001), and check out their [repository](https://github.com/SHI-Labs/Neighborhood-Attention-Transformer). - -## Requirements - -* python >= 3.8 -* torch >= 2.0 +## Getting started -NATTEN supports PyTorch version 2.0 and later, and Python versions 3.7, 3.8, 3.9, 3.10(only torch >= 1.11), and 3.11 (only torch >= 1.13). +NATTEN supports PyTorch version 2.0 and later, and Python versions 3.8 and above. +Python 3.12 is only supported with torch >= 2.2.0. Older NATTEN releases supported python >= 3.7 and torch >= 1.8. -**NOTE:** NATTEN only comes with pre-built Linux wheels, and supports Kepler and above (`SM >= 35`). -Make sure your GPU is supported by referring to -[this webpage](https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/). -Future versions will extend support to older GPUs. - -## Getting started - -### Linux -Just refer to our website, [shi-labs.com/natten](https://www.shi-labs.com/natten/), select your PyTorch version and the CUDA -version it was compiled with, copy-paste the command and install in seconds! - -For example, if you're on `torch==2.0.0+cu118`, you should install NATTEN using the following wheel: -```bash -pip3 install natten -f https://shi-labs.com/natten/wheels/cu118/torch2.0.0/index.html -``` - -More generally: -```bash -pip3 install natten -f https://shi-labs.com/natten/wheels/{cu_version}/torch{torch_version}/index.html -``` - -**NOTE:** If you do not specify a wheel URL, pip will collect NATTEN and try to compile on locally, which depending -on your system might take up to 30 minutes. -We strongly recommend using our website if you're a Linux user. - -### Mac -Unfortunately we are not yet able to build Mac wheels (and do not yet have a Metal backend). However, you can compile upon -installing and use the CPU kernels: - -```bash -pip3 install natten -``` - -### Windows -The current release has not been successfully built Windows devices with CUDA, and therefore does not yet have Windows wheels. -If you are a windows user willing to help us figure out building with MSVC, please contact us or open an issue. - -### Build from source -Once you've set up your Python environment and installed PyTorch with CUDA, simply clone and build: - -```bash -git clone https://github.com/SHI-Labs/NATTEN -cd NATTEN - -pip install -r requirements.txt - -make -``` - -NOTE: NATTEN will use the PyTorch API to detect your GPU architecture, and will by default attempt to use 1/4th of the number -of processes your system allows to build. You can override them by passing in the following arguments: -```bash -# Build with 2 workers/processes -make WORKERS=2 - -# Build targeting SM89 (Ada Lovelace) -make CUDA_ARCH="8.9" -``` - -Please also note that building with the latest GEMM kernels can be a bit time consuming, which means at least 10 - 20 minutes -given that you use enough workers. It is technically possible to improve build time by generating more source files and using -more workers (at the expense of generating a larger binary), but that option will be made available in the future. - -#### Optional: run unit tests -You can optionally run unit tests to verify building from source finished successfully: - -```bash -make test -``` - - -## Catalog -- [x] Neighborhood Attention 1D (CPU, naive) -- [x] Neighborhood Attention 2D (CPU, naive) -- [x] Neighborhood Attention 3D (CPU, naive) -- [x] Neighborhood Attention 1D (CUDA, naive) -- [x] Neighborhood Attention 2D (CUDA, naive) -- [x] Neighborhood Attention 3D (CUDA, naive) -- [x] Neighborhood Attention 1D (CUDA, gemm-based, SM70 and above) -- [x] Neighborhood Attention 2D (CUDA, gemm-based, SM70 and above) -- [x] Dilation support -- [x] Float16 support -- [x] BFloat16 support -- [x] Kepler and Maxwell (30<=SM<60) support -- [ ] Windows builds -- [ ] Neighborhood Attention 1D (CUDA, fused kernels) -- [ ] Neighborhood Attention 2D (CUDA, fused kernels) - -## Usage -Simply import `NeighborhoodAttention1D`, `NeighborhoodAttention2D`, or `NeighborhoodAttention3D` from `natten`: -```python -from natten import NeighborhoodAttention1D -from natten import NeighborhoodAttention2D -from natten import NeighborhoodAttention3D - -na1d = NeighborhoodAttention1D(dim=128, kernel_size=7, dilation=2, num_heads=4) -na2d = NeighborhoodAttention2D(dim=128, kernel_size=7, dilation=2, num_heads=4) -na3d = NeighborhoodAttention3D(dim=128, kernel_size=7, dilation=2, num_heads=4) -``` - -NA3D also supports different kernel size and dilation values for depth: -```python -na3d = NeighborhoodAttention3D( - dim=128, - kernel_size=7, - kernel_size_d=5, - dilation=2, - dilation_d=3, - num_heads=4) -``` - -Modules expect inputs of shape `[batch_size, *, dim]`: -* NA1D: `[batch_size, sequence_length, dim]` -* NA2D: `[batch_size, height, width, dim]` -* NA3D: `[batch_size, depth, height, width, dim]` - - -### FLOPs -We recommend counting flops through [fvcore](https://github.com/facebookresearch/fvcore). - -```shell -pip install fvcore -``` - -Once you have fvcore installed, you can directly use our dedicated FLOP counter: -```python -from natten.flops import get_flops - -flops = get_flops(model, input) -``` - -Alternatively, if you are using fvcore's `FlopCountAnalysis` directly, be sure to add our op handles: -```python -from fvcore.nn import FlopCountAnalysis -from natten.flops import add_natten_handle - -# ... - -flop_ctr = FlopCountAnalysis(model, input) -flop_ctr = add_natten_handle(flop_ctr) - -# ... -``` +Please refer to [install instructions](docs/install.md) to find out whether your operating system and hardware accelerator is +compatible with NATTEN. + +## Feature availability + +| Problem space | CPU backend | CUDA backend | +| ----------- | ----------- | ---------------- | +| 1D | naive | naive, gemm, fna | +| 2D | naive | naive, gemm, fna | +| 3D | naive | naive, fna | + +### CPU + +| Problem space | CPU Backend | Causal masking | Varying parameters | Relative positional bias | Autograd support | +| ----------- | ----------- | ------------------ | ------------------ | ------------------------ | ------------------------ | +| 1D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | +| 2D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | +| 3D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | + +Notes: +* Forward mode autograd does not support relative positional biases and causal masking yet. +* Relative positional biases are not yet supported when any axis has causal masking enabled. + +### CUDA + +| Problem space | CUDA Backend | Causal masking | Varying parameters | Relative positional bias | Autograd support | Min. Arch | +| ----------- | ----------- | ------------------ | ------------------ | ------------------------ | ------------------------ | --------- | +| 1D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | SM35 | +| 2D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | SM35 | +| 3D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | SM35 | +| 1D | gemm | | | :white_check_mark: | Forward and reverse mode | SM70 | +| 2D | gemm | | | :white_check_mark: | Forward and reverse mode | SM70 | +| 1D | fna | :white_check_mark: | :white_check_mark: | :white_check_mark: | Coming soon | SM50 | +| 2D | fna | :white_check_mark: | :white_check_mark: | :white_check_mark: | Coming soon | SM50 | +| 3D | fna | :white_check_mark: | :white_check_mark: | :white_check_mark: | Coming soon | SM50 | + +Notes: +* FP16 kernels are only available on SM50 and above, and BF16 requires SM80 and above. +* GEMM backend on SM70 and SM75 can only do FP16. +* Tiled only implements 1/3 of the ops, is only implemented for 2D problems, and requires head dim = 32. +* Forward mode autograd does not support relative positional biases and causal masking yet. +* Relative positional biases are not yet supported when any axis has causal masking enabled. +* Naive backend allows FP16 for SM50 and above only. FP32/FP64 are available for SM35 and above. ## License NATTEN is released under the [MIT License](LICENSE). ## Citation ```bibtex +@misc{hassani2024faster, + title = {Faster Neighborhood Attention: Reducing the O(n^2) Cost of Self Attention at the Threadblock Level}, + author = {Ali Hassani and Wen-Mei Hwu and Humphrey Shi}, + year = 2024, + url = {https://arxiv.org/abs/2403.04690}, + eprint = {2403.04690}, + archiveprefix = {arXiv}, + primaryclass = {cs.CV} +} @inproceedings{hassani2023neighborhood, - title = {Neighborhood Attention Transformer}, - author = {Ali Hassani and Steven Walton and Jiachen Li and Shen Li and Humphrey Shi}, - year = 2023, - booktitle = {IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)} + title = {Neighborhood Attention Transformer}, + author = {Ali Hassani and Steven Walton and Jiachen Li and Shen Li and Humphrey Shi}, + year = 2023, + booktitle = {IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)} } -@article{hassani2022dilated, - title = {Dilated Neighborhood Attention Transformer}, - author = {Ali Hassani and Humphrey Shi}, - year = 2022, - url = {https://arxiv.org/abs/2209.15001}, - eprint = {2209.15001}, - archiveprefix = {arXiv}, - primaryclass = {cs.CV} +@misc{hassani2022dilated, + title = {Dilated Neighborhood Attention Transformer}, + author = {Ali Hassani and Humphrey Shi}, + year = 2022, + url = {https://arxiv.org/abs/2209.15001}, + eprint = {2209.15001}, + archiveprefix = {arXiv}, + primaryclass = {cs.CV} } ``` ## Acknowledgements -We would like to thank NVIDIA, and the [CUTLASS project](https://github.com/NVIDIA/cutlass/) and team for their efforts in +We thank NVIDIA, and the [CUTLASS project](https://github.com/NVIDIA/cutlass/) and team for their efforts in creating and open-sourcing CUTLASS. We would also like to thank Haicheng Wu for his valuable feedback and comments which led to -the creation of Implicit GEMM NA. -We also thank Meta, and the [PyTorch](https://github.com/pytorch/pytorch/) project and team. +the creation of GEMM-based NA. +We also thank Meta and the [xFormers](https://github.com/facebookresearch/xformers/) team +for their FMHA kernel, which is what our Fused Neighborhood Attention kernel is based on. +We thank the [PyTorch](https://github.com/pytorch/pytorch/) project and team. diff --git a/assets/README_pypi.md b/assets/README_pypi.md index 1182a1a..5cf06f1 100644 --- a/assets/README_pypi.md +++ b/assets/README_pypi.md @@ -10,307 +10,87 @@ NATTEN is an open-source project dedicated to providing fast implementations for [Neighborhood Attention](https://scholar.google.com/citations?view_op=view_citation&citation_for_view=Ndu0dUcAAAAJ:b0M2c_1WBrUC), a sliding window self-attention mechanism. -If you're not familiar with neighborhood attention, we recommend referring to -[our papers](https://github.com/SHI-Labs/Neighborhood-Attention-Transformer), or watching our +If you're not familiar with neighborhood attention, please refer to +[our papers](https://github.com/SHI-Labs/Neighborhood-Attention-Transformer), or watch our [YouTube video](https://www.youtube.com/watch?v=Ya4BfioxIHA) from CVPR 2023. -NATTEN is primarily a C++/CUDA library, which has so far only supported binding with the torch API, and therefore is mostly -usable through PyTorch. We plan to eliminate the torch dependency in the future and possibly support other frameworks / -engines. - -NATTEN's python interface provides Neighborhood Attention (local attention) -and Dilated Neighborhood Attention -(sparse global attention, a.k.a. dilated local attention) as autograd-compatible PyTorch modules for both 1D, 2D, and 3D data. - -It also has experimental support for -[forward mode automatic differentiation](https://pytorch.org/tutorials/intermediate/forward_ad_usage.html), -and nested tensors. - -## CPU support -Our CPU implementations are very limited and barely performance-optimized. -While we aim to provide the best implementation for different devices, optimizing our CUDA kernels is higher up on the list of -priorities. Contributions are always welcomed. - - -## CUDA support -NATTEN generally supports all architectures supported by PyTorch. More specifically, architectures since Kepler (SM35) are -supported. However, our most-performant kernels only support architectures since Volta, targeting tensor core math. - -### Half-precision support -Devices with compute capability greater than or equal to 6.0 (Pascal and later) allow running in FP16. - -Devices with compute capability greater than or equal to 8.0 (Ampere and later) allow running in BF16. - -### Naive kernels -NATTEN provides more than one set of kernel. Our naive kernels, which were developed during the first phase of the project, -provide a very basic implementation of neighborhood attention, and are the last resort for every problem. This means that if -your device and software support alternatives to our naive kernels (i.e. GEMM kernels), and your problem size is supported, -NATTEN will automatically pick the better kernels for you. (NOTE: this is done based on the class of kernels and not by actual -performance via profiling.) - -Naive kernels are always usable across different architectures, though not the most performant. - -### Tiled kernels -Naive kernels for the 2-dimensional neighborhood attention also come with a tiled implementation for one of the three -underlying operations, which is considerably more performant than the original. However, the tiled kernels only support problem -sizes with head dim 32, and up to kernel size 13x13. -Tiled kernels are also not supported in devices with compute capability smaller than 6.0. - -### GEMM kernels. - -Our GEMM-based kernels depend on and are modeled after -[CUTLASS](https://github.com/NVIDIA/cutlass/)'s [Implicit GEMM](https://github.com/NVIDIA/cutlass/blob/main/media/docs/implicit_gemm_convolution.md) -kernels for convolution. - -Devices with compute capability greater than or equal to 7.0 (Volta, Turing, Ampere, Ada Lovelace, Hopper), can run our GEMM -kernels, which are somewhat performance-optimized, thanks to the underlying mainloop from CUTLASS, and target Tensor Core math. - -However, do note that their current float16/bfloat16 implementations do not typically result in improved latency, -due to a memory alignment issue, which we aim to resolve in future kernels. - -Devices with compute capability greater than or equal to 8.0 (Ampere and later) support GEMM kernels with double, full, and -half precision (FP64, FP32, FP16, BF16). - -Devices with compute capability 7.0 or 7.5 (Volta and Turing) only support GEMM kernels with half precision (FP16). This is -because their tensor cores only allow FP16 math. - - -### How do I check my compute capability / architecture? -Simple, just Google your GPU model, and check its compute capability. -If you've already set up NATTEN, you could also run: -```python -from natten.functional import get_device_cc - -cc = get_device_cc() -cc = get_device_cc(0) # Optionally select a specific GPU - -print(f"Your device is SM{cc}.") -``` - -### How do I know if I'm using the new kernels? -The new NATTEN library sets up constants that are binded to the python interface, which will allow you to -check whether you've compiled with: a. CUDA, b. Float16 (half) support, c. Bfloat16 support, d. New GEMM kernels. - -```python -import natten - -# Whether NATTEN was built with CUDA kernels, -# and supports running them on this system. -print(natten.has_cuda()) - -# Whether NATTEN supports running float16 on -# the selected device. -print(natten.has_half()) -print(natten.has_half(0)) # Optionally specify a GPU index. - -# Whether NATTEN supports running bfloat16 on -# the selected device. -print(natten.has_bfloat()) -print(natten.has_bfloat(0)) # Optionally specify a GPU index. - -# Whether NATTEN supports running GEMM kernels -# on the selected device. -print(natten.has_gemm()) -print(natten.has_gemm(0)) # Optionally specify a GPU index. - -# Whether NATTEN supports running GEMM kernels -# in full precision on the selected device. -print(natten.has_fp32_gemm()) -print(natten.has_fp32_gemm(0)) # Optionally specify a GPU index. -``` - -If `natten.has_gemm()` returns true, by default NATTEN will call the faster GEMM kernels instead of the original naive kernels -for both NA1D and NA2D. 3D Neighborhood attention is not supported at this time, but you can still use the naive kernels. - -In addition, we will be adding scripts that allow you to profile and observe latency from the kernels with those options -available. - -## About NATTEN -Sliding window self attention mechanisms have been relatively overlooked, in part due to implementation difficulties. -For example, in a paper proposing one of the earliest examples of such methods, -[SASA](https://proceedings.neurips.cc/paper/2019/file/3416a75f4cea9109507cacd8e2f2aefc-Paper.pdf), -it was noted that -although such methods are theoretically efficient, they're relatively slow in practice, compared to convolutions, -which have been implemented in most well-known deep learning libraries. - -That is why we started developing NATTEN, an extension to existing libraries with efficient implementations of sliding window -attention mechanisms, which will enable research in this direction including building powerful hierarchical vision -transformers. - -For more information, we highly recommend reading our preprints [NAT](https://arxiv.org/abs/2204.07143) and -[DiNAT](https://arxiv.org/abs/2209.15001), and check out their [repository](https://github.com/SHI-Labs/Neighborhood-Attention-Transformer). - -## Requirements - -* python >= 3.8 -* torch >= 2.0 +## Getting started -NATTEN supports PyTorch version 2.0 and later, and Python versions 3.7, 3.8, 3.9, 3.10(only torch >= 1.11), and 3.11 (only torch >= 1.13). +NATTEN supports PyTorch version 2.0 and later, and Python versions 3.8 and above. +Python 3.12 is only supported with torch >= 2.2.0. Older NATTEN releases supported python >= 3.7 and torch >= 1.8. -**NOTE:** NATTEN only comes with pre-built Linux wheels, and supports Kepler and above (`SM >= 35`). -Make sure your GPU is supported by referring to -[this webpage](https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/). -Future versions will extend support to older GPUs. - -## Getting started - -### Linux -Just refer to our website, [shi-labs.com/natten](https://www.shi-labs.com/natten/), select your PyTorch version and the CUDA -version it was compiled with, copy-paste the command and install in seconds! - -For example, if you're on `torch==2.0.0+cu118`, you should install NATTEN using the following wheel: -```bash -pip3 install natten -f https://shi-labs.com/natten/wheels/cu118/torch2.0.0/index.html -``` - -More generally: -```bash -pip3 install natten -f https://shi-labs.com/natten/wheels/{cu_version}/torch{torch_version}/index.html -``` - -**NOTE:** If you do not specify a wheel URL, pip will collect NATTEN and try to compile on locally, which depending -on your system might take up to 30 minutes. -We strongly recommend using our website if you're a Linux user. - -### Mac -Unfortunately we are not yet able to build Mac wheels (and do not yet have a Metal backend). However, you can compile upon -installing and use the CPU kernels: - -```bash -pip3 install natten -``` - -### Windows -The current release has not been successfully built Windows devices with CUDA, and therefore does not yet have Windows wheels. -If you are a windows user willing to help us figure out building with MSVC, please contact us or open an issue. - -### Build from source -Once you've set up your Python environment and installed PyTorch with CUDA, simply clone and build: - -```bash -git clone https://github.com/SHI-Labs/NATTEN -cd NATTEN - -pip install -r requirements.txt - -make -``` - -NOTE: NATTEN will use the PyTorch API to detect your GPU architecture, and will by default attempt to use 1/4th of the number -of processes your system allows to build. You can override them by passing in the following arguments: -```bash -# Build with 2 workers/processes -make WORKERS=2 - -# Build targeting SM89 (Ada Lovelace) -make CUDA_ARCH="8.9" -``` - -Please also note that building with the latest GEMM kernels can be a bit time consuming, which means at least 10 - 20 minutes -given that you use enough workers. It is technically possible to improve build time by generating more source files and using -more workers (at the expense of generating a larger binary), but that option will be made available in the future. - -#### Optional: run unit tests -You can optionally run unit tests to verify building from source finished successfully: - -```bash -make test -``` - - -## Catalog -- [x] Neighborhood Attention 1D (CPU, naive) -- [x] Neighborhood Attention 2D (CPU, naive) -- [x] Neighborhood Attention 3D (CPU, naive) -- [x] Neighborhood Attention 1D (CUDA, naive) -- [x] Neighborhood Attention 2D (CUDA, naive) -- [x] Neighborhood Attention 3D (CUDA, naive) -- [x] Neighborhood Attention 1D (CUDA, gemm-based, SM70 and above) -- [x] Neighborhood Attention 2D (CUDA, gemm-based, SM70 and above) -- [x] Dilation support -- [x] Float16 support -- [x] BFloat16 support -- [x] Kepler and Maxwell (30<=SM<60) support -- [ ] Windows builds -- [ ] Neighborhood Attention 1D (CUDA, fused kernels) -- [ ] Neighborhood Attention 2D (CUDA, fused kernels) - -## Usage -Simply import `NeighborhoodAttention1D`, `NeighborhoodAttention2D`, or `NeighborhoodAttention3D` from `natten`: -```python -from natten import NeighborhoodAttention1D -from natten import NeighborhoodAttention2D -from natten import NeighborhoodAttention3D - -na1d = NeighborhoodAttention1D(dim=128, kernel_size=7, dilation=2, num_heads=4) -na2d = NeighborhoodAttention2D(dim=128, kernel_size=7, dilation=2, num_heads=4) -na3d = NeighborhoodAttention3D(dim=128, kernel_size=7, dilation=2, num_heads=4) -``` - -NA3D also supports different kernel size and dilation values for depth: -```python -na3d = NeighborhoodAttention3D( - dim=128, - kernel_size=7, - kernel_size_d=5, - dilation=2, - dilation_d=3, - num_heads=4) -``` - -Modules expect inputs of shape `[batch_size, *, dim]`: -* NA1D: `[batch_size, sequence_length, dim]` -* NA2D: `[batch_size, height, width, dim]` -* NA3D: `[batch_size, depth, height, width, dim]` - - -### FLOPs -We recommend counting flops through [fvcore](https://github.com/facebookresearch/fvcore). - -```shell -pip install fvcore -``` - -Once you have fvcore installed, you can directly use our dedicated FLOP counter: -```python -from natten.flops import get_flops - -flops = get_flops(model, input) -``` - -Alternatively, if you are using fvcore's `FlopCountAnalysis` directly, be sure to add our op handles: -```python -from fvcore.nn import FlopCountAnalysis -from natten.flops import add_natten_handle - -# ... - -flop_ctr = FlopCountAnalysis(model, input) -flop_ctr = add_natten_handle(flop_ctr) - -# ... -``` +Please refer to [install instructions](docs/install.md) to find out whether your operating system and hardware accelerator is +compatible with NATTEN. + +## Feature availability + +| Problem space | CPU backend | CUDA backend | +| ----------- | ----------- | ---------------- | +| 1D | naive | naive, gemm, fna | +| 2D | naive | naive, gemm, fna | +| 3D | naive | naive, fna | + +### CPU + +| Problem space | CPU Backend | Causal masking | Varying parameters | Relative positional bias | Autograd support | +| ----------- | ----------- | ------------------ | ------------------ | ------------------------ | ------------------------ | +| 1D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | +| 2D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | +| 3D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | + +Notes: +* Forward mode autograd does not support relative positional biases and causal masking yet. +* Relative positional biases are not yet supported when any axis has causal masking enabled. + +### CUDA + +| Problem space | CUDA Backend | Causal masking | Varying parameters | Relative positional bias | Autograd support | Min. Arch | +| ----------- | ----------- | ------------------ | ------------------ | ------------------------ | ------------------------ | --------- | +| 1D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | SM35 | +| 2D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | SM35 | +| 3D | naive | :white_check_mark: | :white_check_mark: | :white_check_mark: | Forward and reverse mode | SM35 | +| 1D | gemm | | | :white_check_mark: | Forward and reverse mode | SM70 | +| 2D | gemm | | | :white_check_mark: | Forward and reverse mode | SM70 | +| 1D | fna | :white_check_mark: | :white_check_mark: | :white_check_mark: | Coming soon | SM50 | +| 2D | fna | :white_check_mark: | :white_check_mark: | :white_check_mark: | Coming soon | SM50 | +| 3D | fna | :white_check_mark: | :white_check_mark: | :white_check_mark: | Coming soon | SM50 | + +Notes: +* FP16 kernels are only available on SM50 and above, and BF16 requires SM80 and above. +* GEMM backend on SM70 and SM75 can only do FP16. +* Tiled only implements 1/3 of the ops, is only implemented for 2D problems, and requires head dim = 32. +* Forward mode autograd does not support relative positional biases and causal masking yet. +* Relative positional biases are not yet supported when any axis has causal masking enabled. +* Naive backend allows FP16 for SM50 and above only. FP32/FP64 are available for SM35 and above. ## License -NATTEN is released under the [MIT License](https://github.com/SHI-Labs/NATTEN/blob/main/LICENSE). +NATTEN is released under the [MIT License](LICENSE). ## Citation ```bibtex @inproceedings{hassani2023neighborhood, - title = {Neighborhood Attention Transformer}, - author = {Ali Hassani and Steven Walton and Jiachen Li and Shen Li and Humphrey Shi}, - year = 2023, - booktitle = {IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)} + title = {Neighborhood Attention Transformer}, + author = {Ali Hassani and Steven Walton and Jiachen Li and Shen Li and Humphrey Shi}, + year = 2023, + booktitle = {IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)} } @article{hassani2022dilated, - title = {Dilated Neighborhood Attention Transformer}, - author = {Ali Hassani and Humphrey Shi}, - year = 2022, - url = {https://arxiv.org/abs/2209.15001}, - eprint = {2209.15001}, - archiveprefix = {arXiv}, - primaryclass = {cs.CV} + title = {Dilated Neighborhood Attention Transformer}, + author = {Ali Hassani and Humphrey Shi}, + year = 2022, + url = {https://arxiv.org/abs/2209.15001}, + eprint = {2209.15001}, + archiveprefix = {arXiv}, + primaryclass = {cs.CV} } ``` + +## Acknowledgements +We thank NVIDIA, and the [CUTLASS project](https://github.com/NVIDIA/cutlass/) and team for their efforts in +creating and open-sourcing CUTLASS. We would also like to thank Haicheng Wu for his valuable feedback and comments which led to +the creation of GEMM-based NA. +We also thank Meta and the [xFormers](https://github.com/facebookresearch/xformers/) team +for their FMHA kernel, which is what our Fused Neighborhood Attention kernel is based on. +We thank the [PyTorch](https://github.com/pytorch/pytorch/) project and team. diff --git a/assets/cudamemory_dark.png b/assets/cudamemory_dark.png deleted file mode 100644 index 16337355b3606b3ad617c5c221c45b10ebd125cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172479 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 *->=LK; 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 diff --git a/assets/cudamemory_light.png b/assets/cudamemory_light.png deleted file mode 100644 index fab26237afd20763c72329ff14b1bc4e37e073bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162966 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%0D-0@c_|AScb7tMDFPfQC{8`Y z6FbwH;$cKR4QCqV4NmD;T)Bh|MVALNzxE((sZX_YcY1l%RIfBn$jK}ZL%EUD^FbwxVK&P?{X1p@1q5WSHg3mM#lZNbBh zfXTA3x3@A`+9wy8?W?xXYeR&6uvWZFi+Yx*XYH|IAaIcUeE=Cl(KZ=E2gxi12Iwg= zk)K1ysVqlG&|Vl$;~VeJ_OEl!8Ad{Uw|^S@8NWI!!5<^h7Ns+Hu2*YP?wroWm>ZLc zuZ5H_NiXko=gxn-O3XHtAk*8IY?xy?PQ;UG8^PK{G|d4*x~jE=WmFPE z^1%^9E3Kidj3r1NFS_;zv@e`KDaKN4@AApY9307c5=Ey)=d3r=X_vYzV6ARA*@>Wv zYT7s|Zn)EnT}eZ$&Vr4DG2z=>TwG_Z!b3QJtQx${;OrE9sWf^dwLY#b|8HtW&U$sy z7=P0gT6*jfhTRA?v0V9<%3c9v6wp2^rIV6fr4E~_ZFf@0(P>otgbo^;N~nTKJ)2T` z%4{y?eLiCW&f-^N>HB00U!A?%-j%gtW86H^O_ZGfibMxlqUzmsL+BkKWXIQ>^>6p% zg^d_1CCi{*>zpU0C0ey-TM~w1HE?Xqd3eJjYhkl-Y&K{8t#NRuht6nWsmiRVD=YBy z0BnGDue4g!5lALpNSB=60Q5d}f)R)C80O^p8fdvRpGU9dg}GLlvcYw2H0|kQAhdnC zasySeI zt`F}(yn0@FJ zJQ2>3N2UoM(VyaAI{0JLi%5mB28eR@$@%CWSDnS&1BQ^yvMZ zy&hRIi9oSphK{M?X+y$d9lFR{KH$%NeX*Z-fmKy0EhY&O5I&j7Bf-?`kFlecak?(ss5CD@1hs zR9{-Mz6e@H^(!>RS>~*dYmoQ9OOVlQAI0>k5qTBQhJD2B9}v6<+6rF7D+jM^L~K{L z?8@S#kRm(5K=b3Z#qPA6_4y(ElLFiL{onngI|yHQ7vG^?nz2M6TmqdY@HXbtN;1Nz zZq#YP5VD~>nMe^O0{G-fq$6_X8Pg%{V?Kn`ltW8Tn~C3laPznHW0ll>Ojk@MruwFG!;-VSfVf?lFf_ zlMsQRcC1oc=#9x~K(m0Ec0DVPYu#I*53g!RwBt!Eprqpcg^sZgw0GHLEM)`=2h>&3 zb=n9`(luv8M_U-B==LW*>zfkd!W6g6#^5x2r|Xi zLT=JJ5w!|INiZ2w``7cdld!EHl=C9Pj^)xY;977nE0RvTmoTkg!>CD9ne1O@c6Tf5 zbb<%mc4nNiH{;nxWWVs?jMx2_;Zt!1i6IJL^s00pb#M}rRVoUmg_-)$`v!J)nins5AL%~rgNuu^HhG8o)$LLsCdHFOLt%J+^eoWej#ZGMGL2^2jV zU*`ehDdD0^9#Dx0`u@lUNKs zksNH6_Q3H~ ztQ9vIsCuQw4zco&L?sx7 zp86l_qD?!4o(lKCM9|+-$Ux8DszriOU5HvGM5@qp%u}<27;&)1u}zz1XuOR&0B1%U zZ#Q)K>nWBwp3ov{uZfWW1At$pAA9}N0xzz1E36apGpm)P%1q1fVvj>Fm9aB4(3wXT z$FM;E#xYR#`Z9jTKSPHc1bnozqiSyLV@32Y!TS@WNu<5}ifFJx&Hm}eDj2azz0j!7 zmkzwkX2q85JR~w*Js1vl$BvE8 zJ=M1q#X@qYs|C9AinUGTH#c7o0Q&sd8~f22?`lL0uQL^{<(@Aj`x%x_c$=YDSXr&@ z-q=)*$-_&f9dk1S)3$xyRNo5m1y)Os31_kHf^AUu#iX>@vve9R`w8U$oHBveV%JHl zF1H6(?&`nKbpRKauhH>;%>Hf!J*Cft%$T&LKTyK^8(_Je1k_5pNJ2|9GCC`KtP%Vs z!w{0Nq?R5|=K;eCXlgVPYv&UpZ~s!~2Po&&$8=-P(&H|ZAy1f^=lP1<7!+&K6SlaXiKyeJ2xnPxwUrqkZ5g4|$OJ2Q6S(81uO{2@M}tVfpDp;2{% z$mJD}FlI@c_rr;)2`e-7E2dHqgaY*Bl$x_N*&HoQ^;e#Kt)(>k zq*0N32xqhOZkek!3|x*9Op?J7RDF7n9^7CIbQ8TU@2=v}#XVfloWuY1EoV69j(F}u zd{QjJ53P=TW?cp&v`d?cWIck}oZat;Ky-LZb$X#eKR57qCswcUTdW9Y&AljY7lcSJ z9iXf&mh5;jAy3&P@b1Y!v9jvhEeP7!RR58#!AqKjOhtcMR|^=Nm7qHNlS1B{gaum4 zIZph=-TPy^aMIz2WP4YqMw=ImP=FA$2%x4$B)n>}vrktV?qc*7UT1p87wh7nmP@j` zC>GECZ^ZN1OpLk8h$t4JGW^eDBqNzaKbkkaP@LszPlh?K(q#>VFXWeNiyjT%xWAHv zKaj}h-s^lJy#YpE=Fx#eDqzLh1MCX;w^RtF#8I_O>|hz~q9!hQeyb!jxTB4ZJUQ(1 zkj)8Po)5*#eB-mI&xKh9QVn-pEb-cPmCk|nz|rywH(5{(JB4$PzPC)fUmO&Cm%zYj zEUgJp$fg;Akg#_&{6`d*?gu)6Ll<+_VMcF z+swyVALCsN@|Tgtt>oPMpV|x#rwbSe_ktgQqUuZrmo{I2^&J!R?gbm-44G$)w;6Z{ z{LaLx2LB~sH3EQ8Izg>6z|A0iWDdupr9n-?+-JllQekqSf-K77N_iM3K&zsm64Iz) zv(19^!I1@lZ-Ic;G2X>i5Bkzt)X+i9A%oVujjTpF&~Z%_#7-uNV_)Myjx)!O3fce7 zSe7Zar}a@B;Pu9(bLi#vrQs28ca{t+WCvX)%^po9`}6|(23{O=tk_ssv~7t?gn58=GlJ3rl!4w@JvxeJmrBdak*Y+8`hYq! z#8W)XmiC&nXNJ2bojtIDgirsM-U8tpaIlg?=JW ztL%!Eaxk5Trr~Gomi?CSGmwnHn=hrC-9lGv*&pan9fkN7iK2%7NJh*5rODoAVnShz zpzJ3zbxHw&QthwdW2t&+fiG84kqO+tD>xbQfWH-#-~@O z78Y{MR{0|q_^*|8L8BH1-ft0QbGR4J>%1k3l4+j3y0wIJ-44+CK$Ru!3?OqT^ zr>#SZ(dCH3wHFYKL?!f=N8_Ms?@DDI(5k9J==u*72b#LI>P70AUyyzhW&9em&DOHqyiF7TI*ux(?UaM@gEAymhygTgcdpI@waP)Q zHTC#id;O95_pb5&a8DG)H1j=;Y8Xfy6&hj!C}e5wQ1|k=N|W~ck8W=F$diJa zok^wER7hXp15a8ocY(YEP`;4ZWxdsQSK^LoW@ceG`d-Ew#+JT(mlJW*A1rMw61cl+ zMpI)|W(hg#19hzqn>lp`_HmQ3tS&=af}&RF3Lm>83m(h~6gprlL)HGsSvNNnO{;RU4CguvvRYU>#u;?+?7A8* zU&LR#zQ#BE!tT_#;#GbFlL_WG)PMMX>vyE$k-dwsTxt`CIe5#ZX8b!U<ihnc`rNdfg4nvoig73mE@3!DL?PmPx?YrnGG~<_O*1tr8dfDQp1g#!IlHV zsYI3857Q1!n9Laih!zWMiF*HhTcoNhaDsurifQp|;5Sv42RCGmw`sgz{pa0*fhx6w zqaI5p?!9pajCMAnWT)#)U#&54I8{srglq2qe&&&m&>xCtuPOCe? zhQgxc8ND zFz2n1JI32xC7~6F>Attw>!gylHwY;NdLk9#C)6Xc((IcW8?%kWC zqJU=ALZeFB+NELE@u9X^AxSDM@#qKm9DEcrctsX;5ABho9ry*MGuH45s#01dY)kFS zK;lsdgy6$ z(<*DA_1YO81K3nJZs>{VZ9bpgle^%#ee^m~WSD?P2-<4-8^VJSn%NQbNIimkuYB5U zht5RZ<{5ygC90{zb=*q0**1D6Q!Dp6la`7E7|(-$9-IT{$-NJ`?x9n~QsEyK^TKou zj0erPZ~}n@S;kvK+`%0qZS6;6_`OHXC@zAMA5K-Te1VfAJKt{POm(kfmf-Y(P#Mj=->~F-;3hEwfWt zMe)k~R6dP#n zcuPq&U~r4^(f-pWhd5I&wRQ<96Nyh;xfh^(h+=P>MD_TdNL%YGCV^m+Q5n-30(jM|0jkyKUX*;B^Bepv2BT529494k5~PkLzvZ0U`ue9(xdZS2$=FzmBtX~MgZ zxSOsKs3tHY4+u8&oi-5sQ%-zSUS-y+SR_zQ>U^ufu=+wMZHRh0#04s+(;leP;!r8w zC{0qxUdY;5uJh-kEk{o((Fs=fqSdcM=U@>fJ4PP+Vt{farU#>XA~h!!Ifije3v^#r zA3DlW`$osn%bi82`sLhQ;{^653ubRWz#~b2*)o|x`byL`R&PK6>e)!d`Ta7s)t5(L zK#PeKVphqLeF$|3AIs1)Xmy0!2U2|+jRq@fh~(UBCO+STct_viu~>vCXkOUUG=~VRs*vB0Ur*+l&jm;FVpFN71hL*h z?!5_VfwuB3rGZEsh@pI=P?TP?{snQ}_?qF_+WeSuG46pCE1+f{VWg`s zJ&<5mhUoH-A2a2{1Ht_=p63M{YOa9W++NP&GLU*isYN0*FyN@MuxQE@)f9?)U{6Kl znaXRD^rb*H6NzG#aJE!2;MA8JbIn~dxz3tkWrEOD;)MSqEP&)#!nVVfXLQaqlAnNs zMeQaul0r7-@WfJkR>Y8ldzwQNBWGPOB3R~eO6hA*C*m&mff`H4LFg!4{a#l$y;R#3 zT_W2Dy31;PeTY)7gUzpzj}B8kR=h%N`Wi&lTMP*;Mj_|Ng;EClS-mV15p9&5B@D-l z)~TP|1`V-U`nH@%0V!Bp34n7f!5YYjDF(?q-pNp%+d-X{gM@D(oTq58iFPkWdEoRA zh3SFD+r!0Hh=r~Mu~u~?C!hg6UNl2xU>*@wXYvogfp-thi8A^|gRwph>Y%RFS}yH6 z^19~sE5njLpT?c2UV6d-N|G~C+E~3S+0~}hShSu456uM<1mLz@$UP5vxm|z$EKXp! zaoXL)>CyNWZkX6*GC5Tvjkcc`kTZM%H%9RCd(B;%sissnvx57 z;_?JA>gu6{x_c(M7eblj7VqHPlzMJOYAW^DvVwaL_aL;GcLx7G#~PoJs7UiS{;@G3 z)JK67^BT%qPNY;fv)!qf7fVR}!<6iy{KM?>p@Y%zWm!v;@kfr!@*w@pln>lTweJ(* zAEc!|TJkyE2VQ2VNqL#d_R*G7WoRckxqCyq1p%Hcuz__il?Kyj~+mHVX{E67<#R-PmSbj}d(-DVm(QPzg? z3kE+Q#5!14U?kLTuO@O4@kd9cIne@48pM^E@5N0EE0*TFs43o&>NU1GZ1^GRyAZ#O ztL+857HHmur7hM_ei>Vz+-?(XcWphI;ul^ysi*$jY4O^kE)~nENL$$>V@Jm7d0S$S zw>Zl^(EZpt9EGts2kq0zM#QAIvgC-ICU?eU+axgV^ZJ5 z*lA5XCch0WH^Ul=s+VqlKiw*Td)&X8*-tgKf2w0orH!}_>PnSsPOarZ;m#5ag*|o? ziD!j@=3jLFu{p?T8i2|vooH6y09Bx&TE+j&ny92Y$&XgrPi&cuTh@}YE{ z2s*+VJLq_c1g#Vt$vI2L64ayk-#kLwy=UdbnwP}qNn-=KpTNox48`kExw2pjGPDzv zxC-bRKe@!HmuDA;d7~~95k&t8y5PvR3oyS%&UWwWa=kiQKB_O@S&LD@V8P7u2=`hO zXJjbSg7{yJHz&fqW?JR$;nfLZ{t2W|2c+}jXzSvWNAw-<$$BTDlEn|X&g>(GyO#K- z`5#N%=+-vsW+Dz?bmL>aY9Of#1=@lmzZ!pn`yN&xdtygHD`X~ud)wHzqD5Q%mjCpJ z){M}D9CPGa&MrU!wlf5_7yJ;72&psCQY-wZUk)D{Wi+QfLPjp!G4W|(j1gG{CO9$F zRq@&9LsU@?Ehs0I0<fY1lx7)66O}oM$Kl=kMY(OO zt;F>9W_TsUrhW!kDv=FS^AZ94tYXz4`HG^$UE|*xI}6D~8EcbYb75r*Yde+rHvU_o zjny#076~JL-w+yJarRR%5=vbYS|YlMfdR~V(TwV)u>(om9sKkC*c!_ysRGMJ{-*)$ z+)8ktxV9SdSkAg;F|S1H(WCs?k8-5UaK>hEfmPbO4Y~z%C7!a~Cu0*ISyX>l4-837gBHgw65Iiu5;0pe1F@1oO7xa z%0dHUn;wJ&E%r8q^ku00J#8Ua6wqbIBCYg<&e5~DHw2J_<(k2;MaR84P{UD8{ur_} z=-MO&6{?@-h_nrl0!O1vr%d0oDRecQGQf@OkWrudxy$HvLy|vktab*_;e@mfN6VG< zQ1M@74O@cwbP6Bfu)IusL*8~SOcvA{n1gR?q1az7gG0PHsN1&)OP>XU!yL;nE^vwE z_NmReZFX3#9DDp5tsKpL(zJZAol|(Nr>xbf1ow`s7|pZG@u4l`C4?}yd;Qe9NJhxI z6gXRHbawlex^kK6#r##qB84K2B^+980e3;2h<6wLTZO1vI62(klqTWn^L=^b zZo9()y`NN`-nSpztPXRrXL$~f&2f}HobEsBy3{DhboLw|$2Jq#&ZHZ2!Oa~3{_&hr z_^wu;^}*g^;?|0)e}yLk4AUP}9_v@93RZ385^nnA;-x#ewENP?pK+su^x;nd#d1Nn zK>AI2D$Pe1H#j%@6xp&o1u6B88@4Gnc0hXjhmrN<&ONwJo7W87)ARKfu3}!qOucGtOBc--6l()YDG0RLmuZV?VsiynuK^UwZ8RJr8}ohNoXkG67bs=#&kqD#g<~LLPZQ{z8m)R?nm{vm zH2uL7ZF#8|jP~5~3~~oJ-;xFxpc+0)N||!2S!(ooAC?EEF0JklFgaW*Bp60gi{AYfJ+O|7-3&yN3nA zLbXPv?ie&SoIYKfJae@%Q{PFg)HuIxS(H+)q+a4LehqcGt~!D9vcCw!x#mX1G${V7 zSEJ>H5^?}Tb598HFe=afAX3J@Vx> zZozy!_?$vdjHmA-A^V%|l%YFOG3iVMR)?k2}Cb_@Y8S`IU_UR?32i_y<)(whT2Zp!=S#dAc%kmdNYgLUy zVjj)o%a7M7of>wVU+)^8T{4vaw!gyKUIE=?WRJ?7C$A84p9MbU!xq-k6B(P2E>2f^ zj{4*kaQKUsFf-VbJR0xPOu4fhLjou9fSTK)bQOMOO2gHCE{NBmuYDfV2hh1vBRuQ| zlomsjdhQtz90-HM>X$xluh97uEze z?0$pVAV-lYKvH0M+i+U-)Bw#fq!%Cj5TLZNEBZ9?N3c~)QRLO)-%_I|)(z>nO`CN&6u&(Za<`KP#g)X0m?y^zCiZ`hX<-cOKn(ZdaiM7m~8^M(P~|pkD?a zI0bcQC^9jInnm6rl-GG)CR<5nE75w|K-v@LME6E(E$0~u$V;LN{XNb9*M7zwg=}9* zotMXS(8dQS{^_1FnZ2u(+)nj1+GKz5Vs)dK8 zjvFb!@v-*LlAM`wU}n0A(v{I$10cuJ_#FKoIiU1JX`C7@gthbYu2%P@LbIqWQ>eP9 zkl4Zl&Z7n^we1FGVhdT2=oT3dd4Il*<*~unl{$oX*O|E-H|HySA;36cZSu+AIQH;R z{7Nzib6~dIlqip(eOQ^x0_%&k+Irw}b!po2l#M#aAq*0Y#`LKO^0<6@7MZbhkg{!` ze)Pdm>~^_po2aX%go07~;93$LZ@>Ra>269D#BVmIJuk#7QAlGw*@~c>MEyY9+mF&l z2jO+4GHh06{bbNZO-2iw8N?y`2gd&kdKAwNX$!`?ZpKx}WO?`BF(Z6ceXup&5^&7T z%&~Wq%pA_JOI=^>V35r+7jrUDLONf(W z5V9#>NhHX+Ist}8=y*`0kDJIN_aBuShN*(4IQ~NfQ*jYMLfOpqX<_zV0q`^08=pM9 zit{zKkuQVS+c|gK36I@ep_A(T#W01tC5jY>IBcm@T)%T3v*n`i>qtB7vDhdZDAXe& zOZZs+ARrxssndL(|Nd`)8KXT-;2pknIdWffM#v&7ZcdhUo&Vggtza{9bH?c4Bn~2n zQxf-Hv2UH%uECNQ8lbg!{~Vr0OY##kK8(E4ui9mXWK17ftVi>&NE+q-))Fa%Ay>xx zr6T->y>C7g{?{4KV=w-EB*Y6TTK>`@3I|6lzTmo>NlSGz7ZfL9dkfBX4mv1IedFlI z$M2g41lwaEh;wCLmcP~j0BOy!Uu<*txz0PppDz*9Fx&L8TK$4FXU&e)M#!N2(M2Mn z$1)1{UNdk=MYIgV6G7)Ohgx{}WGMu8+)*9W8=39DC|2Ip{LKBk-}fm#h>!YHSWuz2 z-0>c&ood-2tM7oSz3^451pZURy%Cp3T@7AB9zsDT5EQNemEsI|;Co}h_#nlZ^wG>Z zBf3#^K4*h@#jP0=t0gGRtH;ypmyL8C44;*8ZQG51qW_=vuKg_uEDgI(<+|q77)J-c*3rM?|*9??w)l5PZMDvo4TX`82Ek$jT&@wIaih*V`ks^?YcaU;K z5JD>j6ch*BefHUZVV~XK&Tr?O=ljn4eee5z&vTTLO8#Sdx&b5p$fK>_EH90K7Zg|` zMJwhi*+FBbQkxvv0rp`jJz0tk;1Mg*sVMd%?u}1sRhhiY)KE3+y??5FNAG)ifuoqUybi(xj``Kecp+q!F+k*(h?iEG2R1b| ztp{THr^S-5h!R!d1sOf)fi?J{Ht&je)>?q4Y7R+YBOCx~MTs1?G~BP$yg9-Bzs$22 zfgXQ%Dp{3C5W2&TKYoS-@HWb$SXec;n+Z4y7yI-UFP%N5)e_eYnggP|n>ICcM~=EI z`ceA(-c$5uuRmcYNJ7g9s#;-Ie%upmv~Uv|?-ey5kT^bS^myJFVDznJiQl26o5~Qe zzxPXS-l~TleqY2HFO@q{eSPrFGaV`@q);X*DIoWk84 zP+u6k%_(hpik%CM40%Rg31!3)mV=H| zIUkhG(UIeb?k`IvQvO4#iaF3m$MzY#Q2@P-(dWW*?Z8xidP90l!r&)U2S***D zbIjy?eRVMw$#7?UQrYtL-68@Nd`LAI^Rx8cptq)xUxx@=MZeVFxsThv@&K92jNq5u z)&|*D=!8_ z_8uJajA`;S_TQ{kZ9|ObJ379}uq#if(-Xg-t}wkCnHKzWCgBzq)@f<4RNGLHJ+C$0 z7M8H^QHakbuKAf}+-1*ar!5d8!rKQ_1sfdp=9w&|514x#Ldyke~&|QtdpAy5;Nq9S8na z;4++QwHJJ(B5}G9y|9tprX1h4AhC}aY=7eb1}v9rt(!)xKf4OYB9J20Ci-{+P4OsT5{H$qer7Coe@Pu}TI{#}GkDj<0^=>R z=XIweU>*91L2vIAIGM{+M1ub~NM&yX;;s3a4M-4DA96 zhTx@b>6X7TZfSQie5ndDhP2>Z=S8#^rb<@%fx)|xICDPuO1VLUTU6Cv=orEk5bmTw@1ANlM&04g-*ychg|eaJRXg`s-^Nsb8{R?% z0vx(qVH4*X$YE}=)wpT5D8dKkh24!mc%%USP#jYL@h@(s4mz>>5lpJO5l z`;y0lCaPj1tIDk&TouE5myTOFTbeQC{>!EBuAZ@;D(eAKfC#=wtv*QsJu7lAMouu~ zU{;q|z@9OIYPLUrS);#~SBMFnjf*3!<+oX^v17csfcGi&`pj!0Go)Ile;RWe=pJL( zx*_)2#AY{Bf^@*UU*h!=9VdE1Q4ZZa|6s&}Vit=G!yJg4?KZwoPd z62z*9s@3IpyB6m(#aP&|*vvnc_fY!&(h3jPCP++UX=`GX=)S*B=Y5MU#bGGh#RH-b z=1v*8e~{;A3l~Br%!Nkd${hsiQ*=|xMnJVd-)Ow+N<(5hG}nf?M)yMJlnJgBM@=Kv z1zST2p*w2ZWvr59*A*^c)y+3y5LEUrtD6MX_~)+Jw?#tT8AQh7Rz&qakyCBjJWuW7 zo7f3znh%=zFdm7hHQKbX%T4J&EqTrIzr;8HN^t&v+Ku4-kAzIL{-?nKAMqRGG0%-l NpF9pa*64jH>koaOoT&f+ diff --git a/assets/cudatime_dark.png b/assets/cudatime_dark.png deleted file mode 100644 index 5e5af1dcfd648b2220e9a1a424cf1278eac3b94d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137097 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 Sd}-rg7k_m)kF&Xc?|%SQ&J{EO diff --git a/assets/cudatime_light.png b/assets/cudatime_light.png deleted file mode 100644 index eae0204358d46de65eb103994b18d26d2d068f2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130284 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 z 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

fX))BqL}T3SVO=oH}*9W&$Mcd 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

3W0{*YS#k*to;?0A5Y#5(#Gai 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ӍW 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 kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_pn_cpu_naive_float( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_pn_cpu_naive_double( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_pn_cpu_naive_float( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_pn_cpu_naive_double( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_pn_cpu_naive_float( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_pn_bias_cpu_naive_double( void * query_ptr, void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_pn_bias_cpu_naive_float( void * query_ptr, void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_pn_bias_cpu_naive_double( void * query_ptr, void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_pn_bias_cpu_naive_float( void * query_ptr, void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_pn_bias_cpu_naive_double( void * query_ptr, void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_pn_bias_cpu_naive_float( void * query_ptr, void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_nn_cpu_naive_double( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_nn_cpu_naive_float( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_nn_cpu_naive_double( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_nn_cpu_naive_float( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_nn_cpu_naive_double( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_nn_cpu_naive_float( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_in_cpu_naive_double( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_in_cpu_naive_float( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_in_cpu_naive_double( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_in_cpu_naive_float( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_in_cpu_naive_double( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_in_cpu_naive_float( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_rpbgrad_cpu_naive_double( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_rpbgrad_cpu_naive_float( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_rpbgrad_cpu_naive_double( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_rpbgrad_cpu_naive_float( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_rpbgrad_cpu_naive_double( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_rpbgrad_cpu_naive_float( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); diff --git a/csrc/autogen/include/natten_autogen/cuda/fna/dispatch_cm.h b/csrc/autogen/include/natten_autogen/cuda/fna/dispatch_cm.h new file mode 100644 index 0000000..baab276 --- /dev/null +++ b/csrc/autogen/include/natten_autogen/cuda/fna/dispatch_cm.h @@ -0,0 +1,775 @@ +#pragma once + + +#include +#include +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { +#define DISPATCH_FNA_FORWARD_1D_SM50_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + if (has_rpb) {\ + fna1_sm50_float32_cm_0_rpb(cb); \ + } else {\ + fna1_sm50_float32_cm_0(cb); \ + } \ + } \ + else if (std::get<0>(is_causal)) { \ + fna1_sm50_float32_cm_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-1D, SM50, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM50_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + if (has_rpb) {\ + fna1_sm50_float16_cm_0_rpb(cb); \ + } else {\ + fna1_sm50_float16_cm_0(cb); \ + } \ + } \ + else if (std::get<0>(is_causal)) { \ + fna1_sm50_float16_cm_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-1D, SM50, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM70_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + if (has_rpb) {\ + fna1_sm70_float32_cm_0_rpb(cb); \ + } else {\ + fna1_sm70_float32_cm_0(cb); \ + } \ + } \ + else if (std::get<0>(is_causal)) { \ + fna1_sm70_float32_cm_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-1D, SM70, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM70_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + if (has_rpb) {\ + fna1_sm70_float16_cm_0_rpb(cb); \ + } else {\ + fna1_sm70_float16_cm_0(cb); \ + } \ + } \ + else if (std::get<0>(is_causal)) { \ + fna1_sm70_float16_cm_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-1D, SM70, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM75_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + if (has_rpb) {\ + fna1_sm75_float32_cm_0_rpb(cb); \ + } else {\ + fna1_sm75_float32_cm_0(cb); \ + } \ + } \ + else if (std::get<0>(is_causal)) { \ + fna1_sm75_float32_cm_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-1D, SM75, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM75_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + if (has_rpb) {\ + fna1_sm75_float16_cm_0_rpb(cb); \ + } else {\ + fna1_sm75_float16_cm_0(cb); \ + } \ + } \ + else if (std::get<0>(is_causal)) { \ + fna1_sm75_float16_cm_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-1D, SM75, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM80_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + if (has_rpb) {\ + fna1_sm80_float32_cm_0_rpb(cb); \ + } else {\ + fna1_sm80_float32_cm_0(cb); \ + } \ + } \ + else if (std::get<0>(is_causal)) { \ + fna1_sm80_float32_cm_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-1D, SM80, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM80_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + if (has_rpb) {\ + fna1_sm80_float16_cm_0_rpb(cb); \ + } else {\ + fna1_sm80_float16_cm_0(cb); \ + } \ + } \ + else if (std::get<0>(is_causal)) { \ + fna1_sm80_float16_cm_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-1D, SM80, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM80_bfloat16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + if (has_rpb) {\ + fna1_sm80_bfloat16_cm_0_rpb(cb); \ + } else {\ + fna1_sm80_bfloat16_cm_0(cb); \ + } \ + } \ + else if (std::get<0>(is_causal)) { \ + fna1_sm80_bfloat16_cm_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-1D, SM80, bfloat16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM50_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + if (has_rpb) {\ + fna2_sm50_float32_cm_0_0_rpb(cb); \ + } else {\ + fna2_sm50_float32_cm_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm50_float32_cm_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + fna2_sm50_float32_cm_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm50_float32_cm_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-2D, SM50, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM50_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + if (has_rpb) {\ + fna2_sm50_float16_cm_0_0_rpb(cb); \ + } else {\ + fna2_sm50_float16_cm_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm50_float16_cm_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + fna2_sm50_float16_cm_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm50_float16_cm_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-2D, SM50, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM70_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + if (has_rpb) {\ + fna2_sm70_float32_cm_0_0_rpb(cb); \ + } else {\ + fna2_sm70_float32_cm_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm70_float32_cm_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + fna2_sm70_float32_cm_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm70_float32_cm_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-2D, SM70, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM70_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + if (has_rpb) {\ + fna2_sm70_float16_cm_0_0_rpb(cb); \ + } else {\ + fna2_sm70_float16_cm_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm70_float16_cm_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + fna2_sm70_float16_cm_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm70_float16_cm_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-2D, SM70, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM75_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + if (has_rpb) {\ + fna2_sm75_float32_cm_0_0_rpb(cb); \ + } else {\ + fna2_sm75_float32_cm_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm75_float32_cm_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + fna2_sm75_float32_cm_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm75_float32_cm_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-2D, SM75, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM75_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + if (has_rpb) {\ + fna2_sm75_float16_cm_0_0_rpb(cb); \ + } else {\ + fna2_sm75_float16_cm_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm75_float16_cm_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + fna2_sm75_float16_cm_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm75_float16_cm_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-2D, SM75, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM80_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + if (has_rpb) {\ + fna2_sm80_float32_cm_0_0_rpb(cb); \ + } else {\ + fna2_sm80_float32_cm_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm80_float32_cm_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + fna2_sm80_float32_cm_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm80_float32_cm_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-2D, SM80, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM80_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + if (has_rpb) {\ + fna2_sm80_float16_cm_0_0_rpb(cb); \ + } else {\ + fna2_sm80_float16_cm_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm80_float16_cm_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + fna2_sm80_float16_cm_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm80_float16_cm_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-2D, SM80, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM80_bfloat16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + if (has_rpb) {\ + fna2_sm80_bfloat16_cm_0_0_rpb(cb); \ + } else {\ + fna2_sm80_bfloat16_cm_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm80_bfloat16_cm_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + fna2_sm80_bfloat16_cm_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + fna2_sm80_bfloat16_cm_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-2D, SM80, bfloat16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM50_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + if (has_rpb) {\ + fna3_sm50_float32_cm_0_0_0_rpb(cb); \ + } else {\ + fna3_sm50_float32_cm_0_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm50_float32_cm_0_0_1(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm50_float32_cm_0_1_0(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm50_float32_cm_0_1_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm50_float32_cm_1_0_0(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm50_float32_cm_1_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm50_float32_cm_1_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm50_float32_cm_1_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-3D, SM50, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM50_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + if (has_rpb) {\ + fna3_sm50_float16_cm_0_0_0_rpb(cb); \ + } else {\ + fna3_sm50_float16_cm_0_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm50_float16_cm_0_0_1(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm50_float16_cm_0_1_0(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm50_float16_cm_0_1_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm50_float16_cm_1_0_0(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm50_float16_cm_1_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm50_float16_cm_1_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm50_float16_cm_1_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-3D, SM50, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM70_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + if (has_rpb) {\ + fna3_sm70_float32_cm_0_0_0_rpb(cb); \ + } else {\ + fna3_sm70_float32_cm_0_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm70_float32_cm_0_0_1(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm70_float32_cm_0_1_0(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm70_float32_cm_0_1_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm70_float32_cm_1_0_0(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm70_float32_cm_1_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm70_float32_cm_1_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm70_float32_cm_1_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-3D, SM70, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM70_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + if (has_rpb) {\ + fna3_sm70_float16_cm_0_0_0_rpb(cb); \ + } else {\ + fna3_sm70_float16_cm_0_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm70_float16_cm_0_0_1(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm70_float16_cm_0_1_0(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm70_float16_cm_0_1_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm70_float16_cm_1_0_0(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm70_float16_cm_1_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm70_float16_cm_1_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm70_float16_cm_1_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-3D, SM70, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM75_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + if (has_rpb) {\ + fna3_sm75_float32_cm_0_0_0_rpb(cb); \ + } else {\ + fna3_sm75_float32_cm_0_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm75_float32_cm_0_0_1(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm75_float32_cm_0_1_0(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm75_float32_cm_0_1_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm75_float32_cm_1_0_0(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm75_float32_cm_1_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm75_float32_cm_1_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm75_float32_cm_1_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-3D, SM75, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM75_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + if (has_rpb) {\ + fna3_sm75_float16_cm_0_0_0_rpb(cb); \ + } else {\ + fna3_sm75_float16_cm_0_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm75_float16_cm_0_0_1(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm75_float16_cm_0_1_0(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm75_float16_cm_0_1_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm75_float16_cm_1_0_0(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm75_float16_cm_1_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm75_float16_cm_1_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm75_float16_cm_1_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-3D, SM75, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM80_float32(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + if (has_rpb) {\ + fna3_sm80_float32_cm_0_0_0_rpb(cb); \ + } else {\ + fna3_sm80_float32_cm_0_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_float32_cm_0_0_1(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm80_float32_cm_0_1_0(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_float32_cm_0_1_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm80_float32_cm_1_0_0(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_float32_cm_1_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm80_float32_cm_1_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_float32_cm_1_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-3D, SM80, float32) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM80_float16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + if (has_rpb) {\ + fna3_sm80_float16_cm_0_0_0_rpb(cb); \ + } else {\ + fna3_sm80_float16_cm_0_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_float16_cm_0_0_1(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm80_float16_cm_0_1_0(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_float16_cm_0_1_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm80_float16_cm_1_0_0(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_float16_cm_1_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm80_float16_cm_1_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_float16_cm_1_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-3D, SM80, float16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM80_bfloat16(is_causal, has_rpb, cb) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + if (has_rpb) {\ + fna3_sm80_bfloat16_cm_0_0_0_rpb(cb); \ + } else {\ + fna3_sm80_bfloat16_cm_0_0_0(cb); \ + } \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_bfloat16_cm_0_0_1(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm80_bfloat16_cm_0_1_0(cb); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_bfloat16_cm_0_1_1(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm80_bfloat16_cm_1_0_0(cb); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_bfloat16_cm_1_0_1(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + fna3_sm80_bfloat16_cm_1_1_0(cb); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + fna3_sm80_bfloat16_cm_1_1_1(cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Causal mask dispatcher (FNA-3D, SM80, bfloat16) got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + + + +} // namespace natten +} // namespace cuda +} // namespace fna + diff --git a/csrc/autogen/include/natten_autogen/cuda/fna/dispatch_device.h b/csrc/autogen/include/natten_autogen/cuda/fna/dispatch_device.h new file mode 100644 index 0000000..9ebcb9e --- /dev/null +++ b/csrc/autogen/include/natten_autogen/cuda/fna/dispatch_device.h @@ -0,0 +1,85 @@ +#pragma once + + +#include +#include +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { +#define DISPATCH_FNA_FORWARD_1D(cc, dtype, is_causal, has_rpb, cb) \ + [&] { \ + if (cc < 70 && cc >= 50) { \ + DISPATCH_FNA_FORWARD_1D_SM50(dtype, is_causal, has_rpb, cb); \ + } \ + else if (cc < 75 && cc >= 70) { \ + DISPATCH_FNA_FORWARD_1D_SM70(dtype, is_causal, has_rpb, cb); \ + } \ + else if (cc < 80 && cc >= 75) { \ + DISPATCH_FNA_FORWARD_1D_SM75(dtype, is_causal, has_rpb, cb); \ + } \ + else if (cc < 100 && cc >= 80) { \ + DISPATCH_FNA_FORWARD_1D_SM80(dtype, is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Fused neighborhood attention is not implemented for this device." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D(cc, dtype, is_causal, has_rpb, cb) \ + [&] { \ + if (cc < 70 && cc >= 50) { \ + DISPATCH_FNA_FORWARD_2D_SM50(dtype, is_causal, has_rpb, cb); \ + } \ + else if (cc < 75 && cc >= 70) { \ + DISPATCH_FNA_FORWARD_2D_SM70(dtype, is_causal, has_rpb, cb); \ + } \ + else if (cc < 80 && cc >= 75) { \ + DISPATCH_FNA_FORWARD_2D_SM75(dtype, is_causal, has_rpb, cb); \ + } \ + else if (cc < 100 && cc >= 80) { \ + DISPATCH_FNA_FORWARD_2D_SM80(dtype, is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Fused neighborhood attention is not implemented for this device." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D(cc, dtype, is_causal, has_rpb, cb) \ + [&] { \ + if (cc < 70 && cc >= 50) { \ + DISPATCH_FNA_FORWARD_3D_SM50(dtype, is_causal, has_rpb, cb); \ + } \ + else if (cc < 75 && cc >= 70) { \ + DISPATCH_FNA_FORWARD_3D_SM70(dtype, is_causal, has_rpb, cb); \ + } \ + else if (cc < 80 && cc >= 75) { \ + DISPATCH_FNA_FORWARD_3D_SM75(dtype, is_causal, has_rpb, cb); \ + } \ + else if (cc < 100 && cc >= 80) { \ + DISPATCH_FNA_FORWARD_3D_SM80(dtype, is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Fused neighborhood attention is not implemented for this device." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + + + +} // namespace natten +} // namespace cuda +} // namespace fna + diff --git a/csrc/autogen/include/natten_autogen/cuda/fna/dispatch_dtype.h b/csrc/autogen/include/natten_autogen/cuda/fna/dispatch_dtype.h new file mode 100644 index 0000000..4f8556a --- /dev/null +++ b/csrc/autogen/include/natten_autogen/cuda/fna/dispatch_dtype.h @@ -0,0 +1,220 @@ +#pragma once + + +#include +#include +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { +#define DISPATCH_FNA_FORWARD_1D_SM50(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_1D_SM50_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_1D_SM50_float16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-1D does not support this data type on SM50." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM70(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_1D_SM70_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_1D_SM70_float16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-1D does not support this data type on SM70." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM75(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_1D_SM75_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_1D_SM75_float16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-1D does not support this data type on SM75." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_1D_SM80(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_1D_SM80_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_1D_SM80_float16(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_1D_SM80_bfloat16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-1D does not support this data type on SM80." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM50(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_2D_SM50_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_2D_SM50_float16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-2D does not support this data type on SM50." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM70(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_2D_SM70_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_2D_SM70_float16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-2D does not support this data type on SM70." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM75(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_2D_SM75_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_2D_SM75_float16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-2D does not support this data type on SM75." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_2D_SM80(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_2D_SM80_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_2D_SM80_float16(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_2D_SM80_bfloat16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-2D does not support this data type on SM80." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM50(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_3D_SM50_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_3D_SM50_float16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-3D does not support this data type on SM50." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM70(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_3D_SM70_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_3D_SM70_float16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-3D does not support this data type on SM70." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM75(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_3D_SM75_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_3D_SM75_float16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-3D does not support this data type on SM75." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_FNA_FORWARD_3D_SM80(dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_3D_SM80_float32(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_3D_SM80_float16(is_causal, has_rpb, cb); \ + } \ + else if constexpr (std::is_same::value) { \ + DISPATCH_FNA_FORWARD_3D_SM80_bfloat16(is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "FNA-3D does not support this data type on SM80." \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + + + +} // namespace natten +} // namespace cuda +} // namespace fna + diff --git a/csrc/autogen/include/natten_autogen/cuda/fna/interface.h b/csrc/autogen/include/natten_autogen/cuda/fna/interface.h new file mode 100644 index 0000000..6bfeedf --- /dev/null +++ b/csrc/autogen/include/natten_autogen/cuda/fna/interface.h @@ -0,0 +1,38 @@ +#pragma once + + +#include +#include +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { +#define DISPATCH_FNA_FORWARD_KERNEL(rank, cc, dtype, is_causal, has_rpb, cb) \ + [&] { \ + if constexpr (rank == 1) { \ + DISPATCH_FNA_FORWARD_1D(cc, dtype, is_causal, has_rpb, cb); \ + } \ + else if constexpr (rank == 2) { \ + DISPATCH_FNA_FORWARD_2D(cc, dtype, is_causal, has_rpb, cb); \ + } \ + else if constexpr (rank == 3) { \ + DISPATCH_FNA_FORWARD_3D(cc, dtype, is_causal, has_rpb, cb); \ + } \ + else { \ + std::cerr << "NATTEN FNA kernel launch failed!" \ + << "Invalid spatial extent rank! Only 1, 2, and 3D are supported!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + + + +} // namespace natten +} // namespace cuda +} // namespace fna + diff --git a/csrc/autogen/include/natten_autogen/cuda/fna/kernels.h b/csrc/autogen/include/natten_autogen/cuda/fna/kernels.h new file mode 100644 index 0000000..79ed862 --- /dev/null +++ b/csrc/autogen/include/natten_autogen/cuda/fna/kernels.h @@ -0,0 +1,14094 @@ +#pragma once + + +#include +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm50_float32_cm_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna1_32x128x32_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna1_64x64x32_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna1_64x128x32_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna1_32x128x64_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna1_64x64x64_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna1_64x128x64_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna1_32x128x128_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna1_64x64x128_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna1_64x128x128_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm50_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm50_float32_cm_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p); + + +template +void fna1_sm50_float32_cm_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>(), fna1_32x128x32_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>(), fna1_64x64x32_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>(), fna1_64x128x32_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>(), fna1_32x128x64_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>(), fna1_64x64x64_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>(), fna1_64x128x64_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>(), fna1_32x128x128_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>(), fna1_64x64x128_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>(), fna1_64x128x128_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>(), fna1_32x128x65536_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>(), fna1_64x128x65536_sm50_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>(), fna1_64x64x65536_sm50_float32_cm_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm50_float32_cm_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna1_32x128x32_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna1_64x64x32_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna1_64x128x32_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna1_32x128x64_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna1_64x64x64_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna1_64x128x64_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna1_32x128x128_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna1_64x64x128_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna1_64x128x128_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm50_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm50_float32_cm_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm50_float16_cm_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna1_32x128x32_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna1_64x64x32_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna1_64x128x32_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna1_32x128x64_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna1_64x64x64_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna1_64x128x64_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna1_32x128x128_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna1_64x64x128_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna1_64x128x128_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm50_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm50_float16_cm_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p); + + +template +void fna1_sm50_float16_cm_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>(), fna1_32x128x32_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>(), fna1_64x64x32_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>(), fna1_64x128x32_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>(), fna1_32x128x64_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>(), fna1_64x64x64_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>(), fna1_64x128x64_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>(), fna1_32x128x128_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>(), fna1_64x64x128_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>(), fna1_64x128x128_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>(), fna1_32x128x65536_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>(), fna1_64x128x65536_sm50_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>(), fna1_64x64x65536_sm50_float16_cm_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm50_float16_cm_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna1_32x128x32_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna1_64x64x32_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna1_64x128x32_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna1_32x128x64_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna1_64x64x64_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna1_64x128x64_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna1_32x128x128_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna1_64x64x128_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna1_64x128x128_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm50_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm50_float16_cm_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm70_float32_cm_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna1_32x128x32_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna1_64x64x32_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna1_64x128x32_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna1_32x128x64_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna1_64x64x64_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna1_64x128x64_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna1_32x128x128_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna1_64x64x128_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna1_64x128x128_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm70_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm70_float32_cm_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p); + + +template +void fna1_sm70_float32_cm_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>(), fna1_32x128x32_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>(), fna1_64x64x32_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>(), fna1_64x128x32_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>(), fna1_32x128x64_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>(), fna1_64x64x64_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>(), fna1_64x128x64_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>(), fna1_32x128x128_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>(), fna1_64x64x128_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>(), fna1_64x128x128_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>(), fna1_32x128x65536_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>(), fna1_64x128x65536_sm70_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>(), fna1_64x64x65536_sm70_float32_cm_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm70_float32_cm_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna1_32x128x32_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna1_64x64x32_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna1_64x128x32_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna1_32x128x64_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna1_64x64x64_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna1_64x128x64_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna1_32x128x128_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna1_64x64x128_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna1_64x128x128_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm70_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm70_float32_cm_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm70_float16_cm_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna1_32x128x32_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna1_64x64x32_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna1_64x128x32_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna1_32x128x64_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna1_64x64x64_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna1_64x128x64_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna1_32x128x128_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna1_64x64x128_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna1_64x128x128_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm70_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm70_float16_cm_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p); + + +template +void fna1_sm70_float16_cm_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>(), fna1_32x128x32_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>(), fna1_64x64x32_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>(), fna1_64x128x32_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>(), fna1_32x128x64_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>(), fna1_64x64x64_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>(), fna1_64x128x64_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>(), fna1_32x128x128_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>(), fna1_64x64x128_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>(), fna1_64x128x128_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>(), fna1_32x128x65536_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>(), fna1_64x128x65536_sm70_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>(), fna1_64x64x65536_sm70_float16_cm_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm70_float16_cm_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna1_32x128x32_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna1_64x64x32_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna1_64x128x32_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna1_32x128x64_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna1_64x64x64_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna1_64x128x64_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna1_32x128x128_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna1_64x64x128_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna1_64x128x128_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm70_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm70_float16_cm_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm75_float32_cm_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna1_32x128x32_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna1_64x64x32_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna1_64x128x32_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna1_32x128x64_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna1_64x64x64_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna1_64x128x64_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna1_32x128x128_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna1_64x64x128_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna1_64x128x128_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm75_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm75_float32_cm_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p); + + +template +void fna1_sm75_float32_cm_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>(), fna1_32x128x32_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>(), fna1_64x64x32_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>(), fna1_64x128x32_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>(), fna1_32x128x64_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>(), fna1_64x64x64_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>(), fna1_64x128x64_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>(), fna1_32x128x128_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>(), fna1_64x64x128_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>(), fna1_64x128x128_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>(), fna1_32x128x65536_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>(), fna1_64x128x65536_sm75_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>(), fna1_64x64x65536_sm75_float32_cm_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm75_float32_cm_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna1_32x128x32_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna1_64x64x32_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna1_64x128x32_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna1_32x128x64_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna1_64x64x64_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna1_64x128x64_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna1_32x128x128_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna1_64x64x128_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna1_64x128x128_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm75_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm75_float32_cm_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm75_float16_cm_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna1_32x128x32_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna1_64x64x32_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna1_64x128x32_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna1_32x128x64_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna1_64x64x64_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna1_64x128x64_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna1_32x128x128_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna1_64x64x128_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna1_64x128x128_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm75_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm75_float16_cm_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p); + + +template +void fna1_sm75_float16_cm_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>(), fna1_32x128x32_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>(), fna1_64x64x32_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>(), fna1_64x128x32_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>(), fna1_32x128x64_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>(), fna1_64x64x64_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>(), fna1_64x128x64_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>(), fna1_32x128x128_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>(), fna1_64x64x128_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>(), fna1_64x128x128_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>(), fna1_32x128x65536_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>(), fna1_64x128x65536_sm75_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>(), fna1_64x64x65536_sm75_float16_cm_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm75_float16_cm_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna1_32x128x32_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna1_64x64x32_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna1_64x128x32_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna1_32x128x64_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna1_64x64x64_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna1_64x128x64_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna1_32x128x128_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna1_64x64x128_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna1_64x128x128_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm75_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm75_float16_cm_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm80_float32_cm_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna1_32x128x32_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna1_64x64x32_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna1_64x128x32_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna1_32x128x64_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna1_64x64x64_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna1_64x128x64_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna1_32x128x128_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna1_64x64x128_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna1_64x128x128_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm80_float32_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm80_float32_cm_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p); + + +template +void fna1_sm80_float32_cm_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>(), fna1_32x128x32_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>(), fna1_64x64x32_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>(), fna1_64x128x32_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>(), fna1_32x128x64_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>(), fna1_64x64x64_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>(), fna1_64x128x64_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>(), fna1_32x128x128_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>(), fna1_64x64x128_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>(), fna1_64x128x128_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>(), fna1_32x128x65536_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>(), fna1_64x128x65536_sm80_float32_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>(), fna1_64x64x65536_sm80_float32_cm_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm80_float32_cm_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna1_32x128x32_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna1_64x64x32_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna1_64x128x32_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna1_32x128x64_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna1_64x64x64_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna1_64x128x64_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna1_32x128x128_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna1_64x64x128_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna1_64x128x128_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm80_float32_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm80_float32_cm_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm80_float16_cm_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna1_32x128x32_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna1_64x64x32_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna1_64x128x32_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna1_32x128x64_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna1_64x64x64_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna1_64x128x64_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna1_32x128x128_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna1_64x64x128_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna1_64x128x128_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm80_float16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm80_float16_cm_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p); + + +template +void fna1_sm80_float16_cm_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>(), fna1_32x128x32_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>(), fna1_64x64x32_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>(), fna1_64x128x32_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>(), fna1_32x128x64_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>(), fna1_64x64x64_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>(), fna1_64x128x64_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>(), fna1_32x128x128_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>(), fna1_64x64x128_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>(), fna1_64x128x128_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>(), fna1_32x128x65536_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>(), fna1_64x128x65536_sm80_float16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>(), fna1_64x64x65536_sm80_float16_cm_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm80_float16_cm_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna1_32x128x32_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna1_64x64x32_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna1_64x128x32_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna1_32x128x64_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna1_64x64x64_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna1_64x128x64_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna1_32x128x128_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna1_64x64x128_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna1_64x128x128_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm80_float16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm80_float16_cm_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm80_bfloat16_cm_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna1_32x128x32_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna1_64x64x32_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna1_64x128x32_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna1_32x128x64_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna1_64x64x64_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna1_64x128x64_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna1_32x128x128_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna1_64x64x128_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna1_64x128x128_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm80_bfloat16_cm_0); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm80_bfloat16_cm_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p); + + +template +void fna1_sm80_bfloat16_cm_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>(), fna1_32x128x32_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>(), fna1_64x64x32_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>(), fna1_64x128x32_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>(), fna1_32x128x64_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>(), fna1_64x64x64_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>(), fna1_64x128x64_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>(), fna1_32x128x128_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>(), fna1_64x64x128_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>(), fna1_64x128x128_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>(), fna1_32x128x65536_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>(), fna1_64x128x65536_sm80_bfloat16_cm_0_rpb); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>(), fna1_64x64x65536_sm80_bfloat16_cm_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-1D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna1_sm80_bfloat16_cm_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna1_32x128x32_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna1_64x64x32_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna1_64x128x32_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna1_32x128x64_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna1_64x64x64_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna1_64x128x64_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna1_32x128x128_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna1_64x64x128_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna1_64x128x128_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna1_32x128x65536_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna1_64x128x65536_sm80_bfloat16_cm_1); + cb(FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna1_64x64x65536_sm80_bfloat16_cm_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm50_float32_cm_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna2_32x128x32_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna2_64x64x32_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna2_64x128x32_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna2_32x128x64_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna2_64x64x64_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna2_64x128x64_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna2_32x128x128_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna2_64x64x128_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna2_64x128x128_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm50_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm50_float32_cm_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p); + + +template +void fna2_sm50_float32_cm_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>(), fna2_32x128x32_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>(), fna2_64x64x32_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>(), fna2_64x128x32_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>(), fna2_32x128x64_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>(), fna2_64x64x64_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>(), fna2_64x128x64_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>(), fna2_32x128x128_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>(), fna2_64x64x128_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>(), fna2_64x128x128_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>(), fna2_32x128x65536_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>(), fna2_64x128x65536_sm50_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>(), fna2_64x64x65536_sm50_float32_cm_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm50_float32_cm_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna2_32x128x32_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna2_64x64x32_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna2_64x128x32_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna2_32x128x64_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna2_64x64x64_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna2_64x128x64_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna2_32x128x128_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna2_64x64x128_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna2_64x128x128_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm50_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm50_float32_cm_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm50_float32_cm_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna2_32x128x32_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna2_64x64x32_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna2_64x128x32_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna2_32x128x64_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna2_64x64x64_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna2_64x128x64_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna2_32x128x128_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna2_64x64x128_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna2_64x128x128_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm50_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm50_float32_cm_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm50_float32_cm_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna2_32x128x32_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna2_64x64x32_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna2_64x128x32_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna2_32x128x64_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna2_64x64x64_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna2_64x128x64_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna2_32x128x128_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna2_64x64x128_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna2_64x128x128_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm50_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm50_float32_cm_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm50_float16_cm_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna2_32x128x32_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna2_64x64x32_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna2_64x128x32_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna2_32x128x64_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna2_64x64x64_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna2_64x128x64_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna2_32x128x128_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna2_64x64x128_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna2_64x128x128_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm50_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm50_float16_cm_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p); + + +template +void fna2_sm50_float16_cm_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>(), fna2_32x128x32_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>(), fna2_64x64x32_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>(), fna2_64x128x32_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>(), fna2_32x128x64_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>(), fna2_64x64x64_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>(), fna2_64x128x64_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>(), fna2_32x128x128_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>(), fna2_64x64x128_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>(), fna2_64x128x128_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>(), fna2_32x128x65536_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>(), fna2_64x128x65536_sm50_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>(), fna2_64x64x65536_sm50_float16_cm_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm50_float16_cm_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna2_32x128x32_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna2_64x64x32_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna2_64x128x32_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna2_32x128x64_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna2_64x64x64_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna2_64x128x64_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna2_32x128x128_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna2_64x64x128_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna2_64x128x128_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm50_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm50_float16_cm_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm50_float16_cm_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna2_32x128x32_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna2_64x64x32_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna2_64x128x32_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna2_32x128x64_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna2_64x64x64_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna2_64x128x64_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna2_32x128x128_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna2_64x64x128_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna2_64x128x128_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm50_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm50_float16_cm_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm50_float16_cm_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna2_32x128x32_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna2_64x64x32_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna2_64x128x32_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna2_32x128x64_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna2_64x64x64_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna2_64x128x64_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna2_32x128x128_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna2_64x64x128_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna2_64x128x128_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm50_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm50_float16_cm_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm70_float32_cm_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna2_32x128x32_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna2_64x64x32_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna2_64x128x32_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna2_32x128x64_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna2_64x64x64_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna2_64x128x64_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna2_32x128x128_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna2_64x64x128_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna2_64x128x128_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm70_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm70_float32_cm_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p); + + +template +void fna2_sm70_float32_cm_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>(), fna2_32x128x32_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>(), fna2_64x64x32_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>(), fna2_64x128x32_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>(), fna2_32x128x64_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>(), fna2_64x64x64_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>(), fna2_64x128x64_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>(), fna2_32x128x128_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>(), fna2_64x64x128_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>(), fna2_64x128x128_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>(), fna2_32x128x65536_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>(), fna2_64x128x65536_sm70_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>(), fna2_64x64x65536_sm70_float32_cm_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm70_float32_cm_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna2_32x128x32_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna2_64x64x32_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna2_64x128x32_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna2_32x128x64_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna2_64x64x64_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna2_64x128x64_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna2_32x128x128_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna2_64x64x128_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna2_64x128x128_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm70_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm70_float32_cm_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm70_float32_cm_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna2_32x128x32_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna2_64x64x32_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna2_64x128x32_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna2_32x128x64_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna2_64x64x64_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna2_64x128x64_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna2_32x128x128_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna2_64x64x128_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna2_64x128x128_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm70_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm70_float32_cm_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm70_float32_cm_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna2_32x128x32_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna2_64x64x32_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna2_64x128x32_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna2_32x128x64_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna2_64x64x64_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna2_64x128x64_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna2_32x128x128_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna2_64x64x128_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna2_64x128x128_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm70_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm70_float32_cm_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm70_float16_cm_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna2_32x128x32_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna2_64x64x32_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna2_64x128x32_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna2_32x128x64_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna2_64x64x64_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna2_64x128x64_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna2_32x128x128_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna2_64x64x128_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna2_64x128x128_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm70_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm70_float16_cm_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p); + + +template +void fna2_sm70_float16_cm_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>(), fna2_32x128x32_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>(), fna2_64x64x32_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>(), fna2_64x128x32_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>(), fna2_32x128x64_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>(), fna2_64x64x64_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>(), fna2_64x128x64_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>(), fna2_32x128x128_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>(), fna2_64x64x128_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>(), fna2_64x128x128_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>(), fna2_32x128x65536_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>(), fna2_64x128x65536_sm70_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>(), fna2_64x64x65536_sm70_float16_cm_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm70_float16_cm_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna2_32x128x32_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna2_64x64x32_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna2_64x128x32_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna2_32x128x64_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna2_64x64x64_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna2_64x128x64_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna2_32x128x128_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna2_64x64x128_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna2_64x128x128_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm70_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm70_float16_cm_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm70_float16_cm_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna2_32x128x32_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna2_64x64x32_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna2_64x128x32_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna2_32x128x64_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna2_64x64x64_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna2_64x128x64_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna2_32x128x128_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna2_64x64x128_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna2_64x128x128_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm70_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm70_float16_cm_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm70_float16_cm_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna2_32x128x32_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna2_64x64x32_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna2_64x128x32_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna2_32x128x64_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna2_64x64x64_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna2_64x128x64_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna2_32x128x128_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna2_64x64x128_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna2_64x128x128_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm70_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm70_float16_cm_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm75_float32_cm_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna2_32x128x32_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna2_64x64x32_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna2_64x128x32_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna2_32x128x64_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna2_64x64x64_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna2_64x128x64_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna2_32x128x128_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna2_64x64x128_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna2_64x128x128_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm75_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm75_float32_cm_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p); + + +template +void fna2_sm75_float32_cm_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>(), fna2_32x128x32_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>(), fna2_64x64x32_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>(), fna2_64x128x32_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>(), fna2_32x128x64_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>(), fna2_64x64x64_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>(), fna2_64x128x64_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>(), fna2_32x128x128_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>(), fna2_64x64x128_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>(), fna2_64x128x128_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>(), fna2_32x128x65536_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>(), fna2_64x128x65536_sm75_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>(), fna2_64x64x65536_sm75_float32_cm_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm75_float32_cm_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna2_32x128x32_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna2_64x64x32_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna2_64x128x32_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna2_32x128x64_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna2_64x64x64_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna2_64x128x64_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna2_32x128x128_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna2_64x64x128_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna2_64x128x128_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm75_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm75_float32_cm_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm75_float32_cm_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna2_32x128x32_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna2_64x64x32_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna2_64x128x32_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna2_32x128x64_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna2_64x64x64_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna2_64x128x64_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna2_32x128x128_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna2_64x64x128_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna2_64x128x128_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm75_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm75_float32_cm_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm75_float32_cm_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna2_32x128x32_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna2_64x64x32_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna2_64x128x32_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna2_32x128x64_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna2_64x64x64_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna2_64x128x64_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna2_32x128x128_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna2_64x64x128_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna2_64x128x128_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm75_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm75_float32_cm_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm75_float16_cm_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna2_32x128x32_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna2_64x64x32_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna2_64x128x32_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna2_32x128x64_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna2_64x64x64_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna2_64x128x64_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna2_32x128x128_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna2_64x64x128_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna2_64x128x128_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm75_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm75_float16_cm_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p); + + +template +void fna2_sm75_float16_cm_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>(), fna2_32x128x32_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>(), fna2_64x64x32_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>(), fna2_64x128x32_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>(), fna2_32x128x64_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>(), fna2_64x64x64_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>(), fna2_64x128x64_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>(), fna2_32x128x128_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>(), fna2_64x64x128_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>(), fna2_64x128x128_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>(), fna2_32x128x65536_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>(), fna2_64x128x65536_sm75_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>(), fna2_64x64x65536_sm75_float16_cm_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm75_float16_cm_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna2_32x128x32_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna2_64x64x32_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna2_64x128x32_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna2_32x128x64_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna2_64x64x64_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna2_64x128x64_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna2_32x128x128_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna2_64x64x128_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna2_64x128x128_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm75_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm75_float16_cm_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm75_float16_cm_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna2_32x128x32_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna2_64x64x32_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna2_64x128x32_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna2_32x128x64_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna2_64x64x64_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna2_64x128x64_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna2_32x128x128_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna2_64x64x128_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna2_64x128x128_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm75_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm75_float16_cm_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm75_float16_cm_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna2_32x128x32_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna2_64x64x32_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna2_64x128x32_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna2_32x128x64_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna2_64x64x64_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna2_64x128x64_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna2_32x128x128_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna2_64x64x128_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna2_64x128x128_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm75_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm75_float16_cm_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_float32_cm_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_float32_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_float32_cm_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p); + + +template +void fna2_sm80_float32_cm_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>(), fna2_32x128x32_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>(), fna2_64x64x32_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>(), fna2_64x128x32_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>(), fna2_32x128x64_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>(), fna2_64x64x64_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>(), fna2_64x128x64_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>(), fna2_32x128x128_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>(), fna2_64x64x128_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>(), fna2_64x128x128_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>(), fna2_32x128x65536_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>(), fna2_64x128x65536_sm80_float32_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>(), fna2_64x64x65536_sm80_float32_cm_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_float32_cm_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_float32_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_float32_cm_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_float32_cm_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_float32_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_float32_cm_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_float32_cm_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_float32_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_float32_cm_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_float16_cm_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_float16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_float16_cm_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p); + + +template +void fna2_sm80_float16_cm_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>(), fna2_32x128x32_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>(), fna2_64x64x32_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>(), fna2_64x128x32_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>(), fna2_32x128x64_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>(), fna2_64x64x64_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>(), fna2_64x128x64_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>(), fna2_32x128x128_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>(), fna2_64x64x128_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>(), fna2_64x128x128_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>(), fna2_32x128x65536_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>(), fna2_64x128x65536_sm80_float16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>(), fna2_64x64x65536_sm80_float16_cm_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_float16_cm_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_float16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_float16_cm_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_float16_cm_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_float16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_float16_cm_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_float16_cm_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_float16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_float16_cm_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_bfloat16_cm_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_bfloat16_cm_0_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_bfloat16_cm_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p); + + +template +void fna2_sm80_bfloat16_cm_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>(), fna2_32x128x32_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>(), fna2_64x64x32_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>(), fna2_64x128x32_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>(), fna2_32x128x64_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>(), fna2_64x64x64_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>(), fna2_64x128x64_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>(), fna2_32x128x128_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>(), fna2_64x64x128_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>(), fna2_64x128x128_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>(), fna2_32x128x65536_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>(), fna2_64x128x65536_sm80_bfloat16_cm_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>(), fna2_64x64x65536_sm80_bfloat16_cm_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_bfloat16_cm_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_bfloat16_cm_0_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_bfloat16_cm_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_bfloat16_cm_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_bfloat16_cm_1_0); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_bfloat16_cm_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna2_sm80_bfloat16_cm_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna2_32x128x32_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna2_64x64x32_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna2_64x128x32_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna2_32x128x64_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna2_64x64x64_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna2_64x128x64_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna2_32x128x128_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna2_64x64x128_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna2_64x128x128_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna2_32x128x65536_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna2_64x128x65536_sm80_bfloat16_cm_1_1); + cb(FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna2_64x64x65536_sm80_bfloat16_cm_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float32_cm_0_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float32_cm_0_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p); + + +template +void fna3_sm50_float32_cm_0_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>(), fna3_32x128x32_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>(), fna3_64x64x32_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>(), fna3_64x128x32_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>(), fna3_32x128x64_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>(), fna3_64x64x64_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>(), fna3_64x128x64_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>(), fna3_32x128x128_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>(), fna3_64x64x128_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>(), fna3_64x128x128_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>(), fna3_32x128x65536_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>(), fna3_64x128x65536_sm50_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>(), fna3_64x64x65536_sm50_float32_cm_0_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float32_cm_0_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float32_cm_0_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float32_cm_0_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float32_cm_0_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float32_cm_0_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float32_cm_0_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float32_cm_1_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float32_cm_1_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float32_cm_1_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float32_cm_1_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float32_cm_1_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float32_cm_1_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float32_cm_1_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float32_cm_1_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float16_cm_0_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float16_cm_0_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p); + + +template +void fna3_sm50_float16_cm_0_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>(), fna3_32x128x32_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>(), fna3_64x64x32_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>(), fna3_64x128x32_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>(), fna3_32x128x64_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>(), fna3_64x64x64_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>(), fna3_64x128x64_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>(), fna3_32x128x128_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>(), fna3_64x64x128_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>(), fna3_64x128x128_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>(), fna3_32x128x65536_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>(), fna3_64x128x65536_sm50_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>(), fna3_64x64x65536_sm50_float16_cm_0_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float16_cm_0_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float16_cm_0_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float16_cm_0_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float16_cm_0_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float16_cm_0_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float16_cm_0_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float16_cm_1_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float16_cm_1_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float16_cm_1_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float16_cm_1_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float16_cm_1_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float16_cm_1_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm50_float16_cm_1_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>(), fna3_32x128x32_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>(), fna3_64x64x32_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>(), fna3_64x128x32_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>(), fna3_32x128x64_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>(), fna3_64x64x64_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>(), fna3_64x128x64_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>(), fna3_32x128x128_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>(), fna3_64x64x128_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>(), fna3_64x128x128_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm50_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm50_float16_cm_1_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float32_cm_0_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float32_cm_0_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p); + + +template +void fna3_sm70_float32_cm_0_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>(), fna3_32x128x32_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>(), fna3_64x64x32_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>(), fna3_64x128x32_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>(), fna3_32x128x64_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>(), fna3_64x64x64_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>(), fna3_64x128x64_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>(), fna3_32x128x128_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>(), fna3_64x64x128_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>(), fna3_64x128x128_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>(), fna3_32x128x65536_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>(), fna3_64x128x65536_sm70_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>(), fna3_64x64x65536_sm70_float32_cm_0_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float32_cm_0_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float32_cm_0_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float32_cm_0_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float32_cm_0_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float32_cm_0_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float32_cm_0_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float32_cm_1_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float32_cm_1_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float32_cm_1_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float32_cm_1_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float32_cm_1_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float32_cm_1_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float32_cm_1_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float32_cm_1_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float16_cm_0_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float16_cm_0_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p); + + +template +void fna3_sm70_float16_cm_0_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>(), fna3_32x128x32_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>(), fna3_64x64x32_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>(), fna3_64x128x32_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>(), fna3_32x128x64_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>(), fna3_64x64x64_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>(), fna3_64x128x64_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>(), fna3_32x128x128_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>(), fna3_64x64x128_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>(), fna3_64x128x128_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>(), fna3_32x128x65536_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>(), fna3_64x128x65536_sm70_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>(), fna3_64x64x65536_sm70_float16_cm_0_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float16_cm_0_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float16_cm_0_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float16_cm_0_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float16_cm_0_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float16_cm_0_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float16_cm_0_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float16_cm_1_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float16_cm_1_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float16_cm_1_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float16_cm_1_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float16_cm_1_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float16_cm_1_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm70_float16_cm_1_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>(), fna3_32x128x32_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>(), fna3_64x64x32_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>(), fna3_64x128x32_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>(), fna3_32x128x64_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>(), fna3_64x64x64_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>(), fna3_64x128x64_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>(), fna3_32x128x128_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>(), fna3_64x64x128_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>(), fna3_64x128x128_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm70_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm70_float16_cm_1_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float32_cm_0_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float32_cm_0_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p); + + +template +void fna3_sm75_float32_cm_0_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>(), fna3_32x128x32_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>(), fna3_64x64x32_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>(), fna3_64x128x32_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>(), fna3_32x128x64_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>(), fna3_64x64x64_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>(), fna3_64x128x64_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>(), fna3_32x128x128_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>(), fna3_64x64x128_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>(), fna3_64x128x128_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>(), fna3_32x128x65536_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>(), fna3_64x128x65536_sm75_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>(), fna3_64x64x65536_sm75_float32_cm_0_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float32_cm_0_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float32_cm_0_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float32_cm_0_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float32_cm_0_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float32_cm_0_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float32_cm_0_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float32_cm_1_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float32_cm_1_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float32_cm_1_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float32_cm_1_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float32_cm_1_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float32_cm_1_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float32_cm_1_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float32_cm_1_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float16_cm_0_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float16_cm_0_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p); + + +template +void fna3_sm75_float16_cm_0_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>(), fna3_32x128x32_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>(), fna3_64x64x32_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>(), fna3_64x128x32_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>(), fna3_32x128x64_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>(), fna3_64x64x64_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>(), fna3_64x128x64_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>(), fna3_32x128x128_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>(), fna3_64x64x128_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>(), fna3_64x128x128_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>(), fna3_32x128x65536_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>(), fna3_64x128x65536_sm75_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>(), fna3_64x64x65536_sm75_float16_cm_0_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float16_cm_0_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float16_cm_0_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float16_cm_0_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float16_cm_0_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float16_cm_0_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float16_cm_0_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float16_cm_1_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float16_cm_1_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float16_cm_1_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float16_cm_1_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float16_cm_1_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float16_cm_1_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm75_float16_cm_1_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>(), fna3_32x128x32_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>(), fna3_64x64x32_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>(), fna3_64x128x32_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>(), fna3_32x128x64_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>(), fna3_64x64x64_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>(), fna3_64x128x64_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>(), fna3_32x128x128_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>(), fna3_64x64x128_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>(), fna3_64x128x128_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm75_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm75_float16_cm_1_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float32_cm_0_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float32_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float32_cm_0_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p); + + +template +void fna3_sm80_float32_cm_0_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>(), fna3_32x128x32_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>(), fna3_64x64x32_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>(), fna3_64x128x32_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>(), fna3_32x128x64_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>(), fna3_64x64x64_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>(), fna3_64x128x64_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>(), fna3_32x128x128_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>(), fna3_64x64x128_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>(), fna3_64x128x128_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>(), fna3_32x128x65536_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>(), fna3_64x128x65536_sm80_float32_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>(), fna3_64x64x65536_sm80_float32_cm_0_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float32_cm_0_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float32_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float32_cm_0_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float32_cm_0_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float32_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float32_cm_0_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float32_cm_0_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float32_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float32_cm_0_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float32_cm_1_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float32_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float32_cm_1_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float32_cm_1_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float32_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float32_cm_1_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float32_cm_1_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float32_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float32_cm_1_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float32_cm_1_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float32_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float32_cm_1_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float16_cm_0_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float16_cm_0_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p); + + +template +void fna3_sm80_float16_cm_0_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>(), fna3_32x128x32_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>(), fna3_64x64x32_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>(), fna3_64x128x32_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>(), fna3_32x128x64_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>(), fna3_64x64x64_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>(), fna3_64x128x64_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>(), fna3_32x128x128_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>(), fna3_64x64x128_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>(), fna3_64x128x128_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>(), fna3_32x128x65536_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>(), fna3_64x128x65536_sm80_float16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>(), fna3_64x64x65536_sm80_float16_cm_0_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float16_cm_0_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float16_cm_0_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float16_cm_0_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float16_cm_0_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float16_cm_0_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float16_cm_0_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float16_cm_1_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float16_cm_1_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float16_cm_1_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float16_cm_1_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float16_cm_1_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float16_cm_1_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_float16_cm_1_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_float16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_float16_cm_1_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_bfloat16_cm_0_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_bfloat16_cm_0_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_bfloat16_cm_0_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p); + + +template +void fna3_sm80_bfloat16_cm_0_0_0_rpb(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>(), fna3_32x128x32_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>(), fna3_64x64x32_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>(), fna3_64x128x32_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>(), fna3_32x128x64_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>(), fna3_64x64x64_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>(), fna3_64x128x64_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>(), fna3_32x128x128_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>(), fna3_64x64x128_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>(), fna3_64x128x128_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>(), fna3_32x128x65536_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>(), fna3_64x128x65536_sm80_bfloat16_cm_0_0_0_rpb); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>(), fna3_64x64x65536_sm80_bfloat16_cm_0_0_0_rpb); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_bfloat16_cm_0_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_bfloat16_cm_0_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_bfloat16_cm_0_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_bfloat16_cm_0_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_bfloat16_cm_0_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_bfloat16_cm_0_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_bfloat16_cm_0_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_bfloat16_cm_0_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_bfloat16_cm_0_1_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_bfloat16_cm_1_0_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_bfloat16_cm_1_0_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_bfloat16_cm_1_0_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_bfloat16_cm_1_0_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_bfloat16_cm_1_0_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_bfloat16_cm_1_0_1); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_bfloat16_cm_1_1_0(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_bfloat16_cm_1_1_0); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_bfloat16_cm_1_1_0); +} + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p); + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p); + + +template +void fna3_sm80_bfloat16_cm_1_1_1(T cb) { + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>(), fna3_32x128x32_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>(), fna3_64x64x32_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>(), fna3_64x128x32_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>(), fna3_32x128x64_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>(), fna3_64x64x64_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>(), fna3_64x128x64_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>(), fna3_32x128x128_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>(), fna3_64x64x128_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>(), fna3_64x128x128_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>(), fna3_32x128x65536_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>(), fna3_64x128x65536_sm80_bfloat16_cm_1_1_1); + cb(FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>(), fna3_64x64x65536_sm80_bfloat16_cm_1_1_1); +} + +} // namespace natten +} // namespace cuda +} // namespace fna + diff --git a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/dispatch_align.h b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/dispatch_align.h index ddefa77..0fe1169 100644 --- a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/dispatch_align.h +++ b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/dispatch_align.h @@ -330,640 +330,1540 @@ namespace gemm { } \ }(); +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + #define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3 requires at least 32-bit alignment." \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5 requires at least 32-bit alignment." \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ diff --git a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/dispatch_kernel_size.h b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/dispatch_kernel_size.h index 4d693a9..81996ed 100644 --- a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/dispatch_kernel_size.h +++ b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/dispatch_kernel_size.h @@ -60,6 +60,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_pn_cuda_gemm_sm70_half does not support implement " \ @@ -121,6 +166,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_nn_cuda_gemm_sm70_half does not support implement " \ @@ -182,6 +272,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_in_cuda_gemm_sm70_half does not support implement " \ diff --git a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/kernels.h b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/kernels.h index c69cc1f..188bbea 100644 --- a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/kernels.h +++ b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm70/kernels.h @@ -921,6 +921,861 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( float scale, cudaStream_t stream); +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( void * attn_ptr, void * value_ptr, @@ -939,7 +1794,1393 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -957,7 +3198,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -975,7 +3216,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -993,7 +3234,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1011,7 +3252,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1029,7 +3270,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1047,7 +3288,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1065,7 +3306,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1083,7 +3324,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1101,7 +3342,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1119,7 +3360,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1137,7 +3378,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1155,7 +3396,43 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1173,10 +3450,208 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1191,10 +3666,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1209,10 +3684,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1227,10 +3702,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1245,10 +3720,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1263,10 +3738,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1281,10 +3756,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1299,10 +3774,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1317,10 +3792,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1335,10 +3810,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1353,10 +3828,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1371,10 +3846,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1389,10 +3864,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1407,10 +3882,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1425,10 +3900,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1443,10 +3918,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1461,10 +3936,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1479,10 +3954,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1497,10 +3972,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1515,10 +3990,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1533,10 +4008,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1551,10 +4026,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1569,10 +4044,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1587,10 +4062,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1605,10 +4080,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1623,10 +4098,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1641,10 +4116,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1659,10 +4134,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1677,10 +4152,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1695,10 +4170,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1713,10 +4188,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1731,10 +4206,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1749,10 +4224,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1767,10 +4242,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1785,7 +4260,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1803,7 +4278,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1821,7 +4296,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1839,7 +4314,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1857,7 +4332,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1875,7 +4350,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1893,7 +4368,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1911,7 +4386,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1929,7 +4404,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1947,7 +4422,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1965,7 +4440,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1983,7 +4458,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2001,7 +4476,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2019,7 +4494,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2037,7 +4512,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2055,7 +4530,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2073,7 +4548,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2091,7 +4566,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2109,7 +4584,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2127,7 +4602,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2145,7 +4620,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2163,7 +4638,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2181,7 +4656,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2199,7 +4674,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2217,7 +4692,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2235,7 +4710,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2253,7 +4728,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2271,7 +4746,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2289,7 +4764,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2307,7 +4782,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2325,7 +4800,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2343,7 +4818,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2361,7 +4836,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2379,7 +4854,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2397,7 +4872,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2415,7 +4890,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2433,7 +4908,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2451,7 +4926,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2469,7 +4944,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2487,7 +4962,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2505,7 +4980,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2523,7 +4998,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2541,7 +5016,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2559,7 +5034,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2577,7 +5052,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2595,7 +5070,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2613,7 +5088,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2631,7 +5106,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, diff --git a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/dispatch_align.h b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/dispatch_align.h index 92f5574..6d4ff21 100644 --- a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/dispatch_align.h +++ b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/dispatch_align.h @@ -330,640 +330,1540 @@ namespace gemm { } \ }(); +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + #define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3 requires at least 32-bit alignment." \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5 requires at least 32-bit alignment." \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ diff --git a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/dispatch_kernel_size.h b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/dispatch_kernel_size.h index 5b17f90..fdbc7bb 100644 --- a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/dispatch_kernel_size.h +++ b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/dispatch_kernel_size.h @@ -60,6 +60,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_pn_cuda_gemm_sm75_half does not support implement " \ @@ -121,6 +166,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_nn_cuda_gemm_sm75_half does not support implement " \ @@ -182,6 +272,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_in_cuda_gemm_sm75_half does not support implement " \ diff --git a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/kernels.h b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/kernels.h index ecbebd2..4adb35c 100644 --- a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/kernels.h +++ b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm75/kernels.h @@ -921,6 +921,861 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( float scale, cudaStream_t stream); +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( void * attn_ptr, void * value_ptr, @@ -939,7 +1794,1393 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -957,7 +3198,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -975,7 +3216,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -993,7 +3234,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1011,7 +3252,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1029,7 +3270,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1047,7 +3288,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1065,7 +3306,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1083,7 +3324,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1101,7 +3342,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1119,7 +3360,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1137,7 +3378,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1155,7 +3396,43 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -1173,10 +3450,208 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1191,10 +3666,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1209,10 +3684,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1227,10 +3702,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1245,10 +3720,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1263,10 +3738,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1281,10 +3756,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1299,10 +3774,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1317,10 +3792,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1335,10 +3810,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1353,10 +3828,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1371,10 +3846,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1389,10 +3864,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1407,10 +3882,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1425,10 +3900,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1443,10 +3918,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1461,10 +3936,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1479,10 +3954,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1497,10 +3972,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1515,10 +3990,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1533,10 +4008,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1551,10 +4026,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1569,10 +4044,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1587,10 +4062,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1605,10 +4080,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1623,10 +4098,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1641,10 +4116,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1659,10 +4134,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1677,10 +4152,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1695,10 +4170,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1713,10 +4188,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1731,10 +4206,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1749,10 +4224,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1767,10 +4242,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -1785,7 +4260,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1803,7 +4278,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1821,7 +4296,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1839,7 +4314,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1857,7 +4332,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1875,7 +4350,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1893,7 +4368,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1911,7 +4386,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1929,7 +4404,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1947,7 +4422,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1965,7 +4440,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -1983,7 +4458,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2001,7 +4476,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2019,7 +4494,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2037,7 +4512,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2055,7 +4530,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2073,7 +4548,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2091,7 +4566,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2109,7 +4584,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2127,7 +4602,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2145,7 +4620,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2163,7 +4638,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2181,7 +4656,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2199,7 +4674,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2217,7 +4692,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2235,7 +4710,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2253,7 +4728,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2271,7 +4746,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2289,7 +4764,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2307,7 +4782,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2325,7 +4800,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2343,7 +4818,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2361,7 +4836,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2379,7 +4854,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2397,7 +4872,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2415,7 +4890,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2433,7 +4908,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2451,7 +4926,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2469,7 +4944,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2487,7 +4962,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2505,7 +4980,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2523,7 +4998,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2541,7 +5016,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2559,7 +5034,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2577,7 +5052,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2595,7 +5070,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2613,7 +5088,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -2631,7 +5106,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, diff --git a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/dispatch_align.h b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/dispatch_align.h index 1859edf..61efe6f 100644 --- a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/dispatch_align.h +++ b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/dispatch_align.h @@ -90,6 +90,81 @@ namespace gemm { natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1(__VA_ARGS__); \ }(); +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63_align1(__VA_ARGS__); \ +}(); + #define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ @@ -410,2720 +485,5570 @@ namespace gemm { } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ + << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15(dim, ...) \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63(dim, ...) \ + [&] { \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks35(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4(__VA_ARGS__); \ - } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2(__VA_ARGS__); \ - } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1(__VA_ARGS__); \ - } \ - else { \ - std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ - << std::endl; \ - exit(EXIT_FAILURE); \ - } \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks35_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks37(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4(__VA_ARGS__); \ - } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2(__VA_ARGS__); \ - } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1(__VA_ARGS__); \ - } \ - else { \ - std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ - << std::endl; \ - exit(EXIT_FAILURE); \ - } \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks37_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks39(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4(__VA_ARGS__); \ - } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2(__VA_ARGS__); \ - } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1(__VA_ARGS__); \ - } \ - else { \ - std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ - << std::endl; \ - exit(EXIT_FAILURE); \ - } \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks39_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks41(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4(__VA_ARGS__); \ - } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2(__VA_ARGS__); \ - } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1(__VA_ARGS__); \ - } \ - else { \ - std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ - << std::endl; \ - exit(EXIT_FAILURE); \ - } \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks41_align1(__VA_ARGS__); \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks43(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks43_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks45(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks45_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks47(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks47_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks49(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks49_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks51(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks51_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks53(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks53_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks55(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks55_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks57(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks57_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks59(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks59_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks61(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks61_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks63(dim, ...) \ + [&] { \ + natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks63_align1(__VA_ARGS__); \ +}(); + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25(dim, ...) \ [&] { \ if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align2(__VA_ARGS__); \ } \ else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); - -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ - [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ + +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61(dim, ...) \ + [&] { \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63(dim, ...) \ [&] { \ - if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ - } \ - else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ + if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63_align2(__VA_ARGS__); \ + } \ + else if (dim % 1 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63_align1(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=float. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=bfloat16. " \ - << std::endl; \ - exit(EXIT_FAILURE); \ - } \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29_align1(__VA_ARGS__); \ -}(); - -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31(dim, ...) \ - [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31_align1(__VA_ARGS__); \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29(dim, ...) \ [&] { \ - natten::cuda::gemm::na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33_align1(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ + } \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + } \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61(dim, ...) \ [&] { \ - if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align4(__VA_ARGS__); \ + if (dim % 8 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align8(__VA_ARGS__); \ } \ - else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align2(__VA_ARGS__); \ + else if (dim % 4 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align4(__VA_ARGS__); \ } \ - else if (dim % 1 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align1(__VA_ARGS__); \ + else if (dim % 2 == 0) { \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=float. " \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=half. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ } \ else { \ - std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ - << "Got dim=" << dim << ", dtype=half. " \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ + << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ } \ }(); -#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33(dim, ...) \ +#define DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63(dim, ...) \ [&] { \ if (dim % 8 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align8(__VA_ARGS__); \ } \ else if (dim % 4 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align4(__VA_ARGS__); \ } \ else if (dim % 2 == 0) { \ - natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2(__VA_ARGS__); \ + natten::cuda::gemm::na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align2(__VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ - << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33 requires at least 32-bit alignment." \ + << "na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63 requires at least 32-bit alignment." \ << "Got dim=" << dim << ", dtype=bfloat16. " \ << std::endl; \ exit(EXIT_FAILURE); \ diff --git a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/dispatch_kernel_size.h b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/dispatch_kernel_size.h index 8c9480c..922b316 100644 --- a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/dispatch_kernel_size.h +++ b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/dispatch_kernel_size.h @@ -60,6 +60,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_pn_cuda_gemm_sm80_double does not support implement " \ @@ -121,6 +166,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_pn_cuda_gemm_sm80_float does not support implement " \ @@ -182,6 +272,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_pn_cuda_gemm_sm80_half does not support implement " \ @@ -243,6 +378,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_pn_cuda_gemm_sm80_bfloat16 does not support implement " \ @@ -304,6 +484,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_nn_cuda_gemm_sm80_double does not support implement " \ @@ -365,6 +590,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_nn_cuda_gemm_sm80_float does not support implement " \ @@ -426,6 +696,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_nn_cuda_gemm_sm80_half does not support implement " \ @@ -487,6 +802,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_nn_cuda_gemm_sm80_bfloat16 does not support implement " \ @@ -548,6 +908,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_in_cuda_gemm_sm80_double does not support implement " \ @@ -609,6 +1014,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_in_cuda_gemm_sm80_float does not support implement " \ @@ -670,6 +1120,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_in_cuda_gemm_sm80_half does not support implement " \ @@ -731,6 +1226,51 @@ namespace gemm { else if (kernel_size == 33) { \ DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33(dim, __VA_ARGS__); \ } \ + else if (kernel_size == 35) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 37) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 39) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 41) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 43) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 45) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 47) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 49) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 51) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 53) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 55) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 57) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 59) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 61) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61(dim, __VA_ARGS__); \ + } \ + else if (kernel_size == 63) { \ + DISPATCH_ALIGNMENT_na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63(dim, __VA_ARGS__); \ + } \ else { \ std::cerr << "NATTEN kernel launch failed! " \ << "na2d_in_cuda_gemm_sm80_bfloat16 does not support implement " \ diff --git a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/kernels.h b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/kernels.h index a4cac07..f4067ff 100644 --- a/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/kernels.h +++ b/csrc/autogen/include/natten_autogen/cuda/gemm/2d/sm80/kernels.h @@ -313,7 +313,7 @@ void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -332,7 +332,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -351,7 +351,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -370,7 +370,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -389,7 +389,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -408,7 +408,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -427,7 +427,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -446,7 +446,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -465,7 +465,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -484,7 +484,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -503,7 +503,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -522,7 +522,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -541,7 +541,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -560,7 +560,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -579,7 +579,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -598,7 +598,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -617,7 +617,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -636,7 +636,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -655,7 +655,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align4( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -674,7 +674,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align2( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -693,7 +693,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align1( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -712,7 +712,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align4( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -731,7 +731,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align2( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -750,7 +750,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align1( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -769,7 +769,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align4( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -788,7 +788,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align2( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -807,7 +807,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align1( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -826,7 +826,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -845,7 +845,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -864,7 +864,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -883,7 +883,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -902,7 +902,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -921,7 +921,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -940,7 +940,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -959,7 +959,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -978,7 +978,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -997,7 +997,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1016,7 +1016,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1035,7 +1035,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1054,7 +1054,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1073,7 +1073,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1092,7 +1092,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1111,7 +1111,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1130,7 +1130,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1149,7 +1149,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1168,7 +1168,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1187,7 +1187,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1206,7 +1206,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1225,7 +1225,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1244,7 +1244,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1263,7 +1263,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1282,7 +1282,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1301,7 +1301,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1320,7 +1320,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1339,7 +1339,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1358,7 +1358,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1377,7 +1377,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1396,7 +1396,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1415,7 +1415,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1434,7 +1434,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1453,7 +1453,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1472,7 +1472,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1491,7 +1491,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1510,7 +1510,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1529,7 +1529,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1548,7 +1548,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1567,7 +1567,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1586,7 +1586,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1605,7 +1605,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1624,7 +1624,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1643,7 +1643,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1662,7 +1662,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1681,7 +1681,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1700,7 +1700,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1719,7 +1719,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1738,7 +1738,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1757,7 +1757,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1776,7 +1776,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1795,7 +1795,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1814,7 +1814,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1833,7 +1833,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1852,7 +1852,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1871,7 +1871,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1890,7 +1890,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1909,7 +1909,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1928,7 +1928,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1947,7 +1947,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1966,7 +1966,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -1985,7 +1985,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2004,7 +2004,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2023,7 +2023,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2042,7 +2042,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2061,7 +2061,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2080,7 +2080,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2099,7 +2099,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2118,7 +2118,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2137,7 +2137,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2156,7 +2156,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2175,7 +2175,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2194,7 +2194,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2213,7 +2213,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2232,7 +2232,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2251,7 +2251,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2270,7 +2270,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2289,7 +2289,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2308,7 +2308,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2327,7 +2327,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2346,7 +2346,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2365,7 +2365,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2384,7 +2384,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2403,7 +2403,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2422,7 +2422,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2441,7 +2441,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2460,7 +2460,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2479,7 +2479,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2498,7 +2498,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2517,7 +2517,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2536,7 +2536,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2555,7 +2555,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2574,7 +2574,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2593,7 +2593,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2612,7 +2612,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2631,7 +2631,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2650,7 +2650,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2669,7 +2669,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2688,7 +2688,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2707,7 +2707,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2726,7 +2726,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2745,7 +2745,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2764,7 +2764,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2783,7 +2783,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2802,7 +2802,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2821,7 +2821,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2840,7 +2840,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2859,7 +2859,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2878,7 +2878,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2897,7 +2897,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2916,7 +2916,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2935,7 +2935,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2954,7 +2954,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2973,7 +2973,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -2992,7 +2992,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -3011,7 +3011,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -3030,7 +3030,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( float scale, cudaStream_t stream); -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -3049,10 +3049,11 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -3067,10 +3068,11 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -3085,10 +3087,11 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -3103,10 +3106,2857 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, int batch_size, int heads, int height, @@ -3139,7 +5989,5173 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3157,7 +11173,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3175,7 +11191,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3193,7 +11209,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3211,7 +11227,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3229,7 +11245,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3247,7 +11263,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3265,7 +11281,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3283,7 +11299,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3301,7 +11317,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3319,7 +11335,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3337,7 +11353,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3355,7 +11371,97 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -3373,10 +11479,154 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream); + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3391,10 +11641,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3409,10 +11659,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3427,10 +11677,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3445,10 +11695,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3463,10 +11713,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3481,10 +11731,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3499,10 +11749,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3517,10 +11767,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks35_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3535,10 +11785,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks37_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3553,10 +11803,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks39_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3571,10 +11821,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks41_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3589,10 +11839,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks43_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3607,10 +11857,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks45_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3625,10 +11875,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks47_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3643,10 +11893,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks49_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3661,10 +11911,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks51_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3679,10 +11929,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks53_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3697,10 +11947,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks55_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3715,10 +11965,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks57_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3733,10 +11983,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks59_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3751,10 +12001,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks61_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3769,10 +12019,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks63_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3787,10 +12037,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3805,10 +12055,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3823,10 +12073,10 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3841,10 +12091,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3859,10 +12109,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3877,10 +12127,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3895,10 +12145,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3913,10 +12163,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3931,10 +12181,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3949,10 +12199,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3967,10 +12217,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -3985,10 +12235,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4003,10 +12253,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4021,10 +12271,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4039,10 +12289,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4057,10 +12307,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4075,10 +12325,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4093,10 +12343,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4111,10 +12361,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4129,10 +12379,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4147,10 +12397,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4165,10 +12415,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4183,10 +12433,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4201,10 +12451,10 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4219,10 +12469,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4237,10 +12487,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4255,10 +12505,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4273,10 +12523,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4291,10 +12541,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4309,10 +12559,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4327,10 +12577,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4345,10 +12595,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4363,10 +12613,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4381,10 +12631,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4399,10 +12649,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4417,10 +12667,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4435,10 +12685,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4453,10 +12703,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4471,10 +12721,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4489,10 +12739,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4507,10 +12757,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4525,10 +12775,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4543,10 +12793,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4561,10 +12811,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4579,10 +12829,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4597,10 +12847,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4615,10 +12865,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4633,10 +12883,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4651,10 +12901,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4669,10 +12919,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4687,10 +12937,10 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4705,10 +12955,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4723,10 +12973,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4741,10 +12991,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4759,10 +13009,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4777,10 +13027,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4795,10 +13045,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4813,10 +13063,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4831,10 +13081,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4849,10 +13099,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4867,10 +13117,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4885,10 +13135,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4903,10 +13153,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4921,10 +13171,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4939,10 +13189,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4957,10 +13207,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4975,10 +13225,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -4993,10 +13243,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5011,10 +13261,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5029,10 +13279,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5047,10 +13297,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5065,10 +13315,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5083,10 +13333,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5101,10 +13351,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5119,10 +13369,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5137,10 +13387,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5155,10 +13405,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5173,10 +13423,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5191,10 +13441,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5209,10 +13459,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5227,10 +13477,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5245,10 +13495,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5263,10 +13513,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5281,10 +13531,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5299,10 +13549,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5317,10 +13567,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5335,10 +13585,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5353,10 +13603,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5371,10 +13621,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5389,10 +13639,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5407,10 +13657,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5425,10 +13675,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5443,10 +13693,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5461,10 +13711,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5479,10 +13729,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5497,10 +13747,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5515,10 +13765,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5533,10 +13783,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5551,10 +13801,10 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5569,10 +13819,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5587,10 +13837,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5605,10 +13855,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5623,10 +13873,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5641,10 +13891,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5659,10 +13909,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5677,10 +13927,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5695,10 +13945,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5713,10 +13963,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5731,10 +13981,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5749,10 +13999,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5767,10 +14017,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5785,10 +14035,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5803,10 +14053,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5821,10 +14071,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5839,10 +14089,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5857,10 +14107,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5875,10 +14125,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5893,10 +14143,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5911,10 +14161,10 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( float scale, cudaStream_t stream); -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -5929,7 +14179,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -5947,7 +14197,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -5965,7 +14215,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -5983,7 +14233,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6001,7 +14251,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6019,7 +14269,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6037,7 +14287,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6055,7 +14305,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6073,7 +14323,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6091,7 +14341,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6109,7 +14359,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6127,7 +14377,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6145,7 +14395,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6163,7 +14413,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6181,7 +14431,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6199,7 +14449,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6217,7 +14467,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6235,7 +14485,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6253,7 +14503,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6271,7 +14521,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6289,7 +14539,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6307,7 +14557,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6325,7 +14575,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6343,7 +14593,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6361,7 +14611,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6379,7 +14629,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6397,7 +14647,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6415,7 +14665,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6433,7 +14683,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6451,7 +14701,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6469,7 +14719,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6487,7 +14737,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6505,7 +14755,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6523,7 +14773,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6541,7 +14791,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6559,7 +14809,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6577,7 +14827,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6595,7 +14845,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6613,7 +14863,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6631,7 +14881,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6649,7 +14899,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6667,7 +14917,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6685,7 +14935,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6703,7 +14953,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6721,7 +14971,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6739,7 +14989,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6757,7 +15007,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6775,7 +15025,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6793,7 +15043,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6811,7 +15061,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6829,7 +15079,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6847,7 +15097,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6865,7 +15115,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6883,7 +15133,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6901,7 +15151,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6919,7 +15169,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6937,7 +15187,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6955,7 +15205,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6973,7 +15223,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -6991,7 +15241,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7009,7 +15259,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7027,7 +15277,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7045,7 +15295,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7063,7 +15313,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7081,7 +15331,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align1( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7099,7 +15349,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7117,7 +15367,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7135,7 +15385,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7153,7 +15403,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7171,7 +15421,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7189,7 +15439,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7207,7 +15457,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7225,7 +15475,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7243,7 +15493,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7261,7 +15511,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7279,7 +15529,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7297,7 +15547,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7315,7 +15565,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7333,7 +15583,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7351,7 +15601,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7369,7 +15619,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7387,7 +15637,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7405,7 +15655,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7423,7 +15673,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7441,7 +15691,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7459,7 +15709,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7477,7 +15727,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7495,7 +15745,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7513,7 +15763,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7531,7 +15781,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7549,7 +15799,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7567,7 +15817,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7585,7 +15835,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7603,7 +15853,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7621,7 +15871,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7639,7 +15889,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7657,7 +15907,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7675,7 +15925,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7693,7 +15943,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7711,7 +15961,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7729,7 +15979,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7747,7 +15997,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7765,7 +16015,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7783,7 +16033,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7801,7 +16051,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7819,7 +16069,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7837,7 +16087,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7855,7 +16105,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7873,7 +16123,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7891,7 +16141,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7909,7 +16159,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7927,7 +16177,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7945,7 +16195,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7963,7 +16213,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7981,7 +16231,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -7999,7 +16249,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8017,7 +16267,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8035,7 +16285,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8053,7 +16303,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8071,7 +16321,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8089,7 +16339,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8107,7 +16357,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8125,7 +16375,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8143,7 +16393,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8161,7 +16411,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8179,7 +16429,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8197,7 +16447,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8215,7 +16465,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8233,7 +16483,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8251,7 +16501,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8269,7 +16519,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8287,7 +16537,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8305,7 +16555,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8323,7 +16573,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8341,7 +16591,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8359,7 +16609,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8377,7 +16627,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8395,7 +16645,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8413,7 +16663,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8431,7 +16681,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8449,7 +16699,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8467,7 +16717,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8485,7 +16735,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8503,7 +16753,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8521,7 +16771,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8539,7 +16789,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8557,7 +16807,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8575,7 +16825,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8593,7 +16843,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8611,7 +16861,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8629,7 +16879,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8647,7 +16897,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8665,7 +16915,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8683,7 +16933,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8701,7 +16951,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8719,7 +16969,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8737,7 +16987,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8755,7 +17005,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8773,7 +17023,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -8791,7 +17041,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( float scale, cudaStream_t stream); -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, diff --git a/csrc/autogen/include/natten_autogen/cuda/naive/dispatch_cm.h b/csrc/autogen/include/natten_autogen/cuda/naive/dispatch_cm.h new file mode 100644 index 0000000..b271850 --- /dev/null +++ b/csrc/autogen/include/natten_autogen/cuda/naive/dispatch_cm.h @@ -0,0 +1,1192 @@ +#pragma once + + +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace naive { +#define DISPATCH_CM_na1d_pn_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_pn_cuda_naive_double_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_pn_cuda_naive_double_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_pn_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_pn_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_pn_cuda_naive_float_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_pn_cuda_naive_float_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_pn_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_pn_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_pn_cuda_naive_half_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_pn_cuda_naive_half_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_pn_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_pn_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_pn_cuda_naive_bfloat16_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_pn_cuda_naive_bfloat16_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_pn_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_pn_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_double_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_double_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_double_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_double_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_pn_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_float_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_float_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_float_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_float_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_pn_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_half_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_half_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_half_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_half_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_pn_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_bfloat16_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_bfloat16_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_bfloat16_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_pn_cuda_naive_bfloat16_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_pn_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_double_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_double_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_double_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_double_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_double_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_double_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_double_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_double_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_pn_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_pn_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_float_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_float_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_float_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_float_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_float_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_float_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_float_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_float_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_pn_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_pn_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_half_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_half_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_half_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_half_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_half_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_half_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_half_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_half_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_pn_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_pn_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_bfloat16_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_bfloat16_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_bfloat16_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_bfloat16_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_bfloat16_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_bfloat16_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_bfloat16_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_pn_cuda_naive_bfloat16_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_pn_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_pn_bias_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_pn_bias_cuda_naive_double_cm_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_pn_bias_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_pn_bias_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_pn_bias_cuda_naive_float_cm_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_pn_bias_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_pn_bias_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_pn_bias_cuda_naive_half_cm_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_pn_bias_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_pn_bias_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_pn_bias_cuda_naive_bfloat16_cm_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_pn_bias_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_pn_bias_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_bias_cuda_naive_double_cm_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_bias_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_pn_bias_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_bias_cuda_naive_float_cm_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_bias_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_pn_bias_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_bias_cuda_naive_half_cm_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_bias_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_pn_bias_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_pn_bias_cuda_naive_bfloat16_cm_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_pn_bias_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_pn_bias_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_bias_cuda_naive_double_cm_0_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_pn_bias_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_pn_bias_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_bias_cuda_naive_float_cm_0_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_pn_bias_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_pn_bias_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_bias_cuda_naive_half_cm_0_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_pn_bias_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_pn_bias_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_pn_bias_cuda_naive_bfloat16_cm_0_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_pn_bias_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_nn_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_nn_cuda_naive_double_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_nn_cuda_naive_double_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_nn_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_nn_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_nn_cuda_naive_float_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_nn_cuda_naive_float_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_nn_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_nn_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_nn_cuda_naive_half_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_nn_cuda_naive_half_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_nn_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_nn_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_nn_cuda_naive_bfloat16_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_nn_cuda_naive_bfloat16_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_nn_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_nn_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_double_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_double_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_double_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_double_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_nn_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_float_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_float_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_float_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_float_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_nn_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_half_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_half_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_half_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_half_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_nn_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_bfloat16_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_bfloat16_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_bfloat16_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_nn_cuda_naive_bfloat16_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_nn_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_nn_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_double_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_double_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_double_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_double_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_double_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_double_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_double_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_double_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_nn_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_nn_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_float_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_float_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_float_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_float_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_float_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_float_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_float_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_float_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_nn_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_nn_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_half_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_half_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_half_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_half_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_half_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_half_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_half_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_half_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_nn_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_nn_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_bfloat16_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_bfloat16_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_bfloat16_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_bfloat16_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_bfloat16_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_bfloat16_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_bfloat16_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_nn_cuda_naive_bfloat16_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_nn_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_in_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_in_cuda_naive_double_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_in_cuda_naive_double_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_in_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_in_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_in_cuda_naive_float_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_in_cuda_naive_float_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_in_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_in_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_in_cuda_naive_half_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_in_cuda_naive_half_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_in_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_in_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_in_cuda_naive_bfloat16_cm_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal)) { \ + naive::na1d_in_cuda_naive_bfloat16_cm_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_in_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_in_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_double_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_double_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_double_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_double_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_in_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_in_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_float_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_float_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_float_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_float_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_in_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_in_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_half_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_half_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_half_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_half_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_in_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_in_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_bfloat16_cm_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_bfloat16_cm_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_bfloat16_cm_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal)) { \ + naive::na2d_in_cuda_naive_bfloat16_cm_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_in_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_in_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_double_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_double_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_double_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_double_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_double_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_double_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_double_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_double_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_in_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_in_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_float_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_float_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_float_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_float_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_float_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_float_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_float_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_float_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_in_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_in_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_half_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_half_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_half_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_half_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_half_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_half_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_half_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_half_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_in_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_in_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_bfloat16_cm_0_0_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_bfloat16_cm_0_0_1(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_bfloat16_cm_0_1_0(__VA_ARGS__); \ + } \ + else if (!std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_bfloat16_cm_0_1_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_bfloat16_cm_1_0_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && !std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_bfloat16_cm_1_0_1(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_bfloat16_cm_1_1_0(__VA_ARGS__); \ + } \ + else if (std::get<0>(is_causal) && std::get<1>(is_causal) && std::get<2>(is_causal)) { \ + naive::na3d_in_cuda_naive_bfloat16_cm_1_1_1(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_in_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_rpbgrad_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_rpbgrad_cuda_naive_double_cm_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_rpbgrad_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_rpbgrad_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_rpbgrad_cuda_naive_float_cm_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_rpbgrad_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_rpbgrad_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_rpbgrad_cuda_naive_half_cm_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_rpbgrad_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na1d_rpbgrad_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal)) { \ + naive::na1d_rpbgrad_cuda_naive_bfloat16_cm_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na1d_rpbgrad_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_rpbgrad_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_rpbgrad_cuda_naive_double_cm_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_rpbgrad_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_rpbgrad_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_rpbgrad_cuda_naive_float_cm_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_rpbgrad_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_rpbgrad_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_rpbgrad_cuda_naive_half_cm_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_rpbgrad_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na2d_rpbgrad_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal)) { \ + naive::na2d_rpbgrad_cuda_naive_bfloat16_cm_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na2d_rpbgrad_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_rpbgrad_cuda_naive_double(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_rpbgrad_cuda_naive_double_cm_0_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_rpbgrad_cuda_naive_double got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_rpbgrad_cuda_naive_float(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_rpbgrad_cuda_naive_float_cm_0_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_rpbgrad_cuda_naive_float got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_rpbgrad_cuda_naive_half(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_rpbgrad_cuda_naive_half_cm_0_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_rpbgrad_cuda_naive_half got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + +#define DISPATCH_CM_na3d_rpbgrad_cuda_naive_bfloat16(is_causal, ...) \ + [&] { \ + if (!std::get<0>(is_causal) && !std::get<1>(is_causal) && !std::get<2>(is_causal)) { \ + naive::na3d_rpbgrad_cuda_naive_bfloat16_cm_0_0_0(__VA_ARGS__); \ + } \ + else { \ + std::cerr << "NATTEN kernel launch failed!" \ + << "na3d_rpbgrad_cuda_naive_bfloat16 got invalid causal mask!" \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ +}(); + + + +} // namespace natten +} // namespace cuda +} // namespace naive + diff --git a/csrc/autogen/include/natten_autogen/cuda/naive/dispatch_di.h b/csrc/autogen/include/natten_autogen/cuda/naive/dispatch_di.h deleted file mode 100644 index afefcf7..0000000 --- a/csrc/autogen/include/natten_autogen/cuda/naive/dispatch_di.h +++ /dev/null @@ -1,4216 +0,0 @@ -#pragma once - - -#include -#include -#include -#include -namespace natten { -namespace cuda { -namespace naive { -#define DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_pn_bias_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_pn_bias_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_pn_bias_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_nn_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_nn_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_nn_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_in_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_in_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_in_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_in_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_in_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_in_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na1d_rpbgrad_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na2d_rpbgrad_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_double_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_float_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_half_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_any(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_any_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_any_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_3(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_3_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_3_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_5(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_5_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_5_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_7(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_7_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_7_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_9(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_9_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_9_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_11(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_11_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_11_di_any(__VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_13(dilation, ...) \ - [&] { \ - if (dilation == 1) { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_13_di_1(__VA_ARGS__); \ - } \ - else { \ - naive::na3d_rpbgrad_cuda_naive_bfloat16_ks_13_di_any(__VA_ARGS__); \ - } \ -}(); - - - -} // namespace {namespace} -} // namespace {namespace} -} // namespace {namespace} - diff --git a/csrc/autogen/include/natten_autogen/cuda/naive/dispatch_ks.h b/csrc/autogen/include/natten_autogen/cuda/naive/dispatch_ks.h deleted file mode 100644 index e362ef4..0000000 --- a/csrc/autogen/include/natten_autogen/cuda/naive/dispatch_ks.h +++ /dev/null @@ -1,1516 +0,0 @@ -#pragma once - - -#include -#include -#include -#include -namespace natten { -namespace cuda { -namespace naive { -#define DISPATCH_KERNEL_na1d_pn_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_pn_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_pn_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_pn_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_pn_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_pn_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_pn_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_pn_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_pn_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_pn_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_pn_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_pn_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_pn_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_pn_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_pn_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_pn_bias_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_pn_bias_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_pn_bias_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_pn_bias_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_pn_bias_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_pn_bias_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_pn_bias_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_pn_bias_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_pn_bias_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_pn_bias_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_pn_bias_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_pn_bias_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_pn_bias_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_pn_bias_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_pn_bias_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_nn_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_nn_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_nn_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_nn_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_nn_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_nn_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_nn_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_nn_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_nn_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_nn_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_nn_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_nn_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_nn_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_nn_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_nn_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_in_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_in_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_in_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_in_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_in_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_in_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_in_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_in_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_in_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_in_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_in_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_in_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_in_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_in_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_in_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_in_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_in_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_in_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_in_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_in_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_in_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_in_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_in_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_in_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_rpbgrad_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_rpbgrad_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_rpbgrad_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na1d_rpbgrad_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na1d_rpbgrad_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_rpbgrad_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_rpbgrad_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_rpbgrad_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na2d_rpbgrad_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na2d_rpbgrad_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_rpbgrad_cuda_naive_double(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_double_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_rpbgrad_cuda_naive_float(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_float_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_rpbgrad_cuda_naive_half(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_half_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - -#define DISPATCH_KERNEL_na3d_rpbgrad_cuda_naive_bfloat16(kernel_size, dilation, ...) \ - [&] { \ - if (kernel_size == 3) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_3(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 5) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_5(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 7) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_7(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 9) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_9(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 11) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_11(dilation, __VA_ARGS__); \ - } \ - else if (kernel_size == 13) { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_13(dilation, __VA_ARGS__); \ - } \ - else { \ - DISPATCH_DILATION_na3d_rpbgrad_cuda_naive_bfloat16_ks_any(dilation, __VA_ARGS__); \ - } \ -}(); - - - -} // namespace {namespace} -} // namespace {namespace} -} // namespace {namespace} - diff --git a/csrc/autogen/include/natten_autogen/cuda/naive/interface.h b/csrc/autogen/include/natten_autogen/cuda/naive/interface.h index f85241c..8624daf 100644 --- a/csrc/autogen/include/natten_autogen/cuda/naive/interface.h +++ b/csrc/autogen/include/natten_autogen/cuda/naive/interface.h @@ -4,23 +4,23 @@ #include #include #include -#include +#include namespace natten { namespace cuda { namespace naive { -#define DISPATCH_DTYPE_na1d_pn_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na1d_pn_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_pn_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_pn_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_pn_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_pn_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_pn_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_pn_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_pn_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_pn_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -30,19 +30,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na2d_pn_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na2d_pn_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_pn_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_pn_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_pn_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_pn_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_pn_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_pn_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_pn_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_pn_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -52,19 +52,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na3d_pn_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na3d_pn_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_pn_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_pn_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_pn_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_pn_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_pn_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_pn_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_pn_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_pn_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -74,19 +74,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na1d_pn_bias_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na1d_pn_bias_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_pn_bias_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_pn_bias_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_pn_bias_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_pn_bias_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_pn_bias_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_pn_bias_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_pn_bias_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_pn_bias_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -96,19 +96,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na2d_pn_bias_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na2d_pn_bias_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_pn_bias_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_pn_bias_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_pn_bias_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_pn_bias_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_pn_bias_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_pn_bias_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_pn_bias_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_pn_bias_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -118,19 +118,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na3d_pn_bias_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na3d_pn_bias_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_pn_bias_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_pn_bias_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_pn_bias_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_pn_bias_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_pn_bias_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_pn_bias_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_pn_bias_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_pn_bias_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -140,19 +140,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na1d_nn_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na1d_nn_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_nn_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_nn_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_nn_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_nn_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_nn_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_nn_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_nn_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_nn_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -162,19 +162,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na2d_nn_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na2d_nn_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_nn_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_nn_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_nn_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_nn_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_nn_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_nn_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_nn_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_nn_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -184,19 +184,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na3d_nn_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na3d_nn_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_nn_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_nn_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_nn_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_nn_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_nn_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_nn_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_nn_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_nn_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -206,19 +206,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na1d_in_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na1d_in_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_in_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_in_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_in_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_in_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_in_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_in_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_in_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_in_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -228,19 +228,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na2d_in_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na2d_in_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_in_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_in_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_in_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_in_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_in_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_in_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_in_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_in_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -250,19 +250,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na3d_in_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na3d_in_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_in_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_in_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_in_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_in_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_in_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_in_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_in_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_in_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -272,19 +272,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na1d_rpbgrad_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na1d_rpbgrad_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_rpbgrad_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_rpbgrad_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_rpbgrad_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_rpbgrad_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_rpbgrad_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_rpbgrad_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na1d_rpbgrad_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na1d_rpbgrad_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -294,19 +294,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na2d_rpbgrad_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na2d_rpbgrad_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_rpbgrad_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_rpbgrad_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_rpbgrad_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_rpbgrad_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_rpbgrad_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_rpbgrad_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na2d_rpbgrad_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na2d_rpbgrad_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -316,19 +316,19 @@ namespace naive { } \ }(); -#define DISPATCH_DTYPE_na3d_rpbgrad_cuda_naive(dtype, kernel_size, dilation, ...) \ +#define DISPATCH_DTYPE_na3d_rpbgrad_cuda_naive(dtype, is_causal, ...) \ [&] { \ if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_rpbgrad_cuda_naive_double(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_rpbgrad_cuda_naive_double(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_rpbgrad_cuda_naive_float(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_rpbgrad_cuda_naive_float(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_rpbgrad_cuda_naive_half(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_rpbgrad_cuda_naive_half(is_causal, __VA_ARGS__); \ } \ else if (std::is_same::value) { \ - DISPATCH_KERNEL_na3d_rpbgrad_cuda_naive_bfloat16(kernel_size, dilation, __VA_ARGS__); \ + DISPATCH_CM_na3d_rpbgrad_cuda_naive_bfloat16(is_causal, __VA_ARGS__); \ } \ else { \ std::cerr << "NATTEN kernel launch failed!" \ @@ -340,7 +340,7 @@ namespace naive { -} // namespace {namespace} -} // namespace {namespace} -} // namespace {namespace} +} // namespace natten +} // namespace cuda +} // namespace naive diff --git a/csrc/autogen/include/natten_autogen/cuda/naive/kernels.h b/csrc/autogen/include/natten_autogen/cuda/naive/kernels.h index 9ce4638..06ea164 100644 --- a/csrc/autogen/include/natten_autogen/cuda/naive/kernels.h +++ b/csrc/autogen/include/natten_autogen/cuda/naive/kernels.h @@ -7,15689 +7,3665 @@ namespace natten { namespace cuda { namespace naive { -void na1d_pn_cuda_naive_double_ks_any_di_any( - const int cc, +void na1d_pn_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_any_di_1( - const int cc, +void na1d_pn_cuda_naive_double_cm_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_3_di_any( - const int cc, +void na1d_pn_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_3_di_1( - const int cc, +void na1d_pn_cuda_naive_float_cm_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_5_di_any( - const int cc, +void na1d_pn_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_5_di_1( - const int cc, +void na1d_pn_cuda_naive_half_cm_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_7_di_any( - const int cc, +void na1d_pn_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_7_di_1( - const int cc, +void na1d_pn_cuda_naive_bfloat16_cm_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_9_di_any( - const int cc, +void na2d_pn_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_9_di_1( - const int cc, +void na2d_pn_cuda_naive_double_cm_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_11_di_any( - const int cc, +void na2d_pn_cuda_naive_double_cm_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_11_di_1( - const int cc, +void na2d_pn_cuda_naive_double_cm_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_13_di_any( - const int cc, +void na2d_pn_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_double_ks_13_di_1( - const int cc, +void na2d_pn_cuda_naive_float_cm_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_any_di_any( - const int cc, +void na2d_pn_cuda_naive_float_cm_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_any_di_1( - const int cc, +void na2d_pn_cuda_naive_float_cm_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_3_di_any( - const int cc, +void na2d_pn_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_3_di_1( - const int cc, +void na2d_pn_cuda_naive_half_cm_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_5_di_any( - const int cc, +void na2d_pn_cuda_naive_half_cm_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_5_di_1( - const int cc, +void na2d_pn_cuda_naive_half_cm_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_7_di_any( - const int cc, +void na2d_pn_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_7_di_1( - const int cc, +void na2d_pn_cuda_naive_bfloat16_cm_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_9_di_any( - const int cc, +void na2d_pn_cuda_naive_bfloat16_cm_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_9_di_1( - const int cc, +void na2d_pn_cuda_naive_bfloat16_cm_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_11_di_any( - const int cc, +void na3d_pn_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_11_di_1( - const int cc, +void na3d_pn_cuda_naive_double_cm_0_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_13_di_any( - const int cc, +void na3d_pn_cuda_naive_double_cm_0_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_float_ks_13_di_1( - const int cc, +void na3d_pn_cuda_naive_double_cm_0_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_any_di_any( - const int cc, +void na3d_pn_cuda_naive_double_cm_1_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_any_di_1( - const int cc, +void na3d_pn_cuda_naive_double_cm_1_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_3_di_any( - const int cc, +void na3d_pn_cuda_naive_double_cm_1_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_3_di_1( - const int cc, +void na3d_pn_cuda_naive_double_cm_1_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_5_di_any( - const int cc, +void na3d_pn_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_5_di_1( - const int cc, +void na3d_pn_cuda_naive_float_cm_0_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_7_di_any( - const int cc, +void na3d_pn_cuda_naive_float_cm_0_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_7_di_1( - const int cc, +void na3d_pn_cuda_naive_float_cm_0_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_9_di_any( - const int cc, +void na3d_pn_cuda_naive_float_cm_1_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_9_di_1( - const int cc, +void na3d_pn_cuda_naive_float_cm_1_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_11_di_any( - const int cc, +void na3d_pn_cuda_naive_float_cm_1_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_11_di_1( - const int cc, +void na3d_pn_cuda_naive_float_cm_1_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_13_di_any( - const int cc, +void na3d_pn_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_half_ks_13_di_1( - const int cc, +void na3d_pn_cuda_naive_half_cm_0_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, +void na3d_pn_cuda_naive_half_cm_0_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, +void na3d_pn_cuda_naive_half_cm_0_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, +void na3d_pn_cuda_naive_half_cm_1_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, +void na3d_pn_cuda_naive_half_cm_1_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, +void na3d_pn_cuda_naive_half_cm_1_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, +void na3d_pn_cuda_naive_half_cm_1_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_0_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_0_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_0_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_1_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_1_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_1_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na1d_pn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_1_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation); + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_any_di_any( - const int cc, +void na1d_pn_bias_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_any_di_1( - const int cc, +void na1d_pn_bias_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_3_di_any( - const int cc, +void na1d_pn_bias_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_3_di_1( - const int cc, +void na1d_pn_bias_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_5_di_any( - const int cc, +void na2d_pn_bias_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_5_di_1( - const int cc, +void na2d_pn_bias_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_7_di_any( - const int cc, +void na2d_pn_bias_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_7_di_1( - const int cc, +void na2d_pn_bias_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_9_di_any( - const int cc, +void na3d_pn_bias_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_9_di_1( - const int cc, +void na3d_pn_bias_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_11_di_any( - const int cc, +void na3d_pn_bias_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_11_di_1( - const int cc, +void na3d_pn_bias_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_13_di_any( - const int cc, +void na1d_nn_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_double_ks_13_di_1( - const int cc, +void na1d_nn_cuda_naive_double_cm_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_any_di_any( - const int cc, +void na1d_nn_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_any_di_1( - const int cc, +void na1d_nn_cuda_naive_float_cm_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_3_di_any( - const int cc, +void na1d_nn_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_3_di_1( - const int cc, +void na1d_nn_cuda_naive_half_cm_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_5_di_any( - const int cc, +void na1d_nn_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_5_di_1( - const int cc, +void na1d_nn_cuda_naive_bfloat16_cm_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_7_di_any( - const int cc, +void na2d_nn_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_7_di_1( - const int cc, +void na2d_nn_cuda_naive_double_cm_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_9_di_any( - const int cc, +void na2d_nn_cuda_naive_double_cm_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_9_di_1( - const int cc, +void na2d_nn_cuda_naive_double_cm_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_11_di_any( - const int cc, +void na2d_nn_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_11_di_1( - const int cc, +void na2d_nn_cuda_naive_float_cm_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_13_di_any( - const int cc, +void na2d_nn_cuda_naive_float_cm_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_float_ks_13_di_1( - const int cc, +void na2d_nn_cuda_naive_float_cm_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_any_di_any( - const int cc, +void na2d_nn_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_any_di_1( - const int cc, +void na2d_nn_cuda_naive_half_cm_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_3_di_any( - const int cc, +void na2d_nn_cuda_naive_half_cm_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_3_di_1( - const int cc, +void na2d_nn_cuda_naive_half_cm_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_5_di_any( - const int cc, +void na2d_nn_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_5_di_1( - const int cc, +void na2d_nn_cuda_naive_bfloat16_cm_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_7_di_any( - const int cc, +void na2d_nn_cuda_naive_bfloat16_cm_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_7_di_1( - const int cc, +void na2d_nn_cuda_naive_bfloat16_cm_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_9_di_any( - const int cc, +void na3d_nn_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_9_di_1( - const int cc, +void na3d_nn_cuda_naive_double_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_11_di_any( - const int cc, +void na3d_nn_cuda_naive_double_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_11_di_1( - const int cc, +void na3d_nn_cuda_naive_double_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_13_di_any( - const int cc, +void na3d_nn_cuda_naive_double_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_half_ks_13_di_1( - const int cc, +void na3d_nn_cuda_naive_double_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, +void na3d_nn_cuda_naive_double_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, +void na3d_nn_cuda_naive_double_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, +void na3d_nn_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, +void na3d_nn_cuda_naive_float_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, +void na3d_nn_cuda_naive_float_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, +void na3d_nn_cuda_naive_float_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, +void na3d_nn_cuda_naive_float_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, +void na3d_nn_cuda_naive_float_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, +void na3d_nn_cuda_naive_float_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, +void na3d_nn_cuda_naive_float_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, +void na3d_nn_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, +void na3d_nn_cuda_naive_half_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, +void na3d_nn_cuda_naive_half_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na2d_pn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, +void na3d_nn_cuda_naive_half_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation); + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_any_di_any( - const int cc, +void na3d_nn_cuda_naive_half_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_any_di_1( - const int cc, +void na3d_nn_cuda_naive_half_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_3_di_any( - const int cc, +void na3d_nn_cuda_naive_half_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_3_di_1( - const int cc, +void na3d_nn_cuda_naive_half_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_5_di_any( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_5_di_1( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_7_di_any( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_7_di_1( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_9_di_any( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_9_di_1( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_11_di_any( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_11_di_1( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * value_ptr, + void * output_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_13_di_any( - const int cc, +void na1d_in_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_double_ks_13_di_1( - const int cc, +void na1d_in_cuda_naive_double_cm_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_any_di_any( - const int cc, +void na1d_in_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_any_di_1( - const int cc, +void na1d_in_cuda_naive_float_cm_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_3_di_any( - const int cc, +void na1d_in_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_3_di_1( - const int cc, +void na1d_in_cuda_naive_half_cm_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_5_di_any( - const int cc, +void na1d_in_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_5_di_1( - const int cc, +void na1d_in_cuda_naive_bfloat16_cm_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_7_di_any( - const int cc, +void na2d_in_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_7_di_1( - const int cc, +void na2d_in_cuda_naive_double_cm_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_9_di_any( - const int cc, +void na2d_in_cuda_naive_double_cm_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_9_di_1( - const int cc, +void na2d_in_cuda_naive_double_cm_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_11_di_any( - const int cc, +void na2d_in_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_11_di_1( - const int cc, +void na2d_in_cuda_naive_float_cm_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_13_di_any( - const int cc, +void na2d_in_cuda_naive_float_cm_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_float_ks_13_di_1( - const int cc, +void na2d_in_cuda_naive_float_cm_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_any_di_any( - const int cc, +void na2d_in_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_any_di_1( - const int cc, +void na2d_in_cuda_naive_half_cm_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_3_di_any( - const int cc, +void na2d_in_cuda_naive_half_cm_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_3_di_1( - const int cc, +void na2d_in_cuda_naive_half_cm_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_5_di_any( - const int cc, +void na2d_in_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_5_di_1( - const int cc, +void na2d_in_cuda_naive_bfloat16_cm_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_7_di_any( - const int cc, +void na2d_in_cuda_naive_bfloat16_cm_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_7_di_1( - const int cc, +void na2d_in_cuda_naive_bfloat16_cm_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_9_di_any( - const int cc, +void na3d_in_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_9_di_1( - const int cc, +void na3d_in_cuda_naive_double_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_11_di_any( - const int cc, +void na3d_in_cuda_naive_double_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_11_di_1( - const int cc, +void na3d_in_cuda_naive_double_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_13_di_any( - const int cc, +void na3d_in_cuda_naive_double_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_half_ks_13_di_1( - const int cc, +void na3d_in_cuda_naive_double_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, +void na3d_in_cuda_naive_double_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, +void na3d_in_cuda_naive_double_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_pn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, +void na3d_in_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na1d_pn_bias_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_pn_bias_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_pn_bias_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na3d_pn_bias_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_pn_bias_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na1d_nn_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_nn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_nn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na3d_nn_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_nn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na1d_in_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_in_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_in_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na3d_in_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_in_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na1d_rpbgrad_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation); - -void na3d_rpbgrad_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); - -void na3d_rpbgrad_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_float_ks_7_di_1( - const int cc, +void na3d_in_cuda_naive_float_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_float_ks_9_di_any( - const int cc, +void na3d_in_cuda_naive_float_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_float_ks_9_di_1( - const int cc, +void na3d_in_cuda_naive_float_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_float_ks_11_di_any( - const int cc, +void na3d_in_cuda_naive_float_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_float_ks_11_di_1( - const int cc, +void na3d_in_cuda_naive_float_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_float_ks_13_di_any( - const int cc, +void na3d_in_cuda_naive_float_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_float_ks_13_di_1( - const int cc, +void na3d_in_cuda_naive_float_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_any_di_any( - const int cc, +void na3d_in_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_any_di_1( - const int cc, +void na3d_in_cuda_naive_half_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_3_di_any( - const int cc, +void na3d_in_cuda_naive_half_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_3_di_1( - const int cc, +void na3d_in_cuda_naive_half_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_5_di_any( - const int cc, +void na3d_in_cuda_naive_half_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_5_di_1( - const int cc, +void na3d_in_cuda_naive_half_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_7_di_any( - const int cc, +void na3d_in_cuda_naive_half_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_7_di_1( - const int cc, +void na3d_in_cuda_naive_half_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_9_di_any( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_9_di_1( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_11_di_any( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_11_di_1( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_13_di_any( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_half_ks_13_di_1( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_any_di_any( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_any_di_1( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_3_di_any( - const int cc, +void na1d_rpbgrad_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_3_di_1( - const int cc, +void na1d_rpbgrad_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_5_di_any( - const int cc, +void na1d_rpbgrad_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_5_di_1( - const int cc, +void na1d_rpbgrad_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_7_di_any( - const int cc, +void na2d_rpbgrad_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_7_di_1( - const int cc, +void na2d_rpbgrad_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_9_di_any( - const int cc, +void na2d_rpbgrad_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_9_di_1( - const int cc, +void na2d_rpbgrad_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_11_di_any( - const int cc, +void na3d_rpbgrad_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_11_di_1( - const int cc, +void na3d_rpbgrad_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_13_di_any( - const int cc, +void na3d_rpbgrad_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -void na3d_rpbgrad_cuda_naive_bfloat16_ks_13_di_1( - const int cc, +void na3d_rpbgrad_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d); + const std::tuple& kernel_size, + const std::tuple& dilation); -} // namespace {namespace} -} // namespace {namespace} -} // namespace {namespace} +} // namespace natten +} // namespace cuda +} // namespace naive diff --git a/csrc/autogen/src/cpu/naive/source_0.cpp b/csrc/autogen/src/cpu/naive/source_0.cpp index 0f24746..6893809 100644 --- a/csrc/autogen/src/cpu/naive/source_0.cpp +++ b/csrc/autogen/src/cpu/naive/source_0.cpp @@ -1,141 +1,149 @@ #include -#include #include #include -#include +#include #include +#include namespace natten { namespace cpu { namespace naive { void na1d_pn_cpu_naive_double( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na1d_pn_cpu_naive_float( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na2d_pn_cpu_naive_double( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } void na2d_pn_cpu_naive_float( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } void na3d_pn_cpu_naive_double( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } void na3d_pn_cpu_naive_float( + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } void na1d_pn_bias_cpu_naive_double( @@ -143,19 +151,20 @@ void na1d_pn_bias_cpu_naive_double( void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood1DWithBias; Kernel kernel; kernel( -query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na1d_pn_bias_cpu_naive_float( @@ -163,19 +172,20 @@ void na1d_pn_bias_cpu_naive_float( void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood1DWithBias; Kernel kernel; kernel( -query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na2d_pn_bias_cpu_naive_double( @@ -183,21 +193,22 @@ void na2d_pn_bias_cpu_naive_double( void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood2DWithBias; Kernel kernel; kernel( -query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } void na2d_pn_bias_cpu_naive_float( @@ -205,21 +216,22 @@ void na2d_pn_bias_cpu_naive_float( void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood2DWithBias; Kernel kernel; kernel( -query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } void na3d_pn_bias_cpu_naive_double( @@ -227,25 +239,24 @@ void na3d_pn_bias_cpu_naive_double( void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood3DWithBias; Kernel kernel; kernel( -query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } void na3d_pn_bias_cpu_naive_float( @@ -253,84 +264,86 @@ void na3d_pn_bias_cpu_naive_float( void * key_ptr, void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = PointwiseNeighborhood3DWithBias; Kernel kernel; kernel( -query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } void na1d_nn_cpu_naive_double( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na1d_nn_cpu_naive_float( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na2d_nn_cpu_naive_double( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } } diff --git a/csrc/autogen/src/cpu/naive/source_1.cpp b/csrc/autogen/src/cpu/naive/source_1.cpp index b61cfad..142fcaa 100644 --- a/csrc/autogen/src/cpu/naive/source_1.cpp +++ b/csrc/autogen/src/cpu/naive/source_1.cpp @@ -1,12 +1,12 @@ #include -#include -#include #include -#include -#include #include +#include #include +#include +#include #include +#include namespace natten { namespace cpu { namespace naive { @@ -15,325 +15,328 @@ void na2d_nn_cpu_naive_float( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } void na3d_nn_cpu_naive_double( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } void na3d_nn_cpu_naive_float( void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } void na1d_in_cpu_naive_double( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na1d_in_cpu_naive_float( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na2d_in_cpu_naive_double( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } void na2d_in_cpu_naive_float( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } void na3d_in_cpu_naive_double( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } void na3d_in_cpu_naive_float( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } void na1d_rpbgrad_cpu_naive_double( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = RelPosBiasGradient1D; Kernel kernel; kernel( -d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na1d_rpbgrad_cpu_naive_float( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = RelPosBiasGradient1D; Kernel kernel; kernel( -d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation, is_causal); } void na2d_rpbgrad_cpu_naive_double( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = RelPosBiasGradient2D; Kernel kernel; kernel( -d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } void na2d_rpbgrad_cpu_naive_float( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = RelPosBiasGradient2D; Kernel kernel; kernel( -d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, is_causal); } void na3d_rpbgrad_cpu_naive_double( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = RelPosBiasGradient3D; Kernel kernel; kernel( -d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } void na3d_rpbgrad_cpu_naive_float( void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { using Kernel = RelPosBiasGradient3D; Kernel kernel; kernel( -d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, is_causal); } } diff --git a/csrc/autogen/src/cuda/fna/source_0.cu b/csrc/autogen/src/cuda/fna/source_0.cu new file mode 100644 index 0000000..aa069fc --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_0.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm50_float32_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm50_float32_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm50_float32_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm50_float16_cm_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm50_float16_cm_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm50_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm50_float16_cm_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm70_float32_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm70_float32_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm70_float32_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm70_float16_cm_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_1.cu b/csrc/autogen/src/cuda/fna/source_1.cu new file mode 100644 index 0000000..e0ebca4 --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_1.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm70_float16_cm_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm70_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm70_float16_cm_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm75_float32_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm75_float32_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm75_float32_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm75_float16_cm_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm75_float16_cm_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm75_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm75_float16_cm_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float32_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm80_float32_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float32_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm80_float32_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_10.cu b/csrc/autogen/src/cuda/fna/source_10.cu new file mode 100644 index 0000000..48d1041 --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_10.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float16_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float16_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float16_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float16_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float16_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float16_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float16_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float16_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float32_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float32_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_11.cu b/csrc/autogen/src/cuda/fna/source_11.cu new file mode 100644 index 0000000..c4fc950 --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_11.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float32_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float32_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float32_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float32_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float32_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float32_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float32_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float16_cm_0_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float16_cm_0_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float16_cm_0_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_12.cu b/csrc/autogen/src/cuda/fna/source_12.cu new file mode 100644 index 0000000..e770d0f --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_12.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float16_cm_0_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float16_cm_0_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float16_cm_1_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float16_cm_1_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float16_cm_1_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm75_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm75_float16_cm_1_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float32_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float32_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float32_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float32_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_13.cu b/csrc/autogen/src/cuda/fna/source_13.cu new file mode 100644 index 0000000..c6b600d --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_13.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float32_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float32_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float32_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float32_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float32_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_14.cu b/csrc/autogen/src/cuda/fna/source_14.cu new file mode 100644 index 0000000..43f111d --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_14.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_float16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_bfloat16_cm_0_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_bfloat16_cm_0_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_bfloat16_cm_0_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_bfloat16_cm_0_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_bfloat16_cm_0_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_bfloat16_cm_1_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_15.cu b/csrc/autogen/src/cuda/fna/source_15.cu new file mode 100644 index 0000000..694c092 --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_15.cu @@ -0,0 +1,781 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_bfloat16_cm_1_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_bfloat16_cm_1_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm80_bfloat16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm80_bfloat16_cm_1_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_2.cu b/csrc/autogen/src/cuda/fna/source_2.cu new file mode 100644 index 0000000..7160a2a --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_2.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float32_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm80_float32_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm80_float16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm80_float16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_float16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm80_float16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_bfloat16_cm_0(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm80_bfloat16_cm_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna1_32x128x32_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna1_64x64x32_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna1_64x128x32_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna1_32x128x64_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna1_64x64x64_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna1_64x128x64_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna1_32x128x128_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna1_64x64x128_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna1_64x128x128_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_bfloat16_cm_0_rpb(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm80_bfloat16_cm_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-1D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna1_32x128x32_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x32_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna1_64x64x32_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x32_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna1_64x128x32_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x32_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna1_32x128x64_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x64_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna1_64x64x64_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x64_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna1_64x128x64_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x64_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna1_32x128x128_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x128_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna1_64x64x128_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x128_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna1_64x128x128_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x128_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna1_32x128x65536_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_32x128x65536_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna1_64x128x65536_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x128x65536_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna1_64x64x65536_sm80_bfloat16_cm_1(typename FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<1, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna1_64x64x65536_sm80_bfloat16_cm_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float32_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float32_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float32_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_3.cu b/csrc/autogen/src/cuda/fna/source_3.cu new file mode 100644 index 0000000..91e6312 --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_3.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float32_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float32_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float16_cm_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float16_cm_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float16_cm_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float16_cm_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm50_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm50_float16_cm_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float32_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float32_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float32_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_4.cu b/csrc/autogen/src/cuda/fna/source_4.cu new file mode 100644 index 0000000..476232d --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_4.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float32_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float32_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float16_cm_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float16_cm_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float16_cm_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float16_cm_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm70_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm70_float16_cm_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float32_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float32_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float32_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_5.cu b/csrc/autogen/src/cuda/fna/source_5.cu new file mode 100644 index 0000000..2d6e3bc --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_5.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float32_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float32_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float16_cm_0_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float16_cm_0_0_rpb` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float16_cm_0_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float16_cm_1_0` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM75 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm75_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 750 +#if __CUDA_ARCH__ < 800 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm75, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm75_float16_cm_1_1` was built for SM75, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float32_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float32_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float32_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_6.cu b/csrc/autogen/src/cuda/fna/source_6.cu new file mode 100644 index 0000000..083655b --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_6.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float32_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float32 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float32_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, float, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float32_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / float16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_float16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::half_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_float16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_0_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_bfloat16_cm_0_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_0_0_rpb(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_bfloat16_cm_0_0_rpb` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_0_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_bfloat16_cm_0_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_7.cu b/csrc/autogen/src/cuda/fna/source_7.cu new file mode 100644 index 0000000..68e5596 --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_7.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_1_0(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_bfloat16_cm_1_0` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-2D / bfloat16 / SM80 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna2_32x128x32_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x32_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna2_64x64x32_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x32_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna2_64x128x32_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x32_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna2_32x128x64_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x64_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna2_64x64x64_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x64_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna2_64x128x64_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x64_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna2_32x128x128_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x128_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna2_64x64x128_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x128_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna2_64x128x128_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x128_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna2_32x128x65536_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_32x128x65536_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna2_64x128x65536_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x128x65536_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna2_64x64x65536_sm80_bfloat16_cm_1_1(typename FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 800 +#if __CUDA_ARCH__ < 1000 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<2, CausalMask, cutlass::bfloat16_t, cutlass::arch::Sm80, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna2_64x64x65536_sm80_bfloat16_cm_1_1` was built for SM80, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float32_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float32_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float32_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float32_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float32_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float32_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float32_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float32_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_8.cu b/csrc/autogen/src/cuda/fna/source_8.cu new file mode 100644 index 0000000..39fa083 --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_8.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float32_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float16_cm_0_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float16_cm_0_0_0_rpb` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float16_cm_0_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float16_cm_0_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float16_cm_0_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float16_cm_1_0_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float16_cm_1_0_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float16_cm_1_1_0` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM50 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm50_float16_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 500 +#if __CUDA_ARCH__ < 700 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm50, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm50_float16_cm_1_1_1` was built for SM50, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/fna/source_9.cu b/csrc/autogen/src/cuda/fna/source_9.cu new file mode 100644 index 0000000..84107fc --- /dev/null +++ b/csrc/autogen/src/cuda/fna/source_9.cu @@ -0,0 +1,2573 @@ +#include +#include +#include +#include +#include +namespace natten { +namespace cuda { +namespace fna { + + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float32_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_0_0_rpb(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, true>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float32_cm_0_0_0_rpb` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float32_cm_0_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float32_cm_0_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_0_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float32_cm_0_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_1_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float32_cm_1_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_1_0_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float32_cm_1_0_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_1_1_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float32_cm_1_1_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float32 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float32_cm_1_1_1(typename FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, float, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float32_cm_1_1_1` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +/////////////////////////////////////////////////////////////////// +// FNA-3D / float16 / SM70 +/////////////////////////////////////////////////////////////////// + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::kMinBlocksPerSm) +fna3_32x128x32_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x32_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::kMinBlocksPerSm) +fna3_64x64x32_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x32_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::kMinBlocksPerSm) +fna3_64x128x32_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 32, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x32_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::kMinBlocksPerSm) +fna3_32x128x64_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x64_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::kMinBlocksPerSm) +fna3_64x64x64_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x64_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::kMinBlocksPerSm) +fna3_64x128x64_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 64, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x64_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::kMinBlocksPerSm) +fna3_32x128x128_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x128_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::kMinBlocksPerSm) +fna3_64x64x128_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x128_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::kMinBlocksPerSm) +fna3_64x128x128_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 128, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x128_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::kMinBlocksPerSm) +fna3_32x128x65536_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 32, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_32x128x65536_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::kMinBlocksPerSm) +fna3_64x128x65536_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 128, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x128x65536_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} + + +__global__ void __launch_bounds__( + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kNumThreads, + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::kMinBlocksPerSm) +fna3_64x64x65536_sm70_float16_cm_0_0_0(typename FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::Params p) { +#ifdef __CUDA_ARCH__ +#if __CUDA_ARCH__ >= 700 +#if __CUDA_ARCH__ < 750 + if (!p.advance_to_block()) { + return; + } + FusedNeighborhoodAttentionKernel<3, CausalMask, cutlass::half_t, cutlass::arch::Sm70, true, 64, 64, 65536, false>::attention_kernel(p); + return; +#endif +#endif + printf( + "FATAL: FNA kernel `fna3_64x64x65536_sm70_float16_cm_0_0_0` was built for SM70, but attempted to launch from SM%d\n", + int(__CUDA_ARCH__ + 0) / 10); +#endif +} +} +} +} + diff --git a/csrc/autogen/src/cuda/gemm/2d/sm70/source_0.cu b/csrc/autogen/src/cuda/gemm/2d/sm70/source_0.cu index 350736b..c789064 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm70/source_0.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm70/source_0.cu @@ -1,9 +1,9 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { @@ -1016,6 +1016,958 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 14, 1, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 14, 1, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 14, 1, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm70/source_1.cu b/csrc/autogen/src/cuda/gemm/2d/sm70/source_1.cu index e5763bb..2ca6dbe 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm70/source_1.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm70/source_1.cu @@ -1,14 +1,70 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +82,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -36,7 +92,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -54,7 +110,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -64,7 +120,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -82,7 +138,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -92,7 +148,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -110,7 +166,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -120,7 +176,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -138,7 +194,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -148,7 +204,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -166,7 +222,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -176,7 +232,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -194,7 +250,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -204,7 +260,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -222,7 +278,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -232,7 +288,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -250,7 +306,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -260,7 +316,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -278,7 +334,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -288,7 +344,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -306,7 +362,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -316,7 +372,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -334,7 +390,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -344,10 +400,11 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align8( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -361,20 +418,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align4( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -388,20 +446,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align2( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -415,20 +474,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align8( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -442,20 +502,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align4( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -469,20 +530,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align2( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -496,20 +558,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align8( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -523,20 +586,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align4( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -550,20 +614,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align2( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -577,17 +642,17 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -604,7 +669,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -614,7 +679,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -631,7 +696,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -641,7 +706,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -658,7 +723,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -668,7 +733,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -685,7 +750,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -695,7 +760,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -712,7 +777,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -722,7 +787,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -739,7 +804,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -749,7 +814,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -766,7 +831,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -776,7 +841,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -793,7 +858,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -803,7 +868,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -820,7 +885,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -830,7 +895,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -847,7 +912,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -857,7 +922,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -874,7 +939,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -884,7 +949,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -901,7 +966,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -911,7 +976,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -928,7 +993,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -938,7 +1003,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -955,7 +1020,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -965,7 +1030,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -982,7 +1047,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -992,6 +1057,870 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm70/source_2.cu b/csrc/autogen/src/cuda/gemm/2d/sm70/source_2.cu index 99b7c53..0fd20b2 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm70/source_2.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm70/source_2.cu @@ -1,14 +1,770 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks41_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks43_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks45_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks47_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks49_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks51_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +781,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +791,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -52,7 +808,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +818,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks53_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -79,7 +835,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +845,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -106,7 +862,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +872,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -133,7 +889,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +899,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks55_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -160,7 +916,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +926,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks21_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -187,7 +943,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +953,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -214,7 +970,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +980,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks57_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -241,7 +997,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +1007,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks23_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -268,7 +1024,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +1034,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -295,7 +1051,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +1061,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks59_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -322,7 +1078,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +1088,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks25_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -349,7 +1105,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +1115,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -376,7 +1132,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +1142,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks61_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -403,7 +1159,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -413,7 +1169,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks27_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -430,7 +1186,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -440,7 +1196,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -457,7 +1213,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -467,7 +1223,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks63_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -484,7 +1240,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -494,10 +1250,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks29_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -511,20 +1267,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -538,20 +1294,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -565,20 +1321,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -592,20 +1348,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -619,20 +1375,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -646,17 +1402,17 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_8x8x4_2_sm70_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 8, 8, 4, 2, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -673,7 +1429,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -683,7 +1439,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -700,7 +1456,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -710,7 +1466,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -727,7 +1483,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -737,7 +1493,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks3_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -754,7 +1510,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -764,7 +1520,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -781,7 +1537,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -791,7 +1547,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -808,7 +1564,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -818,7 +1574,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks5_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -835,7 +1591,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -845,7 +1601,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -862,7 +1618,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -872,7 +1628,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -889,7 +1645,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -899,7 +1655,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks7_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -916,7 +1672,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 6>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -926,7 +1682,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -943,7 +1699,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 6>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -953,7 +1709,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -970,7 +1726,169 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm70/source_3.cu b/csrc/autogen/src/cuda/gemm/2d/sm70/source_3.cu index 4ec67ab..27f1cef 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm70/source_3.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm70/source_3.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,7 +25,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +35,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -52,7 +52,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +62,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -79,7 +79,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +89,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks11_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -106,7 +106,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +116,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -133,7 +133,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +143,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -160,7 +160,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +170,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks13_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -187,7 +187,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +197,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -214,7 +214,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +224,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -241,7 +241,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +251,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks15_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -268,7 +268,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +278,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -295,7 +295,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +305,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -322,7 +322,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +332,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks17_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -349,7 +349,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +359,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -376,7 +376,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +386,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -403,7 +403,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -413,7 +413,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks19_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -430,7 +430,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -440,7 +440,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -457,7 +457,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -467,7 +467,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -484,7 +484,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -494,7 +494,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks21_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -511,7 +511,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 15>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -521,7 +521,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -538,7 +538,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 15>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -548,7 +548,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -565,7 +565,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 15>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -575,7 +575,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks23_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -592,7 +592,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 16>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -602,7 +602,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -619,7 +619,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 16>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -629,7 +629,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -646,7 +646,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 16>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -656,7 +656,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks25_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -673,7 +673,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -683,7 +683,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -700,7 +700,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -710,7 +710,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks35_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -727,7 +727,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -737,7 +737,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks27_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -754,7 +754,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -764,7 +764,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -781,7 +781,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -791,7 +791,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks37_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -808,7 +808,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -818,7 +818,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks29_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -835,7 +835,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -845,7 +845,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -862,7 +862,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -872,7 +872,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks39_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -889,7 +889,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -899,7 +899,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks31_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -916,7 +916,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -926,7 +926,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -943,7 +943,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -953,7 +953,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks41_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -970,7 +970,898 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks43_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks45_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks47_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks49_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks51_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks53_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 27>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 27>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks55_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 27>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 28>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 28>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks57_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 28>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks59_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks61_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_8x8x4_2_sm70_ks63_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 8, 8, 4, 2, 8, 4, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<70, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm75/source_0.cu b/csrc/autogen/src/cuda/gemm/2d/sm75/source_0.cu index 44b1217..7f8aeb0 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm75/source_0.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm75/source_0.cu @@ -1,9 +1,9 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { @@ -1016,6 +1016,958 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 14, 1, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 14, 1, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 14, 1, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm75/source_1.cu b/csrc/autogen/src/cuda/gemm/2d/sm75/source_1.cu index b545714..9dd7263 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm75/source_1.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm75/source_1.cu @@ -1,14 +1,70 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +82,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -36,7 +92,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -54,7 +110,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -64,7 +120,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -82,7 +138,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -92,7 +148,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -110,7 +166,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -120,7 +176,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -138,7 +194,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -148,7 +204,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -166,7 +222,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -176,7 +232,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -194,7 +250,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -204,7 +260,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -222,7 +278,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -232,7 +288,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -250,7 +306,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -260,7 +316,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -278,7 +334,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -288,7 +344,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -306,7 +362,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -316,7 +372,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -334,7 +390,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -344,10 +400,11 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align8( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -361,20 +418,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align4( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -388,20 +446,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align2( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -415,20 +474,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align8( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -442,20 +502,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align4( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -469,20 +530,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align2( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -496,20 +558,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align8( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -523,20 +586,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align4( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -550,20 +614,21 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align2( + void * query_ptr, + void * key_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * bias_ptr, int batch_size, int heads, int height, @@ -577,17 +642,17 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -604,7 +669,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -614,7 +679,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -631,7 +696,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -641,7 +706,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -658,7 +723,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -668,7 +733,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -685,7 +750,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -695,7 +760,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -712,7 +777,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -722,7 +787,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -739,7 +804,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -749,7 +814,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -766,7 +831,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -776,7 +841,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -793,7 +858,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -803,7 +868,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -820,7 +885,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -830,7 +895,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -847,7 +912,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -857,7 +922,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -874,7 +939,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -884,7 +949,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -901,7 +966,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -911,7 +976,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -928,7 +993,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -938,7 +1003,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -955,7 +1020,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -965,7 +1030,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -982,7 +1047,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -992,6 +1057,870 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm75/source_2.cu b/csrc/autogen/src/cuda/gemm/2d/sm75/source_2.cu index d825571..f7786b5 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm75/source_2.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm75/source_2.cu @@ -1,14 +1,770 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks41_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks43_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks45_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks47_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks49_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks51_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +781,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +791,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -52,7 +808,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +818,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks53_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -79,7 +835,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +845,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -106,7 +862,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +872,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -133,7 +889,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +899,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks55_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -160,7 +916,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +926,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks21_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -187,7 +943,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +953,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -214,7 +970,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +980,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks57_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -241,7 +997,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +1007,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks23_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -268,7 +1024,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +1034,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -295,7 +1051,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +1061,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks59_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -322,7 +1078,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +1088,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks25_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -349,7 +1105,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +1115,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -376,7 +1132,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +1142,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks61_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -403,7 +1159,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -413,7 +1169,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks27_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -430,7 +1186,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -440,7 +1196,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -457,7 +1213,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -467,7 +1223,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks63_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -484,7 +1240,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -494,10 +1250,10 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks29_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -511,20 +1267,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -538,20 +1294,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -565,20 +1321,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 1>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -592,20 +1348,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -619,20 +1375,20 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -646,17 +1402,17 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x8_2_sm75_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 8, 2, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 2>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -673,7 +1429,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -683,7 +1439,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -700,7 +1456,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -710,7 +1466,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -727,7 +1483,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 3>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -737,7 +1493,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks3_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -754,7 +1510,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -764,7 +1520,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -781,7 +1537,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -791,7 +1547,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -808,7 +1564,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 4>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -818,7 +1574,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks5_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -835,7 +1591,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -845,7 +1601,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -862,7 +1618,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -872,7 +1628,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -889,7 +1645,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 5>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -899,7 +1655,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks7_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -916,7 +1672,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 6>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -926,7 +1682,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -943,7 +1699,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 6>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -953,7 +1709,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -970,7 +1726,169 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm75/source_3.cu b/csrc/autogen/src/cuda/gemm/2d/sm75/source_3.cu index 301486f..fb17f39 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm75/source_3.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm75/source_3.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,7 +25,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +35,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -52,7 +52,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +62,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -79,7 +79,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +89,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks11_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -106,7 +106,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +116,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -133,7 +133,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +143,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -160,7 +160,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +170,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks13_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -187,7 +187,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +197,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -214,7 +214,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +224,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -241,7 +241,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +251,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks15_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -268,7 +268,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +278,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -295,7 +295,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +305,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -322,7 +322,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +332,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks17_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -349,7 +349,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +359,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -376,7 +376,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +386,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -403,7 +403,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -413,7 +413,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks19_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -430,7 +430,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -440,7 +440,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -457,7 +457,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -467,7 +467,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -484,7 +484,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -494,7 +494,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks21_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -511,7 +511,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 15>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -521,7 +521,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -538,7 +538,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 15>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -548,7 +548,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -565,7 +565,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 15>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -575,7 +575,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks23_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -592,7 +592,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 16>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -602,7 +602,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -619,7 +619,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 16>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -629,7 +629,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -646,7 +646,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 16>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -656,7 +656,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks25_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -673,7 +673,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -683,7 +683,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -700,7 +700,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -710,7 +710,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks35_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -727,7 +727,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -737,7 +737,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks27_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -754,7 +754,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -764,7 +764,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -781,7 +781,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -791,7 +791,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks37_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -808,7 +808,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -818,7 +818,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks29_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -835,7 +835,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -845,7 +845,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -862,7 +862,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -872,7 +872,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks39_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -889,7 +889,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -899,7 +899,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks31_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -916,7 +916,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -926,7 +926,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -943,7 +943,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -953,7 +953,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks41_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -970,7 +970,898 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks43_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks45_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks47_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks49_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks51_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks53_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 27>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 27>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks55_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 27>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 28>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 28>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks57_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 28>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks59_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks61_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x8_2_sm75_ks63_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 8, 2, 8, 4, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<75, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_0.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_0.cu index bf32e17..748e41f 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_0.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_0.cu @@ -1,9 +1,9 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { @@ -428,6 +428,426 @@ void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 33, 1, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 33, 1, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 33, 1, 27>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 33, 1, 28>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 33, 1, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 33, 1, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_1.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_1.cu index 22ee6f9..5c1fc0a 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_1.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_1.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( +void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +26,7 @@ void na2d_pn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -568,6 +568,576 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 6, 1, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 10, 1, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 10, 1, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 10, 1, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 9, 1, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 9, 1, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 9, 1, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 1, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 1, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 1, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 12, 1, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 12, 1, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_10.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_10.cu index 667c8bd..9f10851 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_10.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_10.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +26,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -36,7 +36,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -54,7 +54,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -64,7 +64,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -82,7 +82,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -92,7 +92,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -110,7 +110,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -120,7 +120,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -138,7 +138,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -148,7 +148,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -166,7 +166,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -176,7 +176,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -194,7 +194,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -204,7 +204,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -222,7 +222,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -232,7 +232,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -250,7 +250,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -260,7 +260,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -278,7 +278,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -423,6 +423,411 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 2, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 2, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 2, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks35_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks37_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks39_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks41_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_11.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_11.cu index 3211741..998ce59 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_11.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_11.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks43_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +25,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +35,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks45_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -52,7 +52,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +62,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks47_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -79,7 +79,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +89,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks49_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -106,7 +106,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +116,7 @@ void na2d_nn_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks51_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -133,7 +133,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +143,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks21_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks53_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -160,7 +160,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +170,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks23_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks55_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -187,7 +187,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +197,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks25_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks57_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -214,7 +214,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +224,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks27_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks59_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -241,7 +241,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +251,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks29_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks61_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -268,7 +268,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +278,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks31_align1( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( +void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks63_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -295,7 +295,7 @@ void na2d_nn_cuda_gemm_double_128x128x16_64x64x16_8x8x4_3_sm80_ks33_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 8, 8, 4, 3, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -453,6 +453,561 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_12.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_12.cu index e353a82..db5b24c 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_12.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_12.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +25,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 7>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -45,7 +45,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -62,7 +62,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 7>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -82,7 +82,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -99,7 +99,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -119,7 +119,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -136,7 +136,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -156,7 +156,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -173,7 +173,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -193,7 +193,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -210,7 +210,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -230,7 +230,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -247,7 +247,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -267,7 +267,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( +void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -284,7 +284,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -304,7 +304,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -321,7 +321,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -341,7 +341,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -358,7 +358,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -378,7 +378,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -395,7 +395,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -415,7 +415,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -432,7 +432,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -452,7 +452,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -469,7 +469,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -489,7 +489,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -506,7 +506,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -526,7 +526,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -543,7 +543,562 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_13.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_13.cu index 7787a45..b8fd31c 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_13.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_13.cu @@ -1,14 +1,569 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align1( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +580,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -45,7 +600,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -62,7 +617,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -82,7 +637,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -99,7 +654,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -119,7 +674,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -136,7 +691,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -156,7 +711,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -173,7 +728,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -193,7 +748,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -210,7 +765,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -230,7 +785,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -247,7 +802,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -267,7 +822,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -284,7 +839,7 @@ void na2d_nn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -304,7 +859,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -321,7 +876,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -341,7 +896,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -358,7 +913,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -378,7 +933,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -395,7 +950,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -415,7 +970,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -432,7 +987,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -452,7 +1007,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -469,7 +1024,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -489,7 +1044,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -506,7 +1061,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -526,7 +1081,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -543,7 +1098,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_14.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_14.cu index adac443..3ac3b47 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_14.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_14.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +25,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -45,7 +45,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -62,7 +62,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -82,7 +82,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -99,7 +99,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -119,7 +119,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -136,7 +136,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -156,7 +156,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -173,7 +173,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -193,7 +193,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -210,7 +210,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -230,7 +230,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -247,7 +247,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -267,7 +267,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -284,7 +284,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -304,7 +304,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -321,7 +321,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -341,7 +341,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -358,7 +358,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -378,7 +378,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -395,7 +395,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -415,7 +415,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -432,7 +432,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -452,7 +452,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -469,7 +469,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -489,7 +489,7 @@ attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_str } } -void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( +void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align1( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -506,7 +506,7 @@ void na2d_nn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -553,6 +553,411 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_15.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_15.cu index a414d04..9127bd2 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_15.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_15.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +25,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +35,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -52,7 +52,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +62,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -79,7 +79,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +89,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -106,7 +106,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +116,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -133,7 +133,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +143,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -160,7 +160,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +170,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -187,7 +187,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +197,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -214,7 +214,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +224,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -241,7 +241,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +251,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -268,7 +268,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +278,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -295,7 +295,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +305,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -322,7 +322,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +332,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -349,7 +349,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +359,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -376,7 +376,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +386,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -403,7 +403,412 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_16.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_16.cu index 49f6bcf..278c931 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_16.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_16.cu @@ -1,14 +1,419 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +430,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +440,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -52,7 +457,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +467,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -79,7 +484,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +494,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -106,7 +511,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +521,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -133,7 +538,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +548,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -160,7 +565,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +575,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -187,7 +592,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +602,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -214,7 +619,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +629,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -241,7 +646,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +656,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -268,7 +673,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +683,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -295,7 +700,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +710,7 @@ void na2d_nn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -322,7 +727,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +737,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -349,7 +754,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +764,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -376,7 +781,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +791,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -403,7 +808,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_17.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_17.cu index 3fac187..198d8b2 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_17.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_17.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +25,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +35,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -52,7 +52,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +62,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -79,7 +79,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +89,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -106,7 +106,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +116,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -133,7 +133,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +143,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -160,7 +160,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +170,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -187,7 +187,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +197,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -214,7 +214,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +224,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -241,7 +241,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +251,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -268,7 +268,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +278,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -295,7 +295,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +305,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -322,7 +322,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +332,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -349,7 +349,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +359,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -376,7 +376,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +386,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -403,7 +403,7 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -413,6 +413,411 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_18.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_18.cu index d7475d1..4a0895f 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_18.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_18.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,17 +25,17 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -52,17 +52,17 @@ void na2d_nn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -79,7 +79,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +89,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -106,7 +106,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +116,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -133,7 +133,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +143,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -160,7 +160,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +170,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -187,7 +187,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +197,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -214,7 +214,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +224,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -241,7 +241,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +251,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -268,7 +268,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +278,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -295,7 +295,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +305,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -322,7 +322,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +332,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -349,7 +349,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +359,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -376,7 +376,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +386,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -403,7 +403,412 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_19.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_19.cu index 14ac693..f3efc33 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_19.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_19.cu @@ -1,14 +1,419 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +430,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +440,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -52,7 +457,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +467,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -79,7 +484,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +494,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -106,7 +511,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +521,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -133,7 +538,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +548,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -160,7 +565,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +575,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -187,7 +592,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +602,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -214,7 +619,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +629,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -241,7 +646,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +656,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -268,7 +673,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +683,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -295,7 +700,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +710,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -322,7 +727,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +737,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -349,7 +754,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +764,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -376,7 +781,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 2, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +791,7 @@ void na2d_nn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -403,7 +808,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_2.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_2.cu index bd13d20..bd50395 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_2.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_2.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +26,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 6, 1, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 12, 1, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -46,7 +46,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -64,7 +64,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 10, 1, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -84,7 +84,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -102,7 +102,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 10, 1, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { @@ -122,7 +122,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -140,7 +140,7 @@ void na2d_pn_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 10, 1, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -160,7 +160,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -178,7 +178,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 9, 1, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -198,7 +198,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -216,7 +216,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 9, 1, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { @@ -236,7 +236,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -254,7 +254,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks15_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 9, 1, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -274,7 +274,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -292,7 +292,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 1, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -312,7 +312,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -330,7 +330,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 1, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { @@ -350,7 +350,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -368,7 +368,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks17_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 11, 1, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -388,7 +388,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -406,7 +406,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -426,7 +426,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -444,7 +444,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { @@ -464,7 +464,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -482,7 +482,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks19_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -502,7 +502,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -520,7 +520,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 12, 1, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 15>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -540,7 +540,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -558,7 +558,577 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 12, 1, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks35_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks37_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks39_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_20.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_20.cu index fe4e030..ac0caa4 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_20.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_20.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -25,7 +25,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +35,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -52,7 +52,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +62,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -79,7 +79,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +89,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -106,7 +106,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +116,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -133,7 +133,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +143,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -160,7 +160,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +170,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -187,7 +187,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +197,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -214,7 +214,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +224,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -241,7 +241,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +251,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -268,7 +268,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +278,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -295,7 +295,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +305,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -322,7 +322,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +332,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -349,7 +349,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +359,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -376,7 +376,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +386,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8( void * attn_ptr, void * value_ptr, void * output_ptr, @@ -403,7 +403,7 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -413,6 +413,411 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2( + void * attn_ptr, + void * value_ptr, + void * output_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = NeighborhoodNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_21.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_21.cu index 3245c07..1db2784 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_21.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_21.cu @@ -1,17 +1,17 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -25,20 +25,20 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 11>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -52,20 +52,20 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -79,20 +79,20 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -106,20 +106,20 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31_align1( void * attn_ptr, - void * value_ptr, - void * output_ptr, + void * d_output_ptr, + void * d_value_ptr, int batch_size, int heads, int height, @@ -133,17 +133,44 @@ void na2d_nn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 2, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = NeighborhoodNeighborhood2D; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks35_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -160,7 +187,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +197,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks3_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks37_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -187,7 +214,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +224,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks5_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks39_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -214,7 +241,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +251,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks7_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks41_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -241,7 +268,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +278,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks9_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks43_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -268,7 +295,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +305,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks11_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks45_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -295,7 +322,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +332,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks13_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks47_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -322,7 +349,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +359,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks15_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks49_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -349,7 +376,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +386,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks17_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks51_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -376,7 +403,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +413,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks19_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21_align1( +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks53_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -403,7 +430,7 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -413,6 +440,474 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks21_align1( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks55_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 27>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks57_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 28>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks59_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks61_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks63_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_22.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_22.cu index 5f7dc70..a9a3d86 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_22.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_22.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,17 +25,27 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks23_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 11>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; - using DConfig = natten::gemm::detail::DTypeConfig; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -52,17 +62,27 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks25_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 12>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; - using DConfig = natten::gemm::detail::DTypeConfig; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -79,17 +99,27 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks27_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 13>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; - using DConfig = natten::gemm::detail::DTypeConfig; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -106,17 +136,64 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks29_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; - using DConfig = natten::gemm::detail::DTypeConfig; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -133,17 +210,101 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks31_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; - using DConfig = natten::gemm::detail::DTypeConfig; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } } -void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -160,17 +321,471 @@ void na2d_in_cuda_gemm_double_64x64x16_32x32x16_8x8x4_3_sm80_ks33_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 32, 16, 8, 8, 4, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, double>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; - using DConfig = natten::gemm::detail::DTypeConfig; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -187,7 +802,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -207,7 +822,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -224,7 +839,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -244,7 +859,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -261,7 +876,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks3_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -281,7 +896,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -298,7 +913,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -318,7 +933,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -335,7 +950,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -355,7 +970,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -372,7 +987,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks5_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -392,7 +1007,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -409,7 +1024,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -429,7 +1044,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -446,7 +1061,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -466,7 +1081,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -483,7 +1098,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks7_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_23.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_23.cu index 93604ed..cb1f449 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_23.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_23.cu @@ -1,14 +1,569 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks35_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks37_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,7 +580,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -45,7 +600,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -62,7 +617,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -82,7 +637,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks39_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -99,7 +654,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks9_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -119,7 +674,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -136,7 +691,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -156,7 +711,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -173,7 +728,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -193,7 +748,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks41_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -210,7 +765,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks11_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -230,7 +785,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -247,7 +802,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -267,7 +822,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -284,7 +839,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -304,7 +859,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks43_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -321,7 +876,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks13_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -341,7 +896,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -358,7 +913,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -378,7 +933,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -395,7 +950,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -415,7 +970,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks45_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -432,7 +987,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks15_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -452,7 +1007,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -469,7 +1024,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -489,7 +1044,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -506,7 +1061,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -526,7 +1081,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks47_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -543,7 +1098,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks17_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_24.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_24.cu index 1235f3b..c691c23 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_24.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_24.cu @@ -1,14 +1,199 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks49_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks51_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,7 +210,44 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -45,7 +267,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -62,7 +284,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -82,7 +304,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks53_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -99,7 +321,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks19_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -119,7 +341,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -136,7 +358,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -156,7 +378,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -173,7 +395,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -193,7 +415,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks55_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -210,7 +432,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks21_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -230,7 +452,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -247,7 +469,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -267,7 +489,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -284,7 +506,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -304,7 +526,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks57_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -321,7 +543,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks23_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -341,7 +563,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -358,7 +580,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -378,7 +600,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -395,7 +617,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -415,7 +637,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks59_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -432,7 +654,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks25_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -452,7 +674,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align4( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -469,7 +691,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; if (natten::kEnableGemmTF32) { @@ -489,7 +711,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align2( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -506,7 +728,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; if (natten::kEnableGemmTF32) { @@ -526,7 +748,7 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align1( +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks61_align1( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -543,7 +765,7 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks27_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -563,6 +785,279 @@ attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn } } +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks63_align1( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_25.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_25.cu index ac4abb3..77c2048 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_25.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_25.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,27 +25,44 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - if (natten::kEnableGemmTF32) { - using DConfig = natten::gemm::detail::DTypeConfig; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } else { - using DConfig = natten::gemm::detail::DTypeConfig; +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); - - } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -62,27 +79,44 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - if (natten::kEnableGemmTF32) { - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } else { - using DConfig = natten::gemm::detail::DTypeConfig; +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); - - } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -99,27 +133,71 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks29_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; - if (natten::kEnableGemmTF32) { - using DConfig = natten::gemm::detail::DTypeConfig; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } else { - using DConfig = natten::gemm::detail::DTypeConfig; +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -136,27 +214,71 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - if (natten::kEnableGemmTF32) { - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } else { - using DConfig = natten::gemm::detail::DTypeConfig; +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -173,27 +295,71 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - if (natten::kEnableGemmTF32) { - using DConfig = natten::gemm::detail::DTypeConfig; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } else { - using DConfig = natten::gemm::detail::DTypeConfig; +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -210,27 +376,71 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks31_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; - if (natten::kEnableGemmTF32) { - using DConfig = natten::gemm::detail::DTypeConfig; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } else { - using DConfig = natten::gemm::detail::DTypeConfig; +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -247,27 +457,44 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - if (natten::kEnableGemmTF32) { - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } else { - using DConfig = natten::gemm::detail::DTypeConfig; +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); - - } } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -284,27 +511,71 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - if (natten::kEnableGemmTF32) { - using DConfig = natten::gemm::detail::DTypeConfig; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } else { - using DConfig = natten::gemm::detail::DTypeConfig; +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align1( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -321,27 +592,71 @@ void na2d_in_cuda_gemm_float_64x64x16_32x16x16_16x8x8_3_sm80_ks33_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 16, 32, 16, 16, 16, 8, 8, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; - if (natten::kEnableGemmTF32) { - using DConfig = natten::gemm::detail::DTypeConfig; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } else { - using DConfig = natten::gemm::detail::DTypeConfig; +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} - } +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -358,7 +673,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -368,7 +683,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -385,7 +700,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -395,7 +710,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -412,7 +727,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -422,7 +737,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -439,7 +754,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -449,7 +764,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -466,7 +781,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -476,7 +791,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -493,7 +808,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_26.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_26.cu index af2dc50..4344c8c 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_26.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_26.cu @@ -1,14 +1,419 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,7 +430,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +440,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -52,7 +457,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +467,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -79,7 +484,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +494,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -106,7 +511,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +521,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -133,7 +538,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +548,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -160,7 +565,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +575,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -187,7 +592,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +602,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -214,7 +619,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +629,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -241,7 +646,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +656,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -268,7 +673,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +683,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -295,7 +700,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +710,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -322,7 +727,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +737,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -349,7 +754,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +764,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -376,7 +781,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +791,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -403,7 +808,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 22>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_27.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_27.cu index 19a17f7..8620568 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_27.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_27.cu @@ -1,14 +1,68 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,7 +79,34 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +116,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -52,7 +133,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +143,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -79,7 +160,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +170,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -106,7 +187,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +197,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -133,7 +214,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +224,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -160,7 +241,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +251,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -187,7 +268,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +278,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -214,7 +295,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +305,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -241,7 +322,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +332,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -268,7 +349,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +359,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -295,7 +376,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +386,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -322,7 +403,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +413,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -349,7 +430,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +440,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -376,7 +457,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +467,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -403,7 +484,7 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -413,6 +494,330 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 29>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 30>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 31>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_28.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_28.cu index 500fc61..0ee4125 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_28.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_28.cu @@ -1,14 +1,122 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,17 +133,71 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -52,17 +214,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -79,17 +241,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -106,17 +268,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -133,17 +295,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -160,17 +322,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -187,17 +349,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -214,17 +376,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -241,17 +403,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -268,17 +430,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -295,17 +457,17 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -322,17 +484,260 @@ void na2d_in_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -349,7 +754,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +764,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -376,7 +781,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +791,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -403,7 +808,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks3_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 1>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_29.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_29.cu index 7fc0c10..02b5f1a 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_29.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_29.cu @@ -1,14 +1,419 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,7 +430,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +440,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -52,7 +457,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +467,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks35_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -79,7 +484,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 2>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 17>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +494,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks5_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -106,7 +511,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +521,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -133,7 +538,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +548,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks37_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -160,7 +565,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +575,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -187,7 +592,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +602,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -214,7 +619,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +629,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks39_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -241,7 +646,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +656,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -268,7 +673,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +683,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -295,7 +700,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +710,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks41_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -322,7 +727,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 20>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +737,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -349,7 +754,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +764,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -376,7 +781,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +791,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks43_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -403,7 +808,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 21>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_3.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_3.cu index 2ee828d..5eeb52f 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_3.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_3.cu @@ -1,14 +1,584 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks41_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks43_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks45_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks47_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks49_align1( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + if (natten::kEnableGemmTF32) { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } else { + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); + + } +} + +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks51_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +596,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks21_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 12, 1, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -46,7 +616,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -64,7 +634,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -84,7 +654,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -102,7 +672,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { @@ -122,7 +692,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks53_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -140,7 +710,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks23_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -160,7 +730,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -178,7 +748,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -198,7 +768,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -216,7 +786,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { @@ -236,7 +806,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks55_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -254,7 +824,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks25_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 13, 1, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -274,7 +844,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -292,7 +862,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -312,7 +882,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -330,7 +900,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { @@ -350,7 +920,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks57_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -368,7 +938,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks27_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -388,7 +958,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -406,7 +976,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -426,7 +996,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -444,7 +1014,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { @@ -464,7 +1034,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks59_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -482,7 +1052,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks29_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -502,7 +1072,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -520,7 +1090,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -540,7 +1110,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -558,7 +1128,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_30.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_30.cu index d616a03..52e433c 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_30.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_30.cu @@ -1,14 +1,419 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks45_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks47_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks49_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks51_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 25>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align8( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align4( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks53_align2( + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 26>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = InverseNeighborhood2D; + Kernel kernel; + kernel( +attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -25,7 +430,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -35,7 +440,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -52,7 +457,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -62,7 +467,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks55_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -79,7 +484,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -89,7 +494,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks15_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -106,7 +511,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -116,7 +521,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -133,7 +538,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -143,7 +548,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks57_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -160,7 +565,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -170,7 +575,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks17_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -187,7 +592,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -197,7 +602,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -214,7 +619,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -224,7 +629,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks59_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -241,7 +646,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -251,7 +656,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks19_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -268,7 +673,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -278,7 +683,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -295,7 +700,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -305,7 +710,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks61_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -322,7 +727,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -332,7 +737,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks21_align2( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align8( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -349,7 +754,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -359,7 +764,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align8( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align4( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -376,7 +781,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -386,7 +791,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align4( attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( +void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks63_align2( void * attn_ptr, void * d_output_ptr, void * d_value_ptr, @@ -403,7 +808,7 @@ void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_31.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_31.cu index 514bbdb..2e38804 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_31.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_31.cu @@ -1,418 +1,9 @@ #include #include -#include -#include -#include -#include namespace natten { namespace cuda { namespace gemm { -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align8( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align4( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks25_align2( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 12>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align8( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align4( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks27_align2( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 13>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align8( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align4( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks29_align2( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 14>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align8( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align4( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks31_align2( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 15>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align8( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 8, 8>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align4( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 4, 4>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - -void na2d_in_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks33_align2( - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation, - float scale, - cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 8, 4, 16>; - using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; - using AConfig = natten::gemm::detail::AlignmentConfig<1, 2, 2>; - using DConfig = natten::gemm::detail::DTypeConfig; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); -} - } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_4.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_4.cu index f2afa55..d880a78 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_4.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_4.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks61_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +26,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks31_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -46,7 +46,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -64,7 +64,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; if (natten::kEnableGemmTF32) { @@ -84,7 +84,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -102,7 +102,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; if (natten::kEnableGemmTF32) { @@ -122,7 +122,7 @@ query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, a } } -void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( +void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks63_align1( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -140,7 +140,7 @@ void na2d_pn_cuda_gemm_float_128x128x16_64x64x16_16x8x8_3_sm80_ks33_align1( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 16, 64, 64, 16, 16, 8, 8, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, float>; using AConfig = natten::gemm::detail::AlignmentConfig<1, 1, 1>; if (natten::kEnableGemmTF32) { @@ -468,6 +468,426 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 7, 1, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_5.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_5.cu index dc28c1b..d4f2a77 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_5.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_5.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +26,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 7, 1, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -36,7 +36,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -54,7 +54,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -64,7 +64,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -82,7 +82,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -92,7 +92,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -110,7 +110,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -120,7 +120,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -138,7 +138,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -148,7 +148,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -166,7 +166,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -176,7 +176,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -194,7 +194,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -204,7 +204,7 @@ void na2d_pn_cuda_gemm_half_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -222,7 +222,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -232,7 +232,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -250,7 +250,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -260,7 +260,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -278,7 +278,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -288,7 +288,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -306,7 +306,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -316,7 +316,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -334,7 +334,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -344,7 +344,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -362,7 +362,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -372,7 +372,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -390,7 +390,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -400,7 +400,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -418,7 +418,427 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 19>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_6.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_6.cu index bf8e9bc..f2df9a3 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_6.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_6.cu @@ -1,14 +1,434 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 24>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +446,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -36,7 +456,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -54,7 +474,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -64,7 +484,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -82,7 +502,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -92,7 +512,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -110,7 +530,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -120,7 +540,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -138,7 +558,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -148,7 +568,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -166,7 +586,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -176,7 +596,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -194,7 +614,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -204,7 +624,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -222,7 +642,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -232,7 +652,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -250,7 +670,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -260,7 +680,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -278,7 +698,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -288,7 +708,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -306,7 +726,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -316,7 +736,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -334,7 +754,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -344,7 +764,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -362,7 +782,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -372,7 +792,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -390,7 +810,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -400,7 +820,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -418,7 +838,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_7.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_7.cu index 3442ad9..29316d2 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_7.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_7.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks59_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +26,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 29>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -36,7 +36,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -54,7 +54,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -64,7 +64,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -82,7 +82,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -92,7 +92,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks61_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -110,7 +110,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 30>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -120,7 +120,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -138,7 +138,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -148,7 +148,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -166,7 +166,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -176,7 +176,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( +void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks63_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -194,7 +194,7 @@ void na2d_pn_cuda_gemm_half_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 31>; using ArchConfig = natten::gemm::detail::ArchArgs<80, half>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -428,6 +428,426 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 5, 1, 3>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 7, 1, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 7, 1, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 7, 1, 4>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + } } } diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_8.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_8.cu index 2fc10a8..e0437f7 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_8.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_8.cu @@ -1,14 +1,14 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +26,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 5, 1, 3>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -36,7 +36,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks7_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -54,7 +54,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 7, 1, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -64,7 +64,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -82,7 +82,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 7, 1, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -92,7 +92,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -110,7 +110,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 7, 1, 4>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -120,7 +120,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks9_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -138,7 +138,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -148,7 +148,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -166,7 +166,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -176,7 +176,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -194,7 +194,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 6, 1, 5>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -204,7 +204,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks11_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -222,7 +222,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -232,7 +232,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -250,7 +250,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -260,7 +260,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -278,7 +278,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<64, 64, 32, 32, 32, 32, 16, 8, 16, 3, 10, 1, 6>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -288,7 +288,7 @@ void na2d_pn_cuda_gemm_bfloat16_64x64x32_32x32x32_16x8x16_3_sm80_ks13_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -306,7 +306,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -316,7 +316,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -334,7 +334,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -344,7 +344,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -362,7 +362,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 9, 1, 7>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -372,7 +372,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks15_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -390,7 +390,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -400,7 +400,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -418,7 +418,427 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks29_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 14>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks31_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 15>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks33_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 17, 1, 16>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks35_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 17>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 18>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/gemm/2d/sm80/source_9.cu b/csrc/autogen/src/cuda/gemm/2d/sm80/source_9.cu index 46788b7..487e495 100644 --- a/csrc/autogen/src/cuda/gemm/2d/sm80/source_9.cu +++ b/csrc/autogen/src/cuda/gemm/2d/sm80/source_9.cu @@ -1,14 +1,434 @@ #include #include -#include #include -#include #include +#include +#include namespace natten { namespace cuda { namespace gemm { -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks37_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 18>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks39_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 19>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks41_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 20>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks43_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 22, 1, 21>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks45_align2( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 23, 1, 22>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align8( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align4( + void * query_ptr, + void * key_ptr, + void * attn_ptr, + void * bias_ptr, + int batch_size, + int heads, + int height, + int width, + int dim, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int kernel_size, + int dilation, + float scale, + cudaStream_t stream) { + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 23>; + using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; + using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; + using DConfig = natten::gemm::detail::DTypeConfig; + using Kernel = PointwiseNeighborhood2D; + Kernel kernel; + kernel( +query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); +} + +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks47_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -26,7 +446,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 11, 1, 8>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 23>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -36,7 +456,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks17_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -54,7 +474,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -64,7 +484,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -82,7 +502,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -92,7 +512,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks49_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -110,7 +530,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 9>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 24>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -120,7 +540,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks19_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -138,7 +558,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -148,7 +568,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -166,7 +586,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -176,7 +596,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks51_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -194,7 +614,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 12, 1, 10>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 25>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -204,7 +624,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks21_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -222,7 +642,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -232,7 +652,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -250,7 +670,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -260,7 +680,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks53_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -278,7 +698,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 11>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 26>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -288,7 +708,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks23_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -306,7 +726,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -316,7 +736,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -334,7 +754,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -344,7 +764,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align4( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks55_align2( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -362,7 +782,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 13, 1, 12>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 27>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<2, 2, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -372,7 +792,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks25_align2( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align8( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -390,7 +810,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<8, 8, 1>; using DConfig = natten::gemm::detail::DTypeConfig; @@ -400,7 +820,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align8( query_ptr, key_ptr, attn_ptr, bias_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation, scale, stream); } -void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( +void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks57_align4( void * query_ptr, void * key_ptr, void * attn_ptr, @@ -418,7 +838,7 @@ void na2d_pn_cuda_gemm_bfloat16_128x128x32_64x64x32_16x8x16_3_sm80_ks27_align4( int dilation, float scale, cudaStream_t stream) { - using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 14, 1, 13>; + using GConfig = natten::gemm::detail::GemmConfig2D<128, 128, 32, 64, 64, 32, 16, 8, 16, 3, 33, 1, 28>; using ArchConfig = natten::gemm::detail::ArchArgs<80, bfloat16>; using AConfig = natten::gemm::detail::AlignmentConfig<4, 4, 1>; using DConfig = natten::gemm::detail::DTypeConfig; diff --git a/csrc/autogen/src/cuda/naive/source_0.cu b/csrc/autogen/src/cuda/naive/source_0.cu index 9a253d0..6197797 100644 --- a/csrc/autogen/src/cuda/naive/source_0.cu +++ b/csrc/autogen/src/cuda/naive/source_0.cu @@ -2,1013 +2,1155 @@ #include #include #include -#include #include -#include -#include #include +#include +#include +#include +#include namespace natten { namespace cuda { namespace naive { -void na1d_pn_cuda_naive_double_ks_any_di_any( - const int cc, +void na1d_pn_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na1d_pn_cuda_naive_double_ks_any_di_1( - const int cc, +void na1d_pn_cuda_naive_double_cm_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na1d_pn_cuda_naive_double_ks_3_di_any( - const int cc, +void na1d_pn_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na1d_pn_cuda_naive_double_ks_3_di_1( - const int cc, +void na1d_pn_cuda_naive_float_cm_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na1d_pn_cuda_naive_double_ks_5_di_any( - const int cc, +void na1d_pn_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_double_ks_5_di_1( - const int cc, +void na1d_pn_cuda_naive_half_cm_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_double_ks_7_di_any( - const int cc, +void na1d_pn_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_double_ks_7_di_1( - const int cc, +void na1d_pn_cuda_naive_bfloat16_cm_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = PointwiseNeighborhood1D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_double_ks_9_di_any( - const int cc, +void na2d_pn_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na1d_pn_cuda_naive_double_ks_9_di_1( - const int cc, +void na2d_pn_cuda_naive_double_cm_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na1d_pn_cuda_naive_double_ks_11_di_any( - const int cc, +void na2d_pn_cuda_naive_double_cm_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na1d_pn_cuda_naive_double_ks_11_di_1( - const int cc, +void na2d_pn_cuda_naive_double_cm_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na1d_pn_cuda_naive_double_ks_13_di_any( - const int cc, +void na2d_pn_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na1d_pn_cuda_naive_double_ks_13_di_1( - const int cc, +void na2d_pn_cuda_naive_float_cm_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na1d_pn_cuda_naive_float_ks_any_di_any( - const int cc, +void na2d_pn_cuda_naive_float_cm_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na1d_pn_cuda_naive_float_ks_any_di_1( - const int cc, +void na2d_pn_cuda_naive_float_cm_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na1d_pn_cuda_naive_float_ks_3_di_any( - const int cc, +void na2d_pn_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_float_ks_3_di_1( - const int cc, +void na2d_pn_cuda_naive_half_cm_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_float_ks_5_di_any( - const int cc, +void na2d_pn_cuda_naive_half_cm_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_float_ks_5_di_1( - const int cc, +void na2d_pn_cuda_naive_half_cm_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_float_ks_7_di_any( - const int cc, +void na2d_pn_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_float_ks_7_di_1( - const int cc, +void na2d_pn_cuda_naive_bfloat16_cm_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_float_ks_9_di_any( - const int cc, +void na2d_pn_cuda_naive_bfloat16_cm_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_float_ks_9_di_1( - const int cc, +void na2d_pn_cuda_naive_bfloat16_cm_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na1d_pn_cuda_naive_float_ks_11_di_any( - const int cc, +void na3d_pn_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_float_ks_11_di_1( - const int cc, +void na3d_pn_cuda_naive_double_cm_0_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_float_ks_13_di_any( - const int cc, +void na3d_pn_cuda_naive_double_cm_0_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_float_ks_13_di_1( - const int cc, +void na3d_pn_cuda_naive_double_cm_0_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_any_di_any( - const int cc, +void na3d_pn_cuda_naive_double_cm_1_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_any_di_1( - const int cc, +void na3d_pn_cuda_naive_double_cm_1_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_3_di_any( - const int cc, +void na3d_pn_cuda_naive_double_cm_1_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_3_di_1( - const int cc, +void na3d_pn_cuda_naive_double_cm_1_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_5_di_any( - const int cc, +void na3d_pn_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_5_di_1( - const int cc, +void na3d_pn_cuda_naive_float_cm_0_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_7_di_any( - const int cc, +void na3d_pn_cuda_naive_float_cm_0_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_7_di_1( - const int cc, +void na3d_pn_cuda_naive_float_cm_0_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_9_di_any( - const int cc, +void na3d_pn_cuda_naive_float_cm_1_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_9_di_1( - const int cc, +void na3d_pn_cuda_naive_float_cm_1_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_11_di_any( - const int cc, +void na3d_pn_cuda_naive_float_cm_1_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_11_di_1( - const int cc, +void na3d_pn_cuda_naive_float_cm_1_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_pn_cuda_naive_half_ks_13_di_any( - const int cc, +void na3d_pn_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1017,28 +1159,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_half_ks_13_di_1( - const int cc, +void na3d_pn_cuda_naive_half_cm_0_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1047,28 +1194,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, +void na3d_pn_cuda_naive_half_cm_0_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1077,28 +1229,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, +void na3d_pn_cuda_naive_half_cm_0_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1107,28 +1264,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, +void na3d_pn_cuda_naive_half_cm_1_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1137,28 +1299,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, +void na3d_pn_cuda_naive_half_cm_1_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1167,28 +1334,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, +void na3d_pn_cuda_naive_half_cm_1_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1197,28 +1369,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, +void na3d_pn_cuda_naive_half_cm_1_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1227,28 +1404,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1257,28 +1439,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_0_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1287,28 +1474,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_0_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1317,28 +1509,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_0_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1347,28 +1544,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_1_0_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1377,28 +1579,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_1_0_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1407,28 +1614,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_1_1_0( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1437,28 +1649,33 @@ exit(EXIT_FAILURE); } } -void na1d_pn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, +void na3d_pn_cuda_naive_bfloat16_cm_1_1_1( + int32_t cc, cudaStream_t stream, + bool is_grad, void * query_ptr, void * key_ptr, void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3D; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, is_grad, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -1467,9528 +1684,311 @@ exit(EXIT_FAILURE); } } -void na2d_pn_cuda_naive_double_ks_any_di_any( - const int cc, +void na1d_pn_bias_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = PointwiseNeighborhood1DWithBias; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na2d_pn_cuda_naive_double_ks_any_di_1( - const int cc, +void na1d_pn_bias_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = PointwiseNeighborhood1DWithBias; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na2d_pn_cuda_naive_double_ks_3_di_any( - const int cc, +void na1d_pn_bias_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} + const std::tuple& kernel_size, + const std::tuple& dilation) { -void na2d_pn_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = PointwiseNeighborhood1DWithBias; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -void na2d_pn_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); -void na2d_pn_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } - -void na2d_pn_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_pn_cuda_naive_double_ks_7_di_1( - const int cc, +void na1d_pn_bias_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} + const std::tuple& kernel_size, + const std::tuple& dilation) { -void na2d_pn_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = PointwiseNeighborhood1DWithBias; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na2d_pn_cuda_naive_double_ks_9_di_1( - const int cc, +void na2d_pn_bias_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2DWithBias; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_pn_cuda_naive_double_ks_11_di_any( - const int cc, +void na2d_pn_bias_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2DWithBias; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_pn_cuda_naive_double_ks_11_di_1( - const int cc, +void na2d_pn_bias_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2DWithBias; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na2d_pn_cuda_naive_double_ks_13_di_any( - const int cc, +void na2d_pn_bias_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = PointwiseNeighborhood2DWithBias; Kernel kernel; kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na2d_pn_cuda_naive_double_ks_13_di_1( - const int cc, +void na3d_pn_bias_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * query_ptr, void * key_ptr, + void * bias_ptr, void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_pn_bias_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_pn_bias_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood1DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_pn_bias_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_pn_bias_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood2DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_pn_bias_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_pn_bias_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * query_ptr, - void * key_ptr, - void * bias_ptr, - void * attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = PointwiseNeighborhood3DWithBias; - Kernel kernel; - kernel( -cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_nn_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_nn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3DWithBias; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_nn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, +void na3d_pn_bias_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, + void * query_ptr, + void * key_ptr, + void * bias_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3DWithBias; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na1d_nn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, +void na3d_pn_bias_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, + void * query_ptr, + void * key_ptr, + void * bias_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3DWithBias; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -10997,28 +1997,33 @@ exit(EXIT_FAILURE); } } -void na1d_nn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, +void na3d_pn_bias_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, + void * query_ptr, + void * key_ptr, + void * bias_ptr, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood1D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = PointwiseNeighborhood3DWithBias; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); +cc, stream, query_ptr, key_ptr, bias_ptr, attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11027,144 +2032,112 @@ exit(EXIT_FAILURE); } } -void na1d_nn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, +void na1d_nn_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} } -void na1d_nn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, +void na1d_nn_cuda_naive_double_cm_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} } -void na1d_nn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, +void na1d_nn_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} } -void na1d_nn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, +void na1d_nn_cuda_naive_float_cm_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} } -void na1d_nn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, +void na1d_nn_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( @@ -11177,24 +2150,24 @@ exit(EXIT_FAILURE); } } -void na1d_nn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, +void na1d_nn_cuda_naive_half_cm_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack1D; using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( @@ -11207,24 +2180,24 @@ exit(EXIT_FAILURE); } } -void na1d_nn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, +void na1d_nn_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; + using Arguments = natten::naive::ArgumentPack1D; using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( @@ -11237,24 +2210,24 @@ exit(EXIT_FAILURE); } } -void na1d_nn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, +void na1d_nn_cuda_naive_bfloat16_cm_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; + using Arguments = natten::naive::ArgumentPack1D; using Kernel = NeighborhoodNeighborhood1D; Kernel kernel; kernel( @@ -11267,676 +2240,556 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_double_ks_any_di_any( - const int cc, +void na2d_nn_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_double_ks_any_di_1( - const int cc, +void na2d_nn_cuda_naive_double_cm_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_double_ks_3_di_any( - const int cc, +void na2d_nn_cuda_naive_double_cm_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_double_ks_3_di_1( - const int cc, +void na2d_nn_cuda_naive_double_cm_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_double_ks_5_di_any( - const int cc, +void na2d_nn_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_double_ks_5_di_1( - const int cc, +void na2d_nn_cuda_naive_float_cm_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_double_ks_7_di_any( - const int cc, +void na2d_nn_cuda_naive_float_cm_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_double_ks_7_di_1( - const int cc, +void na2d_nn_cuda_naive_float_cm_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_double_ks_9_di_any( - const int cc, +void na2d_nn_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} + const std::tuple& kernel_size, + const std::tuple& dilation) { -void na2d_nn_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} -void na2d_nn_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); -void na2d_nn_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } - -void na2d_nn_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_double_ks_13_di_1( - const int cc, +void na2d_nn_cuda_naive_half_cm_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} + const std::tuple& kernel_size, + const std::tuple& dilation) { -void na2d_nn_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} -void na2d_nn_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); -void na2d_nn_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } - -void na2d_nn_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na2d_nn_cuda_naive_float_ks_5_di_any( - const int cc, +void na2d_nn_cuda_naive_half_cm_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na2d_nn_cuda_naive_float_ks_5_di_1( - const int cc, +void na2d_nn_cuda_naive_half_cm_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na2d_nn_cuda_naive_float_ks_7_di_any( - const int cc, +void na2d_nn_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na2d_nn_cuda_naive_float_ks_7_di_1( - const int cc, +void na2d_nn_cuda_naive_bfloat16_cm_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na2d_nn_cuda_naive_float_ks_9_di_any( - const int cc, +void na2d_nn_cuda_naive_bfloat16_cm_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na2d_nn_cuda_naive_float_ks_9_di_1( - const int cc, +void na2d_nn_cuda_naive_bfloat16_cm_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; using Kernel = NeighborhoodNeighborhood2D; Kernel kernel; kernel( cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na2d_nn_cuda_naive_float_ks_11_di_any( - const int cc, +void na3d_nn_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_float_ks_11_di_1( - const int cc, +void na3d_nn_cuda_naive_double_cm_0_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_float_ks_13_di_any( - const int cc, +void na3d_nn_cuda_naive_double_cm_0_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_float_ks_13_di_1( - const int cc, +void na3d_nn_cuda_naive_double_cm_0_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } } diff --git a/csrc/autogen/src/cuda/naive/source_1.cu b/csrc/autogen/src/cuda/naive/source_1.cu index 4d41f3d..ef1c5d9 100644 --- a/csrc/autogen/src/cuda/naive/source_1.cu +++ b/csrc/autogen/src/cuda/naive/source_1.cu @@ -3,425 +3,354 @@ #include #include #include +#include +#include +#include #include #include -#include #include -#include -#include -#include namespace natten { namespace cuda { namespace naive { -void na2d_nn_cuda_naive_half_ks_any_di_any( - const int cc, +void na3d_nn_cuda_naive_double_cm_1_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_any_di_1( - const int cc, +void na3d_nn_cuda_naive_double_cm_1_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_3_di_any( - const int cc, +void na3d_nn_cuda_naive_double_cm_1_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_3_di_1( - const int cc, +void na3d_nn_cuda_naive_double_cm_1_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_5_di_any( - const int cc, +void na3d_nn_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_5_di_1( - const int cc, +void na3d_nn_cuda_naive_float_cm_0_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_7_di_any( - const int cc, +void na3d_nn_cuda_naive_float_cm_0_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_7_di_1( - const int cc, +void na3d_nn_cuda_naive_float_cm_0_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_9_di_any( - const int cc, +void na3d_nn_cuda_naive_float_cm_1_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_9_di_1( - const int cc, +void na3d_nn_cuda_naive_float_cm_1_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_11_di_any( - const int cc, +void na3d_nn_cuda_naive_float_cm_1_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_11_di_1( - const int cc, +void na3d_nn_cuda_naive_float_cm_1_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na2d_nn_cuda_naive_half_ks_13_di_any( - const int cc, +void na3d_nn_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -430,30 +359,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_half_ks_13_di_1( - const int cc, +void na3d_nn_cuda_naive_half_cm_0_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -462,30 +393,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, +void na3d_nn_cuda_naive_half_cm_0_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -494,30 +427,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, +void na3d_nn_cuda_naive_half_cm_0_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -526,30 +461,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, +void na3d_nn_cuda_naive_half_cm_1_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -558,30 +495,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, +void na3d_nn_cuda_naive_half_cm_1_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -590,30 +529,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, +void na3d_nn_cuda_naive_half_cm_1_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -622,30 +563,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, +void na3d_nn_cuda_naive_half_cm_1_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -654,30 +597,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -686,30 +631,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_0_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -718,30 +665,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_0_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -750,30 +699,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_0_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -782,30 +733,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_1_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -814,30 +767,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_1_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -846,30 +801,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_1_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -878,30 +835,32 @@ exit(EXIT_FAILURE); } } -void na2d_nn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, +void na3d_nn_cuda_naive_bfloat16_cm_1_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, void * value_ptr, void * output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + int64_t attn_stride_4, + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood2D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = NeighborhoodNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); +cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -910,10309 +869,1104 @@ exit(EXIT_FAILURE); } } -void na3d_nn_cuda_naive_double_ks_any_di_any( - const int cc, +void na1d_in_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na3d_nn_cuda_naive_double_ks_any_di_1( - const int cc, +void na1d_in_cuda_naive_double_cm_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na3d_nn_cuda_naive_double_ks_3_di_any( - const int cc, +void na1d_in_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na3d_nn_cuda_naive_double_ks_3_di_1( - const int cc, +void na1d_in_cuda_naive_float_cm_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na3d_nn_cuda_naive_double_ks_5_di_any( - const int cc, +void na1d_in_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_double_ks_5_di_1( - const int cc, +void na1d_in_cuda_naive_half_cm_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_double_ks_7_di_any( - const int cc, +void na1d_in_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -void na3d_nn_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} +} + +void na1d_in_cuda_naive_bfloat16_cm_1( + int32_t cc, + cudaStream_t stream, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = InverseNeighborhood1D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_double_ks_9_di_any( - const int cc, +void na2d_in_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_nn_cuda_naive_double_ks_9_di_1( - const int cc, +void na2d_in_cuda_naive_double_cm_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_nn_cuda_naive_double_ks_11_di_any( - const int cc, +void na2d_in_cuda_naive_double_cm_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_nn_cuda_naive_double_ks_11_di_1( - const int cc, +void na2d_in_cuda_naive_double_cm_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_nn_cuda_naive_double_ks_13_di_any( - const int cc, +void na2d_in_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_nn_cuda_naive_double_ks_13_di_1( - const int cc, +void na2d_in_cuda_naive_float_cm_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_nn_cuda_naive_float_ks_any_di_any( - const int cc, +void na2d_in_cuda_naive_float_cm_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_nn_cuda_naive_float_ks_any_di_1( - const int cc, +void na2d_in_cuda_naive_float_cm_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_nn_cuda_naive_float_ks_3_di_any( - const int cc, +void na2d_in_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_float_ks_3_di_1( - const int cc, +void na2d_in_cuda_naive_half_cm_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_float_ks_5_di_any( - const int cc, +void na2d_in_cuda_naive_half_cm_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_float_ks_5_di_1( - const int cc, +void na2d_in_cuda_naive_half_cm_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_float_ks_7_di_any( - const int cc, +void na2d_in_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_float_ks_7_di_1( - const int cc, +void na2d_in_cuda_naive_bfloat16_cm_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_float_ks_9_di_any( - const int cc, +void na2d_in_cuda_naive_bfloat16_cm_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_float_ks_9_di_1( - const int cc, +void na2d_in_cuda_naive_bfloat16_cm_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = InverseNeighborhood2D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); + +} else { +std::cerr << "This half type is not supported on the selected device." << std::endl; +exit(EXIT_FAILURE); + +} } -void na3d_nn_cuda_naive_float_ks_11_di_any( - const int cc, +void na3d_in_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_nn_cuda_naive_float_ks_11_di_1( - const int cc, +void na3d_in_cuda_naive_double_cm_0_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_nn_cuda_naive_float_ks_13_di_any( - const int cc, +void na3d_in_cuda_naive_double_cm_0_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_nn_cuda_naive_float_ks_13_di_1( - const int cc, +void na3d_in_cuda_naive_double_cm_0_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_nn_cuda_naive_half_ks_any_di_any( - const int cc, +void na3d_in_cuda_naive_double_cm_1_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_nn_cuda_naive_half_ks_any_di_1( - const int cc, +void na3d_in_cuda_naive_double_cm_1_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_nn_cuda_naive_half_ks_11_di_1( - const int cc, +void na3d_in_cuda_naive_double_cm_1_1_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_nn_cuda_naive_half_ks_13_di_any( - const int cc, +void na3d_in_cuda_naive_double_cm_1_1_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_nn_cuda_naive_half_ks_13_di_1( - const int cc, +void na3d_in_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_nn_cuda_naive_bfloat16_ks_any_di_any( - const int cc, +void na3d_in_cuda_naive_float_cm_0_0_1( + int32_t cc, cudaStream_t stream, void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_nn_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * value_ptr, - void * output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = NeighborhoodNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, value_ptr, output_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_in_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_in_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood1D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_in_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_in_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood2D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_in_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_in_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * attn_ptr, - void * d_output_ptr, - void * d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = InverseNeighborhood3D; - Kernel kernel; - kernel( -cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); -} - -void na1d_rpbgrad_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na1d_rpbgrad_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient1D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_float_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); -} - -void na2d_rpbgrad_cuda_naive_half_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_half_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na2d_rpbgrad_cuda_naive_bfloat16_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int kernel_size, - int dilation) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient2D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} -} - -void na3d_rpbgrad_cuda_naive_double_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_9_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_9_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_11_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_11_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_13_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_double_ks_13_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_float_ks_any_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_float_ks_any_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_float_ks_3_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_float_ks_3_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_float_ks_5_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_float_ks_5_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_float_ks_7_di_any( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; - Kernel kernel; - kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); -} - -void na3d_rpbgrad_cuda_naive_float_ks_7_di_1( - const int cc, - cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, - int64_t attn_stride_0, - int64_t attn_stride_1, - int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_float_ks_9_di_any( - const int cc, +void na3d_in_cuda_naive_float_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_float_ks_9_di_1( - const int cc, +void na3d_in_cuda_naive_float_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_float_ks_11_di_any( - const int cc, +void na3d_in_cuda_naive_float_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_float_ks_11_di_1( - const int cc, +void na3d_in_cuda_naive_float_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_float_ks_13_di_any( - const int cc, +void na3d_in_cuda_naive_float_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_float_ks_13_di_1( - const int cc, +void na3d_in_cuda_naive_float_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_half_ks_any_di_any( - const int cc, +void na3d_in_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11221,33 +1975,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_any_di_1( - const int cc, +void na3d_in_cuda_naive_half_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11256,33 +2009,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_3_di_any( - const int cc, +void na3d_in_cuda_naive_half_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11291,33 +2043,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_3_di_1( - const int cc, +void na3d_in_cuda_naive_half_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11326,33 +2077,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_5_di_any( - const int cc, +void na3d_in_cuda_naive_half_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11361,33 +2111,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_5_di_1( - const int cc, +void na3d_in_cuda_naive_half_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11396,33 +2145,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_7_di_any( - const int cc, +void na3d_in_cuda_naive_half_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11431,33 +2179,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_7_di_1( - const int cc, +void na3d_in_cuda_naive_half_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11466,33 +2213,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_9_di_any( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11501,33 +2247,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_9_di_1( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_0_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11536,33 +2281,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_11_di_any( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_0_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11571,33 +2315,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_11_di_1( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_0_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11606,33 +2349,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_13_di_any( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_1_0_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11641,33 +2383,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_half_ks_13_di_1( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_1_0_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 60) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; +if(cc >= 80) { + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11676,33 +2417,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_any_di_any( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_1_1_0( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11711,33 +2451,32 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_any_di_1( - const int cc, +void na3d_in_cuda_naive_bfloat16_cm_1_1_1( + int32_t cc, cudaStream_t stream, - void * d_bias_ptr, - void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + void * attn_ptr, + void * d_output_ptr, + void * d_value_ptr, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack3D; + using Kernel = InverseNeighborhood3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, attn_ptr, d_output_ptr, d_value_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11746,103 +2485,69 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_3_di_any( - const int cc, +void na1d_rpbgrad_cuda_naive_double_cm_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = RelPosBiasGradient1D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_3_di_1( - const int cc, +void na1d_rpbgrad_cuda_naive_float_cm_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = RelPosBiasGradient1D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_5_di_any( - const int cc, +void na1d_rpbgrad_cuda_naive_half_cm_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = RelPosBiasGradient1D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11851,33 +2556,27 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_5_di_1( - const int cc, +void na1d_rpbgrad_cuda_naive_bfloat16_cm_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack1D; + using Kernel = RelPosBiasGradient1D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, length, dim, attn_stride_0, attn_stride_1, attn_stride_2, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11886,103 +2585,75 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_7_di_any( - const int cc, +void na2d_rpbgrad_cuda_naive_double_cm_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = RelPosBiasGradient2D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_7_di_1( - const int cc, +void na2d_rpbgrad_cuda_naive_float_cm_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = RelPosBiasGradient2D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_9_di_any( - const int cc, +void na2d_rpbgrad_cuda_naive_half_cm_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = RelPosBiasGradient2D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -11991,33 +2662,29 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_9_di_1( - const int cc, +void na2d_rpbgrad_cuda_naive_bfloat16_cm_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; - using Kernel = RelPosBiasGradient3D; + using Arguments = natten::naive::ArgumentPack2D; + using Kernel = RelPosBiasGradient2D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -12026,103 +2693,81 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_11_di_any( - const int cc, +void na3d_rpbgrad_cuda_naive_double_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; using Kernel = RelPosBiasGradient3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_11_di_1( - const int cc, +void na3d_rpbgrad_cuda_naive_float_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { - -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; + const std::tuple& kernel_size, + const std::tuple& dilation) { + using Arguments = natten::naive::ArgumentPack3D; using Kernel = RelPosBiasGradient3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); - -} else { -std::cerr << "This half type is not supported on the selected device." << std::endl; -exit(EXIT_FAILURE); - -} +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_13_di_any( - const int cc, +void na3d_rpbgrad_cuda_naive_half_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { -if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; +if(cc >= 60) { + using Arguments = natten::naive::ArgumentPack3D; using Kernel = RelPosBiasGradient3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; @@ -12131,33 +2776,31 @@ exit(EXIT_FAILURE); } } -void na3d_rpbgrad_cuda_naive_bfloat16_ks_13_di_1( - const int cc, +void na3d_rpbgrad_cuda_naive_bfloat16_cm_0_0_0( + int32_t cc, cudaStream_t stream, void * d_bias_ptr, void * d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int kernel_size_d, - int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation) { if(cc >= 80) { - using Arguments = natten::naive::ArgumentPack; + using Arguments = natten::naive::ArgumentPack3D; using Kernel = RelPosBiasGradient3D; Kernel kernel; kernel( -cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation, kernel_size_d, dilation_d); +cc, stream, d_bias_ptr, d_attn_ptr, batch_size, heads, depth, height, width, dim, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4, kernel_size, dilation); } else { std::cerr << "This half type is not supported on the selected device." << std::endl; diff --git a/csrc/include/natten/config.h b/csrc/include/natten/config.h index 98a8d14..a5a4050 100644 --- a/csrc/include/natten/config.h +++ b/csrc/include/natten/config.h @@ -9,7 +9,7 @@ * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in - *all copies or substantial portions of the Software. + * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, diff --git a/csrc/include/natten/cpu/na1d.h b/csrc/include/natten/cpu/na1d.h index 5c5f1fa..049c467 100644 --- a/csrc/include/natten/cpu/na1d.h +++ b/csrc/include/natten/cpu/na1d.h @@ -25,6 +25,7 @@ */ #pragma once +#include #include namespace natten { @@ -36,18 +37,20 @@ void na1d_qk_forward( void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { if (bias_ptr == nullptr) { DISPATCH_DTYPE_na1d_pn_cpu_naive( T, + /* is_grad = */ false, query_ptr, key_ptr, attn_ptr, @@ -59,8 +62,12 @@ void na1d_qk_forward( attn_stride_1, attn_stride_2, kernel_size, - dilation); + dilation, + is_causal); } else { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na1d_pn_bias_cpu_naive( T, query_ptr, @@ -75,7 +82,8 @@ void na1d_qk_forward( attn_stride_1, attn_stride_2, kernel_size, - dilation); + dilation, + is_causal); } } @@ -87,15 +95,16 @@ void na1d_qk_backward( void* d_query_ptr, void* d_key_ptr, void* d_bias_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na1d_nn_cpu_naive( T, d_attn_ptr, @@ -109,7 +118,8 @@ void na1d_qk_backward( attn_stride_1, attn_stride_2, kernel_size, - dilation); + dilation, + is_causal); DISPATCH_DTYPE_na1d_in_cpu_naive( T, d_attn_ptr, @@ -123,8 +133,12 @@ void na1d_qk_backward( attn_stride_1, attn_stride_2, kernel_size, - dilation); + dilation, + is_causal); if (d_bias_ptr != nullptr) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na1d_rpbgrad_cpu_naive( T, d_bias_ptr, @@ -137,7 +151,8 @@ void na1d_qk_backward( attn_stride_1, attn_stride_2, kernel_size, - dilation); + dilation, + is_causal); } } @@ -146,15 +161,16 @@ void na1d_av_forward( void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na1d_nn_cpu_naive( T, attn_ptr, @@ -168,7 +184,8 @@ void na1d_av_forward( attn_stride_1, attn_stride_2, kernel_size, - dilation); + dilation, + is_causal); } template @@ -178,17 +195,19 @@ void na1d_av_backward( void* d_output_ptr, void* d_attn_ptr, void* d_value_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na1d_pn_cpu_naive( T, + /* is_grad = */ true, d_output_ptr, value_ptr, d_attn_ptr, @@ -200,7 +219,8 @@ void na1d_av_backward( attn_stride_1, attn_stride_2, kernel_size, - dilation); + dilation, + is_causal); DISPATCH_DTYPE_na1d_in_cpu_naive( T, attn_ptr, @@ -214,7 +234,8 @@ void na1d_av_backward( attn_stride_1, attn_stride_2, kernel_size, - dilation); + dilation, + is_causal); } } // namespace cpu diff --git a/csrc/include/natten/cpu/na2d.h b/csrc/include/natten/cpu/na2d.h index 02cc793..210066c 100644 --- a/csrc/include/natten/cpu/na2d.h +++ b/csrc/include/natten/cpu/na2d.h @@ -25,6 +25,7 @@ */ #pragma once +#include #include namespace natten { @@ -36,20 +37,22 @@ void na2d_qk_forward( void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { if (bias_ptr == nullptr) { DISPATCH_DTYPE_na2d_pn_cpu_naive( T, + /* is_grad = */ false, query_ptr, key_ptr, attn_ptr, @@ -63,8 +66,12 @@ void na2d_qk_forward( attn_stride_2, attn_stride_3, kernel_size, - dilation); + dilation, + is_causal); } else { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na2d_pn_bias_cpu_naive( T, query_ptr, @@ -81,7 +88,8 @@ void na2d_qk_forward( attn_stride_2, attn_stride_3, kernel_size, - dilation); + dilation, + is_causal); } } @@ -93,17 +101,18 @@ void na2d_qk_backward( void* d_query_ptr, void* d_key_ptr, void* d_bias_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na2d_nn_cpu_naive( T, d_attn_ptr, @@ -119,7 +128,8 @@ void na2d_qk_backward( attn_stride_2, attn_stride_3, kernel_size, - dilation); + dilation, + is_causal); DISPATCH_DTYPE_na2d_in_cpu_naive( T, d_attn_ptr, @@ -135,8 +145,12 @@ void na2d_qk_backward( attn_stride_2, attn_stride_3, kernel_size, - dilation); + dilation, + is_causal); if (d_bias_ptr != nullptr) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na2d_rpbgrad_cpu_naive( T, d_bias_ptr, @@ -151,7 +165,8 @@ void na2d_qk_backward( attn_stride_2, attn_stride_3, kernel_size, - dilation); + dilation, + is_causal); } } @@ -160,17 +175,18 @@ void na2d_av_forward( void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na2d_nn_cpu_naive( T, attn_ptr, @@ -186,7 +202,8 @@ void na2d_av_forward( attn_stride_2, attn_stride_3, kernel_size, - dilation); + dilation, + is_causal); } template @@ -196,19 +213,21 @@ void na2d_av_backward( void* d_output_ptr, void* d_attn_ptr, void* d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na2d_pn_cpu_naive( T, + /* is_grad = */ true, d_output_ptr, value_ptr, d_attn_ptr, @@ -222,7 +241,8 @@ void na2d_av_backward( attn_stride_2, attn_stride_3, kernel_size, - dilation); + dilation, + is_causal); DISPATCH_DTYPE_na2d_in_cpu_naive( T, attn_ptr, @@ -238,7 +258,8 @@ void na2d_av_backward( attn_stride_2, attn_stride_3, kernel_size, - dilation); + dilation, + is_causal); } } // namespace cpu diff --git a/csrc/include/natten/cpu/na3d.h b/csrc/include/natten/cpu/na3d.h index 8a88681..4c1fe90 100644 --- a/csrc/include/natten/cpu/na3d.h +++ b/csrc/include/natten/cpu/na3d.h @@ -25,6 +25,7 @@ */ #pragma once +#include #include namespace natten { @@ -36,24 +37,24 @@ void na3d_qk_forward( void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int depth_kernel_size, - int depth_dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { if (bias_ptr == nullptr) { DISPATCH_DTYPE_na3d_pn_cpu_naive( T, + /* is_grad = */ false, query_ptr, key_ptr, attn_ptr, @@ -69,10 +70,12 @@ void na3d_qk_forward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, dilation, - depth_dilation); + is_causal); } else { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na3d_pn_bias_cpu_naive( T, query_ptr, @@ -91,9 +94,8 @@ void na3d_qk_forward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, dilation, - depth_dilation); + is_causal); } } @@ -105,21 +107,20 @@ void na3d_qk_backward( void* d_query_ptr, void* d_key_ptr, void* d_bias_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int depth_kernel_size, - int depth_dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na3d_nn_cpu_naive( T, d_attn_ptr, @@ -137,9 +138,8 @@ void na3d_qk_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, dilation, - depth_dilation); + is_causal); DISPATCH_DTYPE_na3d_in_cpu_naive( T, d_attn_ptr, @@ -157,10 +157,12 @@ void na3d_qk_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, dilation, - depth_dilation); + is_causal); if (d_bias_ptr != nullptr) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na3d_rpbgrad_cpu_naive( T, d_bias_ptr, @@ -177,9 +179,8 @@ void na3d_qk_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, dilation, - depth_dilation); + is_causal); } } @@ -188,21 +189,20 @@ void na3d_av_forward( void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int depth_kernel_size, - int depth_dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na3d_nn_cpu_naive( T, attn_ptr, @@ -220,9 +220,8 @@ void na3d_av_forward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, dilation, - depth_dilation); + is_causal); } template @@ -232,23 +231,23 @@ void na3d_av_backward( void* d_output_ptr, void* d_attn_ptr, void* d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int depth_kernel_size, - int depth_dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na3d_pn_cpu_naive( T, + /* is_grad = */ true, d_output_ptr, value_ptr, d_attn_ptr, @@ -264,9 +263,8 @@ void na3d_av_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, dilation, - depth_dilation); + is_causal); DISPATCH_DTYPE_na3d_in_cpu_naive( T, attn_ptr, @@ -284,9 +282,8 @@ void na3d_av_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, dilation, - depth_dilation); + is_causal); } } // namespace cpu diff --git a/csrc/include/natten/cpu/naive/inverse_neighborhood_1d.hpp b/csrc/include/natten/cpu/naive/inverse_neighborhood_1d.hpp index e2d91c0..1df9678 100644 --- a/csrc/include/natten/cpu/naive/inverse_neighborhood_1d.hpp +++ b/csrc/include/natten/cpu/naive/inverse_neighborhood_1d.hpp @@ -39,7 +39,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -55,71 +56,85 @@ struct InverseNeighborhood1D { void* attn_ptr, void* d_output_ptr, void* d_value_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { launch( reinterpret_cast(attn_ptr), reinterpret_cast(d_output_ptr), reinterpret_cast(d_value_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, - attn_stride_2); + attn_stride_2, + is_causal); } void launch( // K-grad / V-grad scalar_t* weights, // d_attn / attn scalar_t* values, // query / d_out scalar_t* output, // d_key / d_value - const int length, - const int heads, - const int kernel_size, - const int dilation, - const int dim, - const int batch_size, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2) { - const int neighborhood_size = kernel_size / 2; - const int values_stride_2 = dim; - const int values_stride_1 = length * values_stride_2; - const int values_stride_0 = heads * values_stride_1; - for (int b = 0; b < batch_size; b++) { - at::parallel_for(0, heads, GRAIN_SIZE, [&](int start, int end) { - for (int h = start; h < end; h++) { - for (int i = 0; i < length; i++) { - const int ni = get_backward_window_start( - i, kernel_size, neighborhood_size, dilation); - const int ei = get_backward_window_end( - i, length, kernel_size, neighborhood_size, dilation); - for (int d = 0; d < dim; d++) { - const int64_t weightsOffset = + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t dim, + int32_t batch_size, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + const std::tuple& is_causal) { + auto is_causal_0 = std::get<0>(is_causal); + auto neighborhood_size = kernel_size / 2; + int64_t values_stride_2 = dim; + int64_t values_stride_1 = length * values_stride_2; + int64_t values_stride_0 = heads * values_stride_1; + for (int32_t b = 0; b < batch_size; b++) { + at::parallel_for(0, heads, GRAIN_SIZE, [&](int32_t start, int32_t end) { + for (int32_t h = start; h < end; h++) { + for (int32_t i = 0; i < length; i++) { + auto ni = get_backward_window_start( + i, kernel_size, neighborhood_size, dilation, is_causal_0); + auto ei = get_backward_window_end( + i, + length, + kernel_size, + neighborhood_size, + dilation, + is_causal_0); + for (int32_t d = 0; d < dim; d++) { + int64_t weightsOffset = b * weights_stride_0 + h * weights_stride_1; - const int64_t valuesOffset = + int64_t valuesOffset = b * values_stride_0 + h * values_stride_1 + d; scalar_t output_update = scalar_t(0); - for (int xi = ni; xi < ei; xi += dilation) { - const int oni = get_window_start( - xi, length, kernel_size, neighborhood_size, dilation); - const int64_t valuesIndex = valuesOffset + xi * values_stride_2; - const int64_t weightsIndex = weightsOffset + xi * weights_stride_2 + - int((i - oni) / dilation); + for (int32_t xi = ni; xi < ei; xi += dilation) { + auto oni = get_window_start( + xi, + length, + kernel_size, + neighborhood_size, + dilation, + is_causal_0); + int64_t valuesIndex = valuesOffset + xi * values_stride_2; + int64_t weightsIndex = weightsOffset + xi * weights_stride_2 + + int32_t((i - oni) / dilation); output_update += values[valuesIndex] * weights[weightsIndex]; } - const int64_t linearIndex = b * values_stride_0 + - h * values_stride_1 + i * values_stride_2 + d; + int64_t linearIndex = b * values_stride_0 + h * values_stride_1 + + i * values_stride_2 + d; output[linearIndex] = output_update; } } diff --git a/csrc/include/natten/cpu/naive/inverse_neighborhood_2d.hpp b/csrc/include/natten/cpu/naive/inverse_neighborhood_2d.hpp index 7f5f3d7..a79acfa 100644 --- a/csrc/include/natten/cpu/naive/inverse_neighborhood_2d.hpp +++ b/csrc/include/natten/cpu/naive/inverse_neighborhood_2d.hpp @@ -39,7 +39,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -55,17 +56,18 @@ struct InverseNeighborhood2D { void* attn_ptr, void* d_output_ptr, void* d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { launch( reinterpret_cast(attn_ptr), reinterpret_cast(d_output_ptr), @@ -73,71 +75,104 @@ struct InverseNeighborhood2D { height, width, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, attn_stride_2, - attn_stride_3); + attn_stride_3, + is_causal); } void launch( // K-grad / V-grad scalar_t* weights, // d_attn / attn scalar_t* values, // query / d_out scalar_t* output, // d_key / d_value - const int height, - const int width, - const int heads, - const int kernel_size, - const int dilation, - const int dim, - const int batch_size, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t weights_stride_3) { - const int neighborhood_size = kernel_size / 2; - const int values_stride_3 = dim; - const int values_stride_2 = width * values_stride_3; - const int values_stride_1 = height * values_stride_2; - const int values_stride_0 = heads * values_stride_1; - for (int b = 0; b < batch_size; b++) { - at::parallel_for(0, heads, GRAIN_SIZE, [&](int start, int end) { - for (int h = start; h < end; h++) { - for (int i = 0; i < height; i++) { - const int ni = get_backward_window_start( - i, kernel_size, neighborhood_size, dilation); - const int ei = get_backward_window_end( - i, height, kernel_size, neighborhood_size, dilation); - for (int j = 0; j < width; j++) { - const int nj = get_backward_window_start( - j, kernel_size, neighborhood_size, dilation); - const int ej = get_backward_window_end( - j, width, kernel_size, neighborhood_size, dilation); - for (int d = 0; d < dim; d++) { - const int64_t weightsOffset = + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t dim, + int32_t batch_size, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t weights_stride_3, + const std::tuple& is_causal) { + auto is_causal_0 = std::get<0>(is_causal); + auto is_causal_1 = std::get<1>(is_causal); + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + int64_t values_stride_3 = dim; + int64_t values_stride_2 = width * values_stride_3; + int64_t values_stride_1 = height * values_stride_2; + int64_t values_stride_0 = heads * values_stride_1; + for (int32_t b = 0; b < batch_size; b++) { + at::parallel_for(0, heads, GRAIN_SIZE, [&](int32_t start, int32_t end) { + for (int32_t h = start; h < end; h++) { + for (int32_t i = 0; i < height; i++) { + auto ni = get_backward_window_start( + i, kernel_size_0, neighborhood_size_0, dilation_0, is_causal_0); + auto ei = get_backward_window_end( + i, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + for (int32_t j = 0; j < width; j++) { + auto nj = get_backward_window_start( + j, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + auto ej = get_backward_window_end( + j, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + for (int32_t d = 0; d < dim; d++) { + int64_t weightsOffset = b * weights_stride_0 + h * weights_stride_1; - const int64_t outOffset = + int64_t outOffset = b * values_stride_0 + h * values_stride_1 + d; scalar_t output_update = scalar_t(0); - for (int xi = ni; xi < ei; xi += dilation) { - const int oni = get_window_start( - xi, height, kernel_size, neighborhood_size, dilation); - for (int xj = nj; xj < ej; xj += dilation) { - const int onj = get_window_start( - xj, width, kernel_size, neighborhood_size, dilation); - const int64_t outIndex = + for (int32_t xi = ni; xi < ei; xi += dilation_0) { + auto oni = get_window_start( + xi, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + for (int32_t xj = nj; xj < ej; xj += dilation_1) { + auto onj = get_window_start( + xj, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + int64_t outIndex = outOffset + xi * values_stride_2 + xj * values_stride_3; - const int64_t weightsIndex = weightsOffset + + int64_t weightsIndex = weightsOffset + xi * weights_stride_2 + xj * weights_stride_3 + - int((i - oni) / dilation) * kernel_size + - int((j - onj) / dilation); + int32_t((i - oni) / dilation_0) * kernel_size_1 + + int32_t((j - onj) / dilation_1); output_update += values[outIndex] * weights[weightsIndex]; } } - const int64_t linearIndex = b * values_stride_0 + + int64_t linearIndex = b * values_stride_0 + h * values_stride_1 + i * values_stride_2 + j * values_stride_3 + d; output[linearIndex] = output_update; diff --git a/csrc/include/natten/cpu/naive/inverse_neighborhood_3d.hpp b/csrc/include/natten/cpu/naive/inverse_neighborhood_3d.hpp index a9f2789..a926d1a 100644 --- a/csrc/include/natten/cpu/naive/inverse_neighborhood_3d.hpp +++ b/csrc/include/natten/cpu/naive/inverse_neighborhood_3d.hpp @@ -39,7 +39,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -53,21 +54,20 @@ struct InverseNeighborhood3D { void* attn_ptr, void* d_output_ptr, void* d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { launch( reinterpret_cast(attn_ptr), reinterpret_cast(d_output_ptr), @@ -76,101 +76,141 @@ struct InverseNeighborhood3D { height, width, heads, - kernel_size, - kernel_size_depth, - dilation, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, - attn_stride_4); + attn_stride_4, + is_causal); } void launch( // K-grad / V-grad scalar_t* weights, // d_attn / attn scalar_t* values, // query / d_out scalar_t* output, // d_key / d_value - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size, - const int kernel_size_d, - const int dilation, - const int dilation_d, - const int dim, - const int batch_size, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t weights_stride_3, - const int64_t weights_stride_4) { - const int neighborhood_size = kernel_size / 2; - const int neighborhood_size_d = kernel_size_d / 2; - const int values_stride_4 = dim; - const int values_stride_3 = width * values_stride_4; - const int values_stride_2 = height * values_stride_3; - const int values_stride_1 = depth * values_stride_2; - const int values_stride_0 = heads * values_stride_1; - for (int b = 0; b < batch_size; b++) { - at::parallel_for(0, heads, GRAIN_SIZE, [&](int start, int end) { - for (int h = start; h < end; h++) { - for (int k = 0; k < depth; k++) { - const int nk = get_backward_window_start( - k, kernel_size_d, neighborhood_size_d, dilation_d); - const int ek = get_backward_window_end( - k, depth, kernel_size_d, neighborhood_size_d, dilation_d); - for (int i = 0; i < height; i++) { - const int ni = get_backward_window_start( - i, kernel_size, neighborhood_size, dilation); - const int ei = get_backward_window_end( - i, height, kernel_size, neighborhood_size, dilation); - for (int j = 0; j < width; j++) { - const int nj = get_backward_window_start( - j, kernel_size, neighborhood_size, dilation); - const int ej = get_backward_window_end( - j, width, kernel_size, neighborhood_size, dilation); - for (int d = 0; d < dim; d++) { - const int64_t weightsOffset = + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t dim, + int32_t batch_size, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t weights_stride_3, + int64_t weights_stride_4, + const std::tuple& is_causal) { + auto is_causal_0 = std::get<0>(is_causal); + auto is_causal_1 = std::get<1>(is_causal); + auto is_causal_2 = std::get<2>(is_causal); + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + auto neighborhood_size_2 = kernel_size_2 / 2; + int64_t values_stride_4 = dim; + int64_t values_stride_3 = width * values_stride_4; + int64_t values_stride_2 = height * values_stride_3; + int64_t values_stride_1 = depth * values_stride_2; + int64_t values_stride_0 = heads * values_stride_1; + for (int32_t b = 0; b < batch_size; b++) { + at::parallel_for(0, heads, GRAIN_SIZE, [&](int32_t start, int32_t end) { + for (int32_t h = start; h < end; h++) { + for (int32_t k = 0; k < depth; k++) { + auto nk = get_backward_window_start( + k, kernel_size_0, neighborhood_size_0, dilation_0, is_causal_0); + auto ek = get_backward_window_end( + k, + depth, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + for (int32_t i = 0; i < height; i++) { + auto ni = get_backward_window_start( + i, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + auto ei = get_backward_window_end( + i, + height, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + for (int32_t j = 0; j < width; j++) { + auto nj = get_backward_window_start( + j, + kernel_size_2, + neighborhood_size_2, + dilation_2, + is_causal_2); + auto ej = get_backward_window_end( + j, + width, + kernel_size_2, + neighborhood_size_2, + dilation_2, + is_causal_2); + for (int32_t d = 0; d < dim; d++) { + int64_t weightsOffset = b * weights_stride_0 + h * weights_stride_1; - const int64_t outOffset = + int64_t outOffset = b * values_stride_0 + h * values_stride_1 + d; scalar_t output_update = scalar_t(0); - for (int xk = nk; xk < ek; xk += dilation_d) { - const int onk = get_window_start( + for (int32_t xk = nk; xk < ek; xk += dilation_0) { + auto onk = get_window_start( xk, depth, - kernel_size_d, - neighborhood_size_d, - dilation_d); - for (int xi = ni; xi < ei; xi += dilation) { - const int oni = get_window_start( - xi, height, kernel_size, neighborhood_size, dilation); - for (int xj = nj; xj < ej; xj += dilation) { - const int onj = get_window_start( + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + for (int32_t xi = ni; xi < ei; xi += dilation_1) { + auto oni = get_window_start( + xi, + height, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + for (int32_t xj = nj; xj < ej; xj += dilation_2) { + auto onj = get_window_start( xj, width, - kernel_size, - neighborhood_size, - dilation); - const int64_t outIndex = outOffset + xk * values_stride_2 + + kernel_size_2, + neighborhood_size_2, + dilation_2, + is_causal_2); + int64_t outIndex = outOffset + xk * values_stride_2 + xi * values_stride_3 + xj * values_stride_4; - const int64_t weightsIndex = weightsOffset + + int64_t weightsIndex = weightsOffset + xk * weights_stride_2 + xi * weights_stride_3 + xj * weights_stride_4 + - int((k - onk) / dilation_d) * - (kernel_size * kernel_size) + - int((i - oni) / dilation) * kernel_size + - int((j - onj) / dilation); + int32_t((k - onk) / dilation_0) * + (kernel_size_1 * kernel_size_2) + + int32_t((i - oni) / dilation_1) * kernel_size_2 + + int32_t((j - onj) / dilation_2); output_update += values[outIndex] * weights[weightsIndex]; } } } - const int64_t linearIndex = b * values_stride_0 + + int64_t linearIndex = b * values_stride_0 + h * values_stride_1 + k * values_stride_2 + i * values_stride_3 + j * values_stride_4 + d; output[linearIndex] = output_update; diff --git a/csrc/include/natten/cpu/naive/natten_cpu_commons.h b/csrc/include/natten/cpu/naive/natten_cpu_commons.h index b47cfb7..c9306f7 100644 --- a/csrc/include/natten/cpu/naive/natten_cpu_commons.h +++ b/csrc/include/natten/cpu/naive/natten_cpu_commons.h @@ -21,7 +21,7 @@ * **************************************************************************************************/ /*! \file - \brief Holds dispatchers, and common functions shared between ops. + \brief Holds common functions shared between ops. */ #pragma once @@ -30,67 +30,97 @@ namespace natten { namespace cpu { namespace naive { -inline int get_backward_window_start( - const int index, - const int KERNEL_SIZE, - const int NEIGHBORHOOD_SIZE, - const int dilation) { - return (index < KERNEL_SIZE * dilation) - ? (index % dilation) - : index - NEIGHBORHOOD_SIZE * dilation; +template +struct AttnMask { + static_assert(std::numeric_limits::is_iec559); + + static inline auto value(bool is_grad) { + return is_grad ? T(0.0) : -std::numeric_limits::infinity(); + } +}; + +inline int32_t get_backward_window_start( + int32_t index, + int32_t kernel_size, + int32_t neighborhood_size, + int32_t dilation, + bool is_causal) { + if (!is_causal) { + return (index < kernel_size * dilation) + ? (index % dilation) + : index - neighborhood_size * dilation; + } + return index; } -inline int get_backward_window_end( - const int index, - const int length, - const int KERNEL_SIZE, - const int NEIGHBORHOOD_SIZE, - const int dilation) { - return (index >= length - KERNEL_SIZE * dilation) - ? (length) - : (index + (NEIGHBORHOOD_SIZE + 1) * dilation); +inline int32_t get_backward_window_end( + int32_t index, + int32_t length, + int32_t kernel_size, + int32_t neighborhood_size, + int32_t dilation, + bool is_causal) { + if (!is_causal) { + return (index >= length - kernel_size * dilation) + ? (length) + : (index + (neighborhood_size + 1) * dilation); + } + return std::min(index + kernel_size * dilation, length); } -inline int get_window_start( - const int index, - const int length, - const int KERNEL_SIZE, - const int NEIGHBORHOOD_SIZE, - const int dilation) { - if (dilation <= 1) - return std::max(index - NEIGHBORHOOD_SIZE, 0) + - (index + NEIGHBORHOOD_SIZE >= length) * - (length - index - NEIGHBORHOOD_SIZE - 1); - int ni = index - NEIGHBORHOOD_SIZE * dilation; - if (ni < 0) - return index % dilation; - if (index + NEIGHBORHOOD_SIZE * dilation >= length) { - const int imodd = index % dilation; - const int a = int(length / dilation) * dilation; - const int b = length - a; - if (imodd < b) - return length - b + imodd - 2 * NEIGHBORHOOD_SIZE * dilation; - return a + imodd - KERNEL_SIZE * dilation; +inline int32_t get_window_start( + int32_t index, + int32_t length, + int32_t kernel_size, + int32_t neighborhood_size, + int32_t dilation, + bool is_causal) { + auto dilation_idx = index % dilation; + auto index_pdp = index / dilation; + auto length_pdp = (length + dilation - 1) / dilation; + auto num_padded = (length_pdp * dilation) - length; + length_pdp -= (dilation_idx >= dilation - num_padded) ? 1 : 0; + int32_t start_idx; + if (!is_causal) { + start_idx = std::max(index_pdp - neighborhood_size, 0) + + (index_pdp + neighborhood_size >= length_pdp) * + (length_pdp - index_pdp - neighborhood_size - 1); + } else { + start_idx = std::max(index_pdp - kernel_size + 1, 0); + } + return start_idx * dilation + dilation_idx; +} + +inline int32_t get_window_end( + int32_t index, + int32_t start_index, + int32_t length, + int32_t kernel_size, + int32_t neighborhood_size, + int32_t dilation, + bool is_causal) { + if (!is_causal) { + return std::min(length, start_index + kernel_size * dilation); } - return ni; + return std::min(length, index + dilation); } -inline int get_pb_start( - const int index, - const int length, - const int KERNEL_SIZE, - const int NEIGHBORHOOD_SIZE, - const int dilation) { +inline int32_t get_pb_start( + int32_t index, + int32_t length, + int32_t kernel_size, + int32_t neighborhood_size, + int32_t dilation) { if (dilation <= 1) - return NEIGHBORHOOD_SIZE + - (index < NEIGHBORHOOD_SIZE) * (NEIGHBORHOOD_SIZE - index) + - (index + NEIGHBORHOOD_SIZE >= length) * - (length - index - 1 - NEIGHBORHOOD_SIZE); - if (index - NEIGHBORHOOD_SIZE * dilation < 0) - return KERNEL_SIZE - 1 - (index / dilation); - if (index + NEIGHBORHOOD_SIZE * dilation >= length) + return neighborhood_size + + (index < neighborhood_size) * (neighborhood_size - index) + + (index + neighborhood_size >= length) * + (length - index - 1 - neighborhood_size); + if (index - neighborhood_size * dilation < 0) + return kernel_size - 1 - (index / dilation); + if (index + neighborhood_size * dilation >= length) return (length - index - 1) / dilation; - return NEIGHBORHOOD_SIZE; + return neighborhood_size; } } // namespace naive diff --git a/csrc/include/natten/cpu/naive/neighborhood_neighborhood_1d.hpp b/csrc/include/natten/cpu/naive/neighborhood_neighborhood_1d.hpp index af98ba5..11f8875 100644 --- a/csrc/include/natten/cpu/naive/neighborhood_neighborhood_1d.hpp +++ b/csrc/include/natten/cpu/naive/neighborhood_neighborhood_1d.hpp @@ -39,7 +39,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -55,67 +56,83 @@ struct NeighborhoodNeighborhood1D { void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { launch( reinterpret_cast(attn_ptr), reinterpret_cast(value_ptr), reinterpret_cast(output_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, - attn_stride_2); + attn_stride_2, + is_causal); } void launch( // AV / Q-grad scalar_t* weights, // attn / d_attn scalar_t* values, // value / key scalar_t* output, // output / d_query - const int length, - const int heads, - const int kernel_size, - const int dilation, - const int dim, - const int batch_size, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2) { - const int neighborhood_size = kernel_size / 2; - const int values_stride_2 = dim; - const int values_stride_1 = length * values_stride_2; - const int values_stride_0 = heads * values_stride_1; - for (int b = 0; b < batch_size; b++) { - at::parallel_for(0, heads, GRAIN_SIZE, [&](int start, int end) { - for (int h = start; h < end; h++) { - for (int i = 0; i < length; i++) { - const int ni = get_window_start( - i, length, kernel_size, neighborhood_size, dilation); - for (int d = 0; d < dim; d++) { + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t dim, + int32_t batch_size, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + const std::tuple& is_causal) { + auto is_causal_0 = std::get<0>(is_causal); + auto neighborhood_size = kernel_size / 2; + int64_t values_stride_2 = dim; + int64_t values_stride_1 = length * values_stride_2; + int64_t values_stride_0 = heads * values_stride_1; + for (int32_t b = 0; b < batch_size; b++) { + at::parallel_for(0, heads, GRAIN_SIZE, [&](int32_t start, int32_t end) { + for (int32_t h = start; h < end; h++) { + for (int32_t i = 0; i < length; i++) { + auto ni = get_window_start( + i, + length, + kernel_size, + neighborhood_size, + dilation, + is_causal_0); + auto ei = get_window_end( + i, + ni, + length, + kernel_size, + neighborhood_size, + dilation, + is_causal_0); + for (int32_t d = 0; d < dim; d++) { scalar_t output_update = scalar_t(0); int64_t attnOffset = b * weights_stride_0 + h * weights_stride_1 + i * weights_stride_2; - const int64_t valuesOffset = + int64_t valuesOffset = b * values_stride_0 + h * values_stride_1 + d; - for (int xi = ni; xi < ni + kernel_size * dilation; - xi += dilation) { - const int64_t valuesIndex = valuesOffset + xi * values_stride_2; + for (int32_t xi = ni; xi < ei; xi += dilation) { + int64_t valuesIndex = valuesOffset + xi * values_stride_2; output_update += weights[attnOffset] * values[valuesIndex]; ++attnOffset; } - const int64_t linearIndex = b * values_stride_0 + - h * values_stride_1 + i * values_stride_2 + d; + int64_t linearIndex = b * values_stride_0 + h * values_stride_1 + + i * values_stride_2 + d; output[linearIndex] = output_update; } } diff --git a/csrc/include/natten/cpu/naive/neighborhood_neighborhood_2d.hpp b/csrc/include/natten/cpu/naive/neighborhood_neighborhood_2d.hpp index 02b5f66..ec3cafb 100644 --- a/csrc/include/natten/cpu/naive/neighborhood_neighborhood_2d.hpp +++ b/csrc/include/natten/cpu/naive/neighborhood_neighborhood_2d.hpp @@ -39,7 +39,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -53,17 +54,18 @@ struct NeighborhoodNeighborhood2D { void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { launch( reinterpret_cast(attn_ptr), reinterpret_cast(value_ptr), @@ -71,36 +73,45 @@ struct NeighborhoodNeighborhood2D { height, width, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, attn_stride_2, - attn_stride_3); + attn_stride_3, + is_causal); } void launch( // AV / Q-grad scalar_t* weights, // attn / d_attn scalar_t* values, // value / key scalar_t* output, // output / d_query - const int height, - const int width, - const int heads, - const int kernel_size, - const int dilation, - const int dim, - const int batch_size, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t weights_stride_3) { - const int neighborhood_size = kernel_size / 2; - const int values_stride_3 = dim; - const int values_stride_2 = width * values_stride_3; - const int values_stride_1 = height * values_stride_2; - const int values_stride_0 = heads * values_stride_1; + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t dim, + int32_t batch_size, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t weights_stride_3, + const std::tuple& is_causal) { + auto is_causal_0 = std::get<0>(is_causal); + auto is_causal_1 = std::get<1>(is_causal); + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + int64_t values_stride_3 = dim; + int64_t values_stride_2 = width * values_stride_3; + int64_t values_stride_1 = height * values_stride_2; + int64_t values_stride_0 = heads * values_stride_1; // NOTE: this function originally had an AVX impl, // but it was removed when migrating to the new NATTEN api // Unsure what the issue was; I wrote this well over a year ago so... @@ -110,39 +121,65 @@ struct NeighborhoodNeighborhood2D { 0, batch_size * heads * height * width, GRAIN_SIZE, - [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / width; - const int j = x - indtmp1 * width; - int indtmp2 = indtmp1 / height; - const int i = indtmp1 - indtmp2 * height; + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / width; + auto j = x - indtmp1 * width; + int32_t indtmp2 = indtmp1 / height; + auto i = indtmp1 - indtmp2 * height; indtmp1 = indtmp2; indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, height, kernel_size, neighborhood_size, dilation); - const int nj = get_window_start( - j, width, kernel_size, neighborhood_size, dilation); - for (int d = 0; d < dim; d++) { + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto ni = get_window_start( + i, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto nj = get_window_start( + j, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + auto ei = get_window_end( + i, + ni, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto ej = get_window_end( + j, + nj, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + for (int32_t d = 0; d < dim; d++) { scalar_t updt = scalar_t(0); - int64_t weightsOffset = b * weights_stride_0 + h * weights_stride_1 + - i * weights_stride_2 + j * weights_stride_3; - const int64_t valuesOffset = + int64_t weightsOffset = b * weights_stride_0 + + h * weights_stride_1 + i * weights_stride_2 + + j * weights_stride_3; + int64_t valuesOffset = b * values_stride_0 + h * values_stride_1 + d; - for (int xi = ni; xi < ni + kernel_size * dilation; - xi += dilation) { - for (int xj = nj; xj < nj + kernel_size * dilation; - xj += dilation) { - const int64_t valuesIndex = valuesOffset + xi * values_stride_2 + + for (int32_t xi = ni; xi < ei; xi += dilation_0) { + for (int32_t xj = nj; xj < ej; xj += dilation_1) { + int64_t valuesIndex = valuesOffset + xi * values_stride_2 + xj * values_stride_3; - updt += weights[weightsOffset] * values[valuesIndex]; - ++weightsOffset; + int64_t weightsIndex = weightsOffset + + int32_t((xi - ni) / dilation_0) * kernel_size_1 + + int32_t((xj - nj) / dilation_1); + updt += weights[weightsIndex] * values[valuesIndex]; } } - const int64_t linearIndex = b * values_stride_0 + - h * values_stride_1 + i * values_stride_2 + - j * values_stride_3 + d; + int64_t linearIndex = b * values_stride_0 + h * values_stride_1 + + i * values_stride_2 + j * values_stride_3 + d; output[linearIndex] = updt; } } diff --git a/csrc/include/natten/cpu/naive/neighborhood_neighborhood_3d.hpp b/csrc/include/natten/cpu/naive/neighborhood_neighborhood_3d.hpp index 8797e3f..20bbabb 100644 --- a/csrc/include/natten/cpu/naive/neighborhood_neighborhood_3d.hpp +++ b/csrc/include/natten/cpu/naive/neighborhood_neighborhood_3d.hpp @@ -39,7 +39,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -53,21 +54,20 @@ struct NeighborhoodNeighborhood3D { void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { launch( reinterpret_cast(attn_ptr), reinterpret_cast(value_ptr), @@ -76,92 +76,141 @@ struct NeighborhoodNeighborhood3D { height, width, heads, - kernel_size, - kernel_size_depth, - dilation, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, - attn_stride_4); + attn_stride_4, + is_causal); } void launch( // AV / Q-grad scalar_t* weights, // attn / d_attn scalar_t* values, // value / key scalar_t* output, // output / d_query - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size, - const int kernel_size_d, - const int dilation, - const int dilation_d, - const int dim, - const int batch_size, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t weights_stride_3, - const int64_t weights_stride_4) { - const int neighborhood_size = kernel_size / 2; - const int neighborhood_size_d = kernel_size_d / 2; - const int values_stride_4 = dim; - const int values_stride_3 = width * values_stride_4; - const int values_stride_2 = height * values_stride_3; - const int values_stride_1 = depth * values_stride_2; - const int values_stride_0 = heads * values_stride_1; + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t dim, + int32_t batch_size, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t weights_stride_3, + int64_t weights_stride_4, + const std::tuple& is_causal) { + auto is_causal_0 = std::get<0>(is_causal); + auto is_causal_1 = std::get<1>(is_causal); + auto is_causal_2 = std::get<2>(is_causal); + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + auto neighborhood_size_2 = kernel_size_2 / 2; + int64_t values_stride_4 = dim; + int64_t values_stride_3 = width * values_stride_4; + int64_t values_stride_2 = height * values_stride_3; + int64_t values_stride_1 = depth * values_stride_2; + int64_t values_stride_0 = heads * values_stride_1; at::parallel_for( 0, batch_size * heads * depth * height * width, GRAIN_SIZE, - [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / width; - const int j = x - indtmp1 * width; - int indtmp2 = indtmp1 / height; - const int i = indtmp1 - indtmp2 * height; + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / width; + auto j = x - indtmp1 * width; + int32_t indtmp2 = indtmp1 / height; + auto i = indtmp1 - indtmp2 * height; indtmp1 = indtmp2; indtmp2 = indtmp1 / depth; - const int k = indtmp1 - indtmp2 * depth; + auto k = indtmp1 - indtmp2 * depth; indtmp1 = indtmp2; indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, height, kernel_size, neighborhood_size, dilation); - const int nj = get_window_start( - j, width, kernel_size, neighborhood_size, dilation); - const int nk = get_window_start( - k, depth, kernel_size_d, neighborhood_size_d, dilation_d); - for (int d = 0; d < dim; d++) { + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto nk = get_window_start( + k, + depth, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto ni = get_window_start( + i, + height, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + auto nj = get_window_start( + j, + width, + kernel_size_2, + neighborhood_size_2, + dilation_2, + is_causal_2); + auto ek = get_window_end( + k, + nk, + depth, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto ei = get_window_end( + i, + ni, + height, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + auto ej = get_window_end( + j, + nj, + width, + kernel_size_2, + neighborhood_size_2, + dilation_2, + is_causal_2); + for (int32_t d = 0; d < dim; d++) { scalar_t updt = scalar_t(0); - int64_t weightsOffset = b * weights_stride_0 + h * weights_stride_1 + - k * weights_stride_2 + i * weights_stride_3 + - j * weights_stride_4; - const int64_t valuesOffset = + int64_t weightsOffset = b * weights_stride_0 + + h * weights_stride_1 + k * weights_stride_2 + + i * weights_stride_3 + j * weights_stride_4; + int64_t valuesOffset = b * values_stride_0 + h * values_stride_1 + d; - for (int xk = nk; xk < nk + kernel_size_d * dilation_d; - xk += dilation_d) { - for (int xi = ni; xi < ni + kernel_size * dilation; - xi += dilation) { - for (int xj = nj; xj < nj + kernel_size * dilation; - xj += dilation) { - const int64_t valuesIndex = valuesOffset + - xk * values_stride_2 + xi * values_stride_3 + - xj * values_stride_4; - updt += weights[weightsOffset] * values[valuesIndex]; - ++weightsOffset; + for (int32_t xk = nk; xk < ek; xk += dilation_0) { + for (int32_t xi = ni; xi < ei; xi += dilation_1) { + for (int32_t xj = nj; xj < ej; xj += dilation_2) { + int64_t valuesIndex = valuesOffset + xk * values_stride_2 + + xi * values_stride_3 + xj * values_stride_4; + int64_t weightsIndex = weightsOffset + + int32_t((xk - nk) / dilation_0) * + (kernel_size_1 * kernel_size_2) + + int32_t((xi - ni) / dilation_1) * kernel_size_2 + + int32_t((xj - nj) / dilation_2); + updt += weights[weightsIndex] * values[valuesIndex]; } } } - const int64_t linearIndex = b * values_stride_0 + - h * values_stride_1 + k * values_stride_2 + - i * values_stride_3 + j * values_stride_4 + d; + int64_t linearIndex = b * values_stride_0 + h * values_stride_1 + + k * values_stride_2 + i * values_stride_3 + + j * values_stride_4 + d; output[linearIndex] = updt; } } diff --git a/csrc/include/natten/cpu/naive/pointwise_neighborhood_1d.hpp b/csrc/include/natten/cpu/naive/pointwise_neighborhood_1d.hpp index a269856..a84af36 100644 --- a/csrc/include/natten/cpu/naive/pointwise_neighborhood_1d.hpp +++ b/csrc/include/natten/cpu/naive/pointwise_neighborhood_1d.hpp @@ -40,7 +40,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -51,103 +52,148 @@ namespace naive { template struct PointwiseNeighborhood1D { void operator()( + bool is_grad, void* query_ptr, void* key_ptr, void* attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { launch( + is_grad, reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), reinterpret_cast(attn_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, - attn_stride_2); + attn_stride_2, + is_causal); } void launch( // QK / A-grad + bool is_grad, scalar_t* query, // query / d_out scalar_t* key, // key / value scalar_t* attn, // attn / d_attn - const int length, - const int heads, - const int kernel_size, - const int dilation, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2) { - const int neighborhood_size = kernel_size / 2; - const int query_stride_2 = dim; - const int query_stride_1 = length * query_stride_2; - const int query_stride_0 = heads * query_stride_1; + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + const std::tuple& is_causal) { + auto is_causal_0 = std::get<0>(is_causal); + auto neighborhood_size = kernel_size / 2; + int64_t query_stride_2 = dim; + int64_t query_stride_1 = length * query_stride_2; + int64_t query_stride_0 = heads * query_stride_1; + auto mask_value = AttnMask::value(is_grad); #if defined(AVX_INT) using Vec = at::vec::Vectorized; at::parallel_for( - 0, batch_size * heads * length, GRAIN_SIZE, [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / length; - const int i = x - indtmp1 * length; - int indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, length, kernel_size, neighborhood_size, dilation); - const int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = batchHeadOffset + i * query_stride_2; + 0, + batch_size * heads * length, + GRAIN_SIZE, + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / length; + auto i = x - indtmp1 * length; + int32_t indtmp2 = indtmp1 / heads; + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto ni = get_window_start( + i, + length, + kernel_size, + neighborhood_size, + dilation, + is_causal_0); + auto ei = get_window_end( + i, + ni, + length, + kernel_size, + neighborhood_size, + dilation, + is_causal_0); + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; + int64_t queryOffset = batchHeadOffset + i * query_stride_2; int64_t index = b * attn_stride_0 + h * attn_stride_1 + i * attn_stride_2; scalar_t* _qaddr = query + queryOffset; - for (int ki = 0; ki < kernel_size; ki++) { + for (int32_t ki = 0; ki < kernel_size; ki++) { Vec updt = Vec(scalar_t(0)); - const int64_t keyOffset = - batchHeadOffset + (ki * dilation + ni) * query_stride_2; - scalar_t* _kaddr = key + keyOffset; - int64_t d1 = 0; - for (; d1 < dim - (dim % Vec::size()); d1 += Vec::size()) - updt = at::vec::fmadd( - Vec::loadu(_qaddr + d1), Vec::loadu(_kaddr + d1), updt); - scalar_t sum_val = at::vec::vec_reduce_all( - [](Vec& x, Vec& y) { return x + y; }, updt, Vec::size()); - for (; d1 < dim; ++d1) - sum_val += _qaddr[d1] * _kaddr[d1]; + scalar_t sum_val; + auto key_idx = ki * dilation + ni; + if (key_idx < ei) { + int64_t keyOffset = batchHeadOffset + key_idx * query_stride_2; + scalar_t* _kaddr = key + keyOffset; + int64_t d1 = 0; + for (; d1 < dim - (dim % Vec::size()); d1 += Vec::size()) + updt = at::vec::fmadd( + Vec::loadu(_qaddr + d1), Vec::loadu(_kaddr + d1), updt); + sum_val = at::vec::vec_reduce_all( + [](Vec& x, Vec& y) { return x + y; }, updt, Vec::size()); + for (; d1 < dim; ++d1) + sum_val += _qaddr[d1] * _kaddr[d1]; + } else { + sum_val = mask_value; + } attn[index] = sum_val; index++; } } }); #else - for (int b = 0; b < batch_size; b++) { - at::parallel_for(0, heads, GRAIN_SIZE, [&](int start, int end) { - for (int h = start; h < end; h++) { - for (int i = 0; i < length; i++) { - const int ni = get_window_start( - i, length, kernel_size, neighborhood_size, dilation); - for (int ki = 0; ki < kernel_size; ki++) { + for (int32_t b = 0; b < batch_size; b++) { + at::parallel_for(0, heads, GRAIN_SIZE, [&](int32_t start, int32_t end) { + for (int32_t h = start; h < end; h++) { + for (int32_t i = 0; i < length; i++) { + auto ni = get_window_start( + i, + length, + kernel_size, + neighborhood_size, + dilation, + is_causal_0); + auto ei = get_window_end( + i, + ni, + length, + kernel_size, + neighborhood_size, + dilation, + is_causal_0); + for (int32_t ki = 0; ki < kernel_size; ki++) { scalar_t updt = scalar_t(0); - const int64_t batchHeadOffset = - b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = batchHeadOffset + i * query_stride_2; - const int64_t keyOffset = - batchHeadOffset + (ki * dilation + ni) * query_stride_2; - for (int64_t dimOffset = 0; dimOffset < dim; ++dimOffset) - updt += - query[queryOffset + dimOffset] * key[keyOffset + dimOffset]; - const int64_t index = b * attn_stride_0 + h * attn_stride_1 + + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; + int64_t queryOffset = batchHeadOffset + i * query_stride_2; + auto key_idx = ki * dilation + ni; + if (key_idx < ei) { + int64_t keyOffset = batchHeadOffset + key_idx * query_stride_2; + for (int64_t dimOffset = 0; dimOffset < dim; ++dimOffset) + updt += query[queryOffset + dimOffset] * + key[keyOffset + dimOffset]; + } else { + updt = mask_value; + } + int64_t index = b * attn_stride_0 + h * attn_stride_1 + i * attn_stride_2 + ki; attn[index] = updt; } @@ -166,15 +212,19 @@ struct PointwiseNeighborhood1DWithBias { void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); launch( reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), @@ -182,8 +232,8 @@ struct PointwiseNeighborhood1DWithBias { reinterpret_cast(attn_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), dim, batch_size, attn_stride_0, @@ -196,42 +246,45 @@ struct PointwiseNeighborhood1DWithBias { scalar_t* key, // key scalar_t* bias, // relative positional bias tensor scalar_t* attn, // attn - const int length, - const int heads, - const int kernel_size, - const int dilation, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2) { - const int neighborhood_size = kernel_size / 2; - const int bias_stride_0 = 2 * kernel_size - 1; - const int query_stride_2 = dim; - const int query_stride_1 = length * query_stride_2; - const int query_stride_0 = heads * query_stride_1; + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2) { + auto neighborhood_size = kernel_size / 2; + int64_t bias_stride_0 = 2 * kernel_size - 1; + int64_t query_stride_2 = dim; + int64_t query_stride_1 = length * query_stride_2; + int64_t query_stride_0 = heads * query_stride_1; #if defined(AVX_INT) using Vec = at::vec::Vectorized; at::parallel_for( - 0, batch_size * heads * length, GRAIN_SIZE, [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / length; - const int i = x - indtmp1 * length; - int indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, length, kernel_size, neighborhood_size, dilation); - const int pi = get_pb_start( + 0, + batch_size * heads * length, + GRAIN_SIZE, + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / length; + auto i = x - indtmp1 * length; + int32_t indtmp2 = indtmp1 / heads; + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto ni = get_window_start( + i, length, kernel_size, neighborhood_size, dilation, false); + auto pi = get_pb_start( i, length, kernel_size, neighborhood_size, dilation); - const int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = batchHeadOffset + i * query_stride_2; + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; + int64_t queryOffset = batchHeadOffset + i * query_stride_2; int64_t index = b * attn_stride_0 + h * attn_stride_1 + i * attn_stride_2; scalar_t* _qaddr = query + queryOffset; - for (int ki = 0; ki < kernel_size; ki++) { + for (int32_t ki = 0; ki < kernel_size; ki++) { Vec updt = Vec(scalar_t(0)); - const int64_t keyOffset = + int64_t keyOffset = batchHeadOffset + (ki * dilation + ni) * query_stride_2; scalar_t* _kaddr = key + keyOffset; int64_t d1 = 0; @@ -242,34 +295,33 @@ struct PointwiseNeighborhood1DWithBias { [](Vec& x, Vec& y) { return x + y; }, updt, Vec::size()); for (; d1 < dim; ++d1) sum_val += _qaddr[d1] * _kaddr[d1]; - const int64_t biasIndex = h * bias_stride_0 + (pi + ki); + int64_t biasIndex = h * bias_stride_0 + (pi + ki); attn[index] = bias[biasIndex] + sum_val; index++; } } }); #else - for (int b = 0; b < batch_size; b++) { - at::parallel_for(0, heads, GRAIN_SIZE, [&](int start, int end) { - for (int h = start; h < end; h++) { - for (int i = 0; i < length; i++) { - const int ni = get_window_start( - i, length, kernel_size, neighborhood_size, dilation); - const int pi = get_pb_start( + for (int32_t b = 0; b < batch_size; b++) { + at::parallel_for(0, heads, GRAIN_SIZE, [&](int32_t start, int32_t end) { + for (int32_t h = start; h < end; h++) { + for (int32_t i = 0; i < length; i++) { + auto ni = get_window_start( + i, length, kernel_size, neighborhood_size, dilation, false); + auto pi = get_pb_start( i, length, kernel_size, neighborhood_size, dilation); - for (int ki = 0; ki < kernel_size; ki++) { + for (int32_t ki = 0; ki < kernel_size; ki++) { scalar_t updt = scalar_t(0); - const int64_t batchHeadOffset = - b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = batchHeadOffset + i * query_stride_2; - const int64_t keyOffset = + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; + int64_t queryOffset = batchHeadOffset + i * query_stride_2; + int64_t keyOffset = batchHeadOffset + (ki * dilation + ni) * query_stride_2; for (int64_t dimOffset = 0; dimOffset < dim; ++dimOffset) updt += query[queryOffset + dimOffset] * key[keyOffset + dimOffset]; - const int64_t index = b * attn_stride_0 + h * attn_stride_1 + + int64_t index = b * attn_stride_0 + h * attn_stride_1 + i * attn_stride_2 + ki; - const int64_t biasIndex = h * bias_stride_0 + (pi + ki); + int64_t biasIndex = h * bias_stride_0 + (pi + ki); updt += bias[biasIndex]; attn[index] = updt; } diff --git a/csrc/include/natten/cpu/naive/pointwise_neighborhood_2d.hpp b/csrc/include/natten/cpu/naive/pointwise_neighborhood_2d.hpp index 7088c8c..4505065 100644 --- a/csrc/include/natten/cpu/naive/pointwise_neighborhood_2d.hpp +++ b/csrc/include/natten/cpu/naive/pointwise_neighborhood_2d.hpp @@ -40,7 +40,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -51,98 +52,144 @@ namespace naive { template struct PointwiseNeighborhood2D { void operator()( + bool is_grad, void* query_ptr, void* key_ptr, void* attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { launch( + is_grad, reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), reinterpret_cast(attn_ptr), height, width, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, attn_stride_2, - attn_stride_3); + attn_stride_3, + is_causal); } void launch( // QK / A-grad + bool is_grad, scalar_t* query, // query / d_out scalar_t* key, // key / value scalar_t* attn, // attn / d_attn - const int height, - const int width, - const int heads, - const int kernel_size, - const int dilation, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3) { - const int neighborhood_size = kernel_size / 2; - const int query_stride_3 = dim; - const int query_stride_2 = width * query_stride_3; - const int query_stride_1 = height * query_stride_2; - const int query_stride_0 = heads * query_stride_1; + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + const std::tuple& is_causal) { + auto is_causal_0 = std::get<0>(is_causal); + auto is_causal_1 = std::get<1>(is_causal); + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + int64_t query_stride_3 = dim; + int64_t query_stride_2 = width * query_stride_3; + int64_t query_stride_1 = height * query_stride_2; + int64_t query_stride_0 = heads * query_stride_1; + auto mask_value = AttnMask::value(is_grad); #if defined(AVX_INT) using Vec = at::vec::Vectorized; at::parallel_for( 0, batch_size * heads * height * width, GRAIN_SIZE, - [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / width; - const int j = x - indtmp1 * width; - int indtmp2 = indtmp1 / height; - const int i = indtmp1 - indtmp2 * height; + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / width; + auto j = x - indtmp1 * width; + int32_t indtmp2 = indtmp1 / height; + auto i = indtmp1 - indtmp2 * height; indtmp1 = indtmp2; indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, height, kernel_size, neighborhood_size, dilation); - const int nj = get_window_start( - j, width, kernel_size, neighborhood_size, dilation); - const int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto ni = get_window_start( + i, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto nj = get_window_start( + j, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + auto ei = get_window_end( + i, + ni, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto ej = get_window_end( + j, + nj, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; + int64_t queryOffset = batchHeadOffset + i * query_stride_2 + j * query_stride_3; int64_t index = b * attn_stride_0 + h * attn_stride_1 + i * attn_stride_2 + j * attn_stride_3; scalar_t* _qaddr = query + queryOffset; - for (int ki = 0; ki < kernel_size; ki++) { - for (int kj = 0; kj < kernel_size; kj++) { + for (int32_t ki = 0; ki < kernel_size_0; ki++) { + auto key_idx_i = ki * dilation_0 + ni; + for (int32_t kj = 0; kj < kernel_size_1; kj++) { + auto key_idx_j = kj * dilation_1 + nj; Vec updt = Vec(scalar_t(0)); - const int64_t keyOffset = batchHeadOffset + - (ki * dilation + ni) * query_stride_2 + - (kj * dilation + nj) * query_stride_3; - scalar_t* _kaddr = key + keyOffset; - int64_t d1 = 0; - for (; d1 < dim - (dim % Vec::size()); d1 += Vec::size()) - updt = at::vec::fmadd( - Vec::loadu(_qaddr + d1), Vec::loadu(_kaddr + d1), updt); - scalar_t sum_val = at::vec::vec_reduce_all( - [](Vec& x, Vec& y) { return x + y; }, updt, Vec::size()); - for (; d1 < dim; ++d1) - sum_val += _qaddr[d1] * _kaddr[d1]; + scalar_t sum_val; + if (key_idx_i < ei && key_idx_j < ej) { + int64_t keyOffset = batchHeadOffset + + key_idx_i * query_stride_2 + key_idx_j * query_stride_3; + scalar_t* _kaddr = key + keyOffset; + int64_t d1 = 0; + for (; d1 < dim - (dim % Vec::size()); d1 += Vec::size()) + updt = at::vec::fmadd( + Vec::loadu(_qaddr + d1), Vec::loadu(_kaddr + d1), updt); + sum_val = at::vec::vec_reduce_all( + [](Vec& x, Vec& y) { return x + y; }, updt, Vec::size()); + for (; d1 < dim; ++d1) + sum_val += _qaddr[d1] * _kaddr[d1]; + } else { + sum_val = mask_value; + } attn[index] = sum_val; index++; } @@ -154,35 +201,67 @@ struct PointwiseNeighborhood2D { 0, batch_size * heads * height * width, GRAIN_SIZE, - [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / width; - const int j = x - indtmp1 * width; - int indtmp2 = indtmp1 / height; - const int i = indtmp1 - indtmp2 * height; + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / width; + auto j = x - indtmp1 * width; + int32_t indtmp2 = indtmp1 / height; + auto i = indtmp1 - indtmp2 * height; indtmp1 = indtmp2; indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, height, kernel_size, neighborhood_size, dilation); - const int nj = get_window_start( - j, width, kernel_size, neighborhood_size, dilation); - for (int ki = 0; ki < kernel_size; ki++) { - for (int kj = 0; kj < kernel_size; kj++) { + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto ni = get_window_start( + i, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto nj = get_window_start( + j, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + auto ni = get_window_end( + i, + ni, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto nj = get_window_end( + j, + nj, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + for (int32_t ki = 0; ki < kernel_size_0; ki++) { + auto key_idx_i = ki * dilation_0 + ni; + for (int32_t kj = 0; kj < kernel_size_1; kj++) { + auto key_idx_j = kj * dilation_1 + nj; scalar_t updt = scalar_t(0); - const int64_t batchHeadOffset = + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = + int64_t queryOffset = batchHeadOffset + i * query_stride_2 + j * query_stride_3; - const int64_t keyOffset = batchHeadOffset + - (ki * dilation + ni) * query_stride_2 + - (kj * dilation + nj) * query_stride_3; - for (int64_t dimOffset = 0; dimOffset < dim; ++dimOffset) - updt += query[queryOffset + dimOffset] * - key[keyOffset + dimOffset]; - const int64_t index = b * attn_stride_0 + h * attn_stride_1 + - i * attn_stride_2 + j * attn_stride_3 + ki * kernel_size + + if (key_idx_i < ei && key_idx_j < ej) { + int64_t keyOffset = batchHeadOffset + + (ki * dilation_0 + ni) * query_stride_2 + + (kj * dilation_1 + nj) * query_stride_3; + for (int64_t dimOffset = 0; dimOffset < dim; ++dimOffset) + updt += query[queryOffset + dimOffset] * + key[keyOffset + dimOffset]; + } else { + updt = mask_value; + } + int64_t index = b * attn_stride_0 + h * attn_stride_1 + + i * attn_stride_2 + j * attn_stride_3 + ki * kernel_size_1 + kj; attn[index] = updt; } @@ -200,17 +279,21 @@ struct PointwiseNeighborhood2DWithBias { void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); launch( reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), @@ -219,8 +302,10 @@ struct PointwiseNeighborhood2DWithBias { height, width, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), dim, batch_size, attn_stride_0, @@ -234,60 +319,73 @@ struct PointwiseNeighborhood2DWithBias { scalar_t* key, // key / value scalar_t* bias, // relative positional bias tensor scalar_t* attn, // attn / d_attn - const int height, - const int width, - const int heads, - const int kernel_size, - const int dilation, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3) { - const int neighborhood_size = kernel_size / 2; - const int bias_stride_1 = (2 * kernel_size - 1); - const int bias_stride_0 = (2 * kernel_size - 1) * bias_stride_1; - const int query_stride_3 = dim; - const int query_stride_2 = width * query_stride_3; - const int query_stride_1 = height * query_stride_2; - const int query_stride_0 = heads * query_stride_1; + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3) { + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + int64_t bias_stride_1 = (2 * kernel_size_1 - 1); + int64_t bias_stride_0 = (2 * kernel_size_0 - 1) * bias_stride_1; + int64_t query_stride_3 = dim; + int64_t query_stride_2 = width * query_stride_3; + int64_t query_stride_1 = height * query_stride_2; + int64_t query_stride_0 = heads * query_stride_1; #if defined(AVX_INT) using Vec = at::vec::Vectorized; at::parallel_for( 0, batch_size * heads * height * width, GRAIN_SIZE, - [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / width; - const int j = x - indtmp1 * width; - int indtmp2 = indtmp1 / height; - const int i = indtmp1 - indtmp2 * height; + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / width; + auto j = x - indtmp1 * width; + int32_t indtmp2 = indtmp1 / height; + auto i = indtmp1 - indtmp2 * height; indtmp1 = indtmp2; indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, height, kernel_size, neighborhood_size, dilation); - const int pi = get_pb_start( - i, height, kernel_size, neighborhood_size, dilation); - const int nj = get_window_start( - j, width, kernel_size, neighborhood_size, dilation); - const int pj = get_pb_start( - j, width, kernel_size, neighborhood_size, dilation); - const int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto ni = get_window_start( + i, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + false); + int32_t pi = get_pb_start( + i, height, kernel_size_0, neighborhood_size_0, dilation_0); + auto nj = get_window_start( + j, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + false); + int32_t pj = get_pb_start( + j, width, kernel_size_1, neighborhood_size_1, dilation_1); + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; + int64_t queryOffset = batchHeadOffset + i * query_stride_2 + j * query_stride_3; int64_t index = b * attn_stride_0 + h * attn_stride_1 + i * attn_stride_2 + j * attn_stride_3; scalar_t* _qaddr = query + queryOffset; - for (int ki = 0; ki < kernel_size; ki++) { - for (int kj = 0; kj < kernel_size; kj++) { + for (int32_t ki = 0; ki < kernel_size_0; ki++) { + for (int32_t kj = 0; kj < kernel_size_1; kj++) { Vec updt = Vec(scalar_t(0)); - const int64_t keyOffset = batchHeadOffset + - (ki * dilation + ni) * query_stride_2 + - (kj * dilation + nj) * query_stride_3; + int64_t keyOffset = batchHeadOffset + + (ki * dilation_0 + ni) * query_stride_2 + + (kj * dilation_1 + nj) * query_stride_3; scalar_t* _kaddr = key + keyOffset; int64_t d1 = 0; for (; d1 < dim - (dim % Vec::size()); d1 += Vec::size()) @@ -297,7 +395,7 @@ struct PointwiseNeighborhood2DWithBias { [](Vec& x, Vec& y) { return x + y; }, updt, Vec::size()); for (; d1 < dim; ++d1) sum_val += _qaddr[d1] * _kaddr[d1]; - const int64_t biasIndex = + int64_t biasIndex = h * bias_stride_0 + (pi + ki) * bias_stride_1 + (pj + kj); attn[index] = bias[biasIndex] + sum_val; index++; @@ -310,41 +408,51 @@ struct PointwiseNeighborhood2DWithBias { 0, batch_size * heads * height * width, GRAIN_SIZE, - [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / width; - const int j = x - indtmp1 * width; - int indtmp2 = indtmp1 / height; - const int i = indtmp1 - indtmp2 * height; + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / width; + auto j = x - indtmp1 * width; + int32_t indtmp2 = indtmp1 / height; + auto i = indtmp1 - indtmp2 * height; indtmp1 = indtmp2; indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, height, kernel_size, neighborhood_size, dilation); - const int pi = get_pb_start( - i, height, kernel_size, neighborhood_size, dilation); - const int nj = get_window_start( - j, width, kernel_size, neighborhood_size, dilation); - const int pj = get_pb_start( - j, width, kernel_size, neighborhood_size, dilation); - for (int ki = 0; ki < kernel_size; ki++) { - for (int kj = 0; kj < kernel_size; kj++) { + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto ni = get_window_start( + i, + height, + kernel_size_0, + neighborhood_size_0, + dilation_0, + false); + auto pi = get_pb_start( + i, height, kernel_size_0, neighborhood_size_0, dilation_0); + auto nj = get_window_start( + j, + width, + kernel_size_1, + neighborhood_size_1, + dilation_1, + false); + auto pj = get_pb_start( + j, width, kernel_size_1, neighborhood_size_1, dilation_1); + for (int32_t ki = 0; ki < kernel_size_0; ki++) { + for (int32_t kj = 0; kj < kernel_size_1; kj++) { scalar_t updt = scalar_t(0); - const int64_t batchHeadOffset = + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = + int64_t queryOffset = batchHeadOffset + i * query_stride_2 + j * query_stride_3; - const int64_t keyOffset = batchHeadOffset + - (ki * dilation + ni) * query_stride_2 + - (kj * dilation + nj) * query_stride_3; + int64_t keyOffset = batchHeadOffset + + (ki * dilation_0 + ni) * query_stride_2 + + (kj * dilation_1 + nj) * query_stride_3; for (int64_t dimOffset = 0; dimOffset < dim; ++dimOffset) updt += query[queryOffset + dimOffset] * key[keyOffset + dimOffset]; - const int64_t index = b * attn_stride_0 + h * attn_stride_1 + - i * attn_stride_2 + j * attn_stride_3 + ki * kernel_size + + int64_t index = b * attn_stride_0 + h * attn_stride_1 + + i * attn_stride_2 + j * attn_stride_3 + ki * kernel_size_1 + kj; - const int64_t biasIndex = + int64_t biasIndex = h * bias_stride_0 + (pi + ki) * bias_stride_1 + (pj + kj); updt += bias[biasIndex]; attn[index] = updt; diff --git a/csrc/include/natten/cpu/naive/pointwise_neighborhood_3d.hpp b/csrc/include/natten/cpu/naive/pointwise_neighborhood_3d.hpp index acb9e29..aee826b 100644 --- a/csrc/include/natten/cpu/naive/pointwise_neighborhood_3d.hpp +++ b/csrc/include/natten/cpu/naive/pointwise_neighborhood_3d.hpp @@ -40,7 +40,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -51,25 +52,26 @@ namespace naive { template struct PointwiseNeighborhood3D { void operator()( + bool is_grad, void* query_ptr, void* key_ptr, void* attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { launch( + is_grad, reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), reinterpret_cast(attn_ptr), @@ -77,87 +79,144 @@ struct PointwiseNeighborhood3D { height, width, heads, - kernel_size, - kernel_size_depth, - dilation, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, - attn_stride_4); + attn_stride_4, + is_causal); } void launch( // QK / A-grad + bool is_grad, scalar_t* query, // query / d_out scalar_t* key, // key / value scalar_t* attn, // attn / d_attn - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size, - const int kernel_size_d, - const int dilation, - const int dilation_d, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3, - const int64_t attn_stride_4) { - const int neighborhood_size = kernel_size / 2; - const int neighborhood_size_d = kernel_size_d / 2; - const int query_stride_4 = dim; - const int query_stride_3 = width * query_stride_4; - const int query_stride_2 = height * query_stride_3; - const int query_stride_1 = depth * query_stride_2; - const int query_stride_0 = heads * query_stride_1; + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int64_t attn_stride_4, + const std::tuple& is_causal) { + auto is_causal_0 = std::get<0>(is_causal); + auto is_causal_1 = std::get<1>(is_causal); + auto is_causal_2 = std::get<2>(is_causal); + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + auto neighborhood_size_2 = kernel_size_2 / 2; + int64_t query_stride_4 = dim; + int64_t query_stride_3 = width * query_stride_4; + int64_t query_stride_2 = height * query_stride_3; + int64_t query_stride_1 = depth * query_stride_2; + int64_t query_stride_0 = heads * query_stride_1; + auto mask_value = AttnMask::value(is_grad); at::parallel_for( 0, batch_size * heads * depth * height * width, GRAIN_SIZE, - [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / width; - const int j = x - indtmp1 * width; - int indtmp2 = indtmp1 / height; - const int i = indtmp1 - indtmp2 * height; + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / width; + auto j = x - indtmp1 * width; + int32_t indtmp2 = indtmp1 / height; + auto i = indtmp1 - indtmp2 * height; indtmp1 = indtmp2; indtmp2 = indtmp1 / depth; - const int k = indtmp1 - indtmp2 * depth; + auto k = indtmp1 - indtmp2 * depth; indtmp1 = indtmp2; indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, height, kernel_size, neighborhood_size, dilation); - const int nj = get_window_start( - j, width, kernel_size, neighborhood_size, dilation); - const int nk = get_window_start( - k, depth, kernel_size_d, neighborhood_size_d, dilation_d); - for (int kk = 0; kk < kernel_size_d; kk++) { - for (int ki = 0; ki < kernel_size; ki++) { - for (int kj = 0; kj < kernel_size; kj++) { + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto nk = get_window_start( + k, + depth, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto ni = get_window_start( + i, + height, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + auto nj = get_window_start( + j, + width, + kernel_size_2, + neighborhood_size_2, + dilation_2, + is_causal_2); + auto ek = get_window_end( + k, + nk, + depth, + kernel_size_0, + neighborhood_size_0, + dilation_0, + is_causal_0); + auto ei = get_window_end( + i, + ni, + height, + kernel_size_1, + neighborhood_size_1, + dilation_1, + is_causal_1); + auto ej = get_window_end( + j, + nj, + width, + kernel_size_2, + neighborhood_size_2, + dilation_2, + is_causal_2); + for (int32_t kk = 0; kk < kernel_size_0; kk++) { + auto key_idx_k = kk * dilation_0 + nk; + for (int32_t ki = 0; ki < kernel_size_1; ki++) { + auto key_idx_i = ki * dilation_1 + ni; + for (int32_t kj = 0; kj < kernel_size_2; kj++) { + auto key_idx_j = kj * dilation_2 + nj; scalar_t updt = scalar_t(0); - const int64_t batchHeadOffset = + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = batchHeadOffset + k * query_stride_2 + + int64_t queryOffset = batchHeadOffset + k * query_stride_2 + i * query_stride_3 + j * query_stride_4; - const int64_t keyOffset = batchHeadOffset + - (kk * dilation_d + nk) * query_stride_2 + - (ki * dilation + ni) * query_stride_3 + - (kj * dilation + nj) * query_stride_4; - for (int64_t dimOffset = 0; dimOffset < dim; ++dimOffset) - updt += query[queryOffset + dimOffset] * - key[keyOffset + dimOffset]; - const int64_t index = b * attn_stride_0 + h * attn_stride_1 + + if (key_idx_k < ek && key_idx_i < ei && key_idx_j < ej) { + int64_t keyOffset = batchHeadOffset + + key_idx_k * query_stride_2 + + key_idx_i * query_stride_3 + key_idx_j * query_stride_4; + for (int64_t dimOffset = 0; dimOffset < dim; ++dimOffset) + updt += query[queryOffset + dimOffset] * + key[keyOffset + dimOffset]; + } else { + updt = mask_value; + } + int64_t index = b * attn_stride_0 + h * attn_stride_1 + k * attn_stride_2 + i * attn_stride_3 + - j * attn_stride_4 + kk * (kernel_size * kernel_size) + - ki * kernel_size + kj; + j * attn_stride_4 + kk * (kernel_size_1 * kernel_size_2) + + ki * kernel_size_2 + kj; attn[index] = updt; } } @@ -174,21 +233,23 @@ struct PointwiseNeighborhood3DWithBias { void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); launch( reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), @@ -198,10 +259,12 @@ struct PointwiseNeighborhood3DWithBias { height, width, heads, - kernel_size, - kernel_size_depth, - dilation, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), dim, batch_size, attn_stride_0, @@ -216,80 +279,98 @@ struct PointwiseNeighborhood3DWithBias { scalar_t* key, // key / value scalar_t* bias, // relative positional bias tensor scalar_t* attn, // attn / d_attn - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size, - const int kernel_size_d, - const int dilation, - const int dilation_d, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3, - const int64_t attn_stride_4) { - const int neighborhood_size = kernel_size / 2; - const int neighborhood_size_d = kernel_size_d / 2; - const int bias_stride_2 = (2 * kernel_size - 1); - const int bias_stride_1 = (2 * kernel_size - 1) * bias_stride_2; - const int bias_stride_0 = (2 * kernel_size_d - 1) * bias_stride_1; - const int query_stride_4 = dim; - const int query_stride_3 = width * query_stride_4; - const int query_stride_2 = height * query_stride_3; - const int query_stride_1 = depth * query_stride_2; - const int query_stride_0 = heads * query_stride_1; + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int64_t attn_stride_4) { + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + auto neighborhood_size_2 = kernel_size_2 / 2; + int64_t bias_stride_2 = (2 * kernel_size_2 - 1); + int64_t bias_stride_1 = (2 * kernel_size_1 - 1) * bias_stride_2; + int64_t bias_stride_0 = (2 * kernel_size_0 - 1) * bias_stride_1; + int64_t query_stride_4 = dim; + int64_t query_stride_3 = width * query_stride_4; + int64_t query_stride_2 = height * query_stride_3; + int64_t query_stride_1 = depth * query_stride_2; + int64_t query_stride_0 = heads * query_stride_1; at::parallel_for( 0, batch_size * heads * depth * height * width, GRAIN_SIZE, - [&](int start, int end) { - for (int x = start; x < end; x++) { - int indtmp1 = x / width; - const int j = x - indtmp1 * width; - int indtmp2 = indtmp1 / height; - const int i = indtmp1 - indtmp2 * height; + [&](int32_t start, int32_t end) { + for (int32_t x = start; x < end; x++) { + int32_t indtmp1 = x / width; + auto j = x - indtmp1 * width; + int32_t indtmp2 = indtmp1 / height; + auto i = indtmp1 - indtmp2 * height; indtmp1 = indtmp2; indtmp2 = indtmp1 / depth; - const int k = indtmp1 - indtmp2 * depth; + auto k = indtmp1 - indtmp2 * depth; indtmp1 = indtmp2; indtmp2 = indtmp1 / heads; - const int h = indtmp1 - indtmp2 * heads; - const int b = indtmp2; - const int ni = get_window_start( - i, height, kernel_size, neighborhood_size, dilation); - const int nj = get_window_start( - j, width, kernel_size, neighborhood_size, dilation); - const int nk = get_window_start( - k, depth, kernel_size_d, neighborhood_size_d, dilation_d); - const int pi = get_pb_start( - i, height, kernel_size, neighborhood_size, dilation); - const int pj = get_pb_start( - j, width, kernel_size, neighborhood_size, dilation); - const int pk = get_pb_start( - k, depth, kernel_size_d, neighborhood_size_d, dilation_d); - for (int kk = 0; kk < kernel_size_d; kk++) { - for (int ki = 0; ki < kernel_size; ki++) { - for (int kj = 0; kj < kernel_size; kj++) { + auto h = indtmp1 - indtmp2 * heads; + auto& b = indtmp2; + auto ni = get_window_start( + i, + height, + kernel_size_1, + neighborhood_size_1, + dilation_1, + false); + auto nj = get_window_start( + j, + width, + kernel_size_2, + neighborhood_size_2, + dilation_2, + false); + auto nk = get_window_start( + k, + depth, + kernel_size_0, + neighborhood_size_0, + dilation_0, + false); + auto pi = get_pb_start( + i, height, kernel_size_1, neighborhood_size_1, dilation_1); + auto pj = get_pb_start( + j, width, kernel_size_2, neighborhood_size_2, dilation_2); + auto pk = get_pb_start( + k, depth, kernel_size_0, neighborhood_size_0, dilation_0); + for (int32_t kk = 0; kk < kernel_size_0; kk++) { + for (int32_t ki = 0; ki < kernel_size_1; ki++) { + for (int32_t kj = 0; kj < kernel_size_2; kj++) { scalar_t updt = scalar_t(0); - const int64_t batchHeadOffset = + int64_t batchHeadOffset = b * query_stride_0 + h * query_stride_1; - const int64_t queryOffset = batchHeadOffset + k * query_stride_2 + + int64_t queryOffset = batchHeadOffset + k * query_stride_2 + i * query_stride_3 + j * query_stride_4; - const int64_t keyOffset = batchHeadOffset + - (kk * dilation_d + nk) * query_stride_2 + - (ki * dilation + ni) * query_stride_3 + - (kj * dilation + nj) * query_stride_4; + int64_t keyOffset = batchHeadOffset + + (kk * dilation_0 + nk) * query_stride_2 + + (ki * dilation_1 + ni) * query_stride_3 + + (kj * dilation_2 + nj) * query_stride_4; for (int64_t dimOffset = 0; dimOffset < dim; ++dimOffset) updt += query[queryOffset + dimOffset] * key[keyOffset + dimOffset]; - const int64_t index = b * attn_stride_0 + h * attn_stride_1 + + int64_t index = b * attn_stride_0 + h * attn_stride_1 + k * attn_stride_2 + i * attn_stride_3 + - j * attn_stride_4 + kk * (kernel_size * kernel_size) + - ki * kernel_size + kj; - const int64_t biasIndex = h * bias_stride_0 + + j * attn_stride_4 + kk * (kernel_size_1 * kernel_size_2) + + ki * kernel_size_2 + kj; + int64_t biasIndex = h * bias_stride_0 + (pk + kk) * bias_stride_1 + (pi + ki) * bias_stride_2 + (pj + kj); updt += bias[biasIndex]; diff --git a/csrc/include/natten/cpu/naive/rel_pos_bias_1d.hpp b/csrc/include/natten/cpu/naive/rel_pos_bias_1d.hpp index 2828bcc..1866c14 100644 --- a/csrc/include/natten/cpu/naive/rel_pos_bias_1d.hpp +++ b/csrc/include/natten/cpu/naive/rel_pos_bias_1d.hpp @@ -37,7 +37,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -52,22 +53,26 @@ struct RelPosBiasGradient1D { void operator()( void* d_bias_ptr, void* d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); launch( reinterpret_cast(d_bias_ptr), reinterpret_cast(d_attn_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), batch_size, attn_stride_0, attn_stride_1, @@ -77,29 +82,29 @@ struct RelPosBiasGradient1D { void launch( scalar_t* d_bias, scalar_t* d_attn, - const int length, - const int heads, - const int kernel_size, - const int dilation, - const int batch_size, - const int64_t d_attn_stride_0, - const int64_t d_attn_stride_1, - const int64_t d_attn_stride_2) { - const int neighborhood_size = kernel_size / 2; - const int d_bias_stride_0 = 2 * kernel_size - 1; - at::parallel_for(0, heads, GRAIN_SIZE, [&](int start, int end) { - for (int h = start; h < end; h++) { - for (int i = 0; i < length; i++) { - const int pi = + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t batch_size, + int64_t d_attn_stride_0, + int64_t d_attn_stride_1, + int64_t d_attn_stride_2) { + auto neighborhood_size = kernel_size / 2; + int64_t d_bias_stride_0 = 2 * kernel_size - 1; + at::parallel_for(0, heads, GRAIN_SIZE, [&](int32_t start, int32_t end) { + for (int32_t h = start; h < end; h++) { + for (int32_t i = 0; i < length; i++) { + auto pi = get_pb_start(i, length, kernel_size, neighborhood_size, dilation); - for (int ki = 0; ki < kernel_size; ki++) { + for (int32_t ki = 0; ki < kernel_size; ki++) { scalar_t d_bias_update = scalar_t(0); int64_t attnOffset = h * d_attn_stride_1 + i * d_attn_stride_2 + ki; - for (int b = 0; b < batch_size; ++b) { + for (int32_t b = 0; b < batch_size; ++b) { d_bias_update += d_attn[attnOffset]; attnOffset += d_attn_stride_0; } - const int64_t index = h * d_bias_stride_0 + (pi + ki); + int64_t index = h * d_bias_stride_0 + (pi + ki); d_bias[index] += d_bias_update; } } diff --git a/csrc/include/natten/cpu/naive/rel_pos_bias_2d.hpp b/csrc/include/natten/cpu/naive/rel_pos_bias_2d.hpp index 26184d9..e36c8ce 100644 --- a/csrc/include/natten/cpu/naive/rel_pos_bias_2d.hpp +++ b/csrc/include/natten/cpu/naive/rel_pos_bias_2d.hpp @@ -37,7 +37,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -52,25 +53,31 @@ struct RelPosBiasGradient2D { void operator()( void* d_bias_ptr, void* d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); launch( reinterpret_cast(d_bias_ptr), reinterpret_cast(d_attn_ptr), height, width, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), batch_size, attn_stride_0, attn_stride_1, @@ -81,37 +88,40 @@ struct RelPosBiasGradient2D { void launch( scalar_t* d_bias, scalar_t* d_attn, - const int height, - const int width, - const int heads, - const int kernel_size, - const int dilation, - const int batch_size, - const int64_t d_attn_stride_0, - const int64_t d_attn_stride_1, - const int64_t d_attn_stride_2, - const int64_t d_attn_stride_3) { - const int neighborhood_size = kernel_size / 2; - const int d_bias_stride_1 = (2 * kernel_size - 1); - const int d_bias_stride_0 = (2 * kernel_size - 1) * d_bias_stride_1; - at::parallel_for(0, heads, GRAIN_SIZE, [&](int start, int end) { - for (int h = start; h < end; h++) { - for (int i = 0; i < height; i++) { - const int pi = - get_pb_start(i, height, kernel_size, neighborhood_size, dilation); - for (int j = 0; j < width; j++) { - const int pj = get_pb_start( - j, width, kernel_size, neighborhood_size, dilation); - for (int ki = 0; ki < kernel_size; ki++) { - for (int kj = 0; kj < kernel_size; kj++) { + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t batch_size, + int64_t d_attn_stride_0, + int64_t d_attn_stride_1, + int64_t d_attn_stride_2, + int64_t d_attn_stride_3) { + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + int64_t d_bias_stride_1 = (2 * kernel_size_1 - 1); + int64_t d_bias_stride_0 = (2 * kernel_size_0 - 1) * d_bias_stride_1; + at::parallel_for(0, heads, GRAIN_SIZE, [&](int32_t start, int32_t end) { + for (int32_t h = start; h < end; h++) { + for (int32_t i = 0; i < height; i++) { + auto pi = get_pb_start( + i, height, kernel_size_0, neighborhood_size_0, dilation_0); + for (int32_t j = 0; j < width; j++) { + auto pj = get_pb_start( + j, width, kernel_size_1, neighborhood_size_1, dilation_1); + for (int32_t ki = 0; ki < kernel_size_0; ki++) { + for (int32_t kj = 0; kj < kernel_size_1; kj++) { scalar_t d_bias_update = scalar_t(0); int64_t attnOffset = h * d_attn_stride_1 + i * d_attn_stride_2 + - j * d_attn_stride_3 + ki * kernel_size + kj; - for (int b = 0; b < batch_size; ++b) { + j * d_attn_stride_3 + ki * kernel_size_1 + kj; + for (int32_t b = 0; b < batch_size; ++b) { d_bias_update += d_attn[attnOffset]; attnOffset += d_attn_stride_0; } - const int64_t index = h * d_bias_stride_0 + + int64_t index = h * d_bias_stride_0 + (pi + ki) * d_bias_stride_1 + (pj + kj); d_bias[index] += d_bias_update; } diff --git a/csrc/include/natten/cpu/naive/rel_pos_bias_3d.hpp b/csrc/include/natten/cpu/naive/rel_pos_bias_3d.hpp index d26470e..20062fb 100644 --- a/csrc/include/natten/cpu/naive/rel_pos_bias_3d.hpp +++ b/csrc/include/natten/cpu/naive/rel_pos_bias_3d.hpp @@ -37,7 +37,8 @@ #include #endif -#include "natten/cpu/naive/natten_cpu_commons.h" +#include +#include namespace natten { namespace cpu { @@ -50,21 +51,23 @@ struct RelPosBiasGradient3D { void operator()( void* d_bias_ptr, void* d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); launch( reinterpret_cast(d_bias_ptr), reinterpret_cast(d_attn_ptr), @@ -72,10 +75,12 @@ struct RelPosBiasGradient3D { height, width, heads, - kernel_size, - kernel_size_depth, - dilation, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), batch_size, attn_stride_0, attn_stride_1, @@ -87,49 +92,53 @@ struct RelPosBiasGradient3D { void launch( scalar_t* d_bias, scalar_t* d_attn, - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size, - const int kernel_size_d, - const int dilation, - const int dilation_d, - const int batch_size, - const int64_t d_attn_stride_0, - const int64_t d_attn_stride_1, - const int64_t d_attn_stride_2, - const int64_t d_attn_stride_3, - const int64_t d_attn_stride_4) { - const int neighborhood_size = kernel_size / 2; - const int neighborhood_size_d = kernel_size_d / 2; - const int d_bias_stride_2 = (2 * kernel_size - 1); - const int d_bias_stride_1 = (2 * kernel_size - 1) * d_bias_stride_2; - const int d_bias_stride_0 = (2 * kernel_size_d - 1) * d_bias_stride_1; - at::parallel_for(0, heads, GRAIN_SIZE, [&](int start, int end) { - for (int h = start; h < end; h++) { - for (int k = 0; k < depth; k++) { - const int pk = get_pb_start( - k, depth, kernel_size_d, neighborhood_size_d, dilation_d); - for (int i = 0; i < height; i++) { - const int pi = get_pb_start( - i, height, kernel_size, neighborhood_size, dilation); - for (int j = 0; j < width; j++) { - const int pj = get_pb_start( - j, width, kernel_size, neighborhood_size, dilation); - for (int kk = 0; kk < kernel_size_d; kk++) { - for (int ki = 0; ki < kernel_size; ki++) { - for (int kj = 0; kj < kernel_size; kj++) { + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t batch_size, + int64_t d_attn_stride_0, + int64_t d_attn_stride_1, + int64_t d_attn_stride_2, + int64_t d_attn_stride_3, + int64_t d_attn_stride_4) { + auto neighborhood_size_0 = kernel_size_0 / 2; + auto neighborhood_size_1 = kernel_size_1 / 2; + auto neighborhood_size_2 = kernel_size_2 / 2; + int64_t d_bias_stride_2 = (2 * kernel_size_2 - 1); + int64_t d_bias_stride_1 = (2 * kernel_size_1 - 1) * d_bias_stride_2; + int64_t d_bias_stride_0 = (2 * kernel_size_0 - 1) * d_bias_stride_1; + at::parallel_for(0, heads, GRAIN_SIZE, [&](int32_t start, int32_t end) { + for (int32_t h = start; h < end; h++) { + for (int32_t k = 0; k < depth; k++) { + auto pk = get_pb_start( + k, depth, kernel_size_0, neighborhood_size_0, dilation_0); + for (int32_t i = 0; i < height; i++) { + auto pi = get_pb_start( + i, height, kernel_size_1, neighborhood_size_1, dilation_1); + for (int32_t j = 0; j < width; j++) { + auto pj = get_pb_start( + j, width, kernel_size_2, neighborhood_size_2, dilation_2); + for (int32_t kk = 0; kk < kernel_size_0; kk++) { + for (int32_t ki = 0; ki < kernel_size_1; ki++) { + for (int32_t kj = 0; kj < kernel_size_2; kj++) { scalar_t d_bias_update = scalar_t(0); - int64_t attnOffset = h * d_attn_stride_1 + k * d_attn_stride_2 + - i * d_attn_stride_3 + j * d_attn_stride_4 + - kk * (kernel_size * kernel_size) + ki * kernel_size + - kj; - for (int b = 0; b < batch_size; ++b) { + int64_t attnOffset = h * d_attn_stride_1 + + k * d_attn_stride_2 + i * d_attn_stride_3 + + j * d_attn_stride_4 + + kk * (kernel_size_1 * kernel_size_2) + + ki * kernel_size_2 + kj; + for (int32_t b = 0; b < batch_size; ++b) { d_bias_update += d_attn[attnOffset]; attnOffset += d_attn_stride_0; } - const int64_t index = h * d_bias_stride_0 + + int64_t index = h * d_bias_stride_0 + (pk + kk) * d_bias_stride_1 + (pi + ki) * d_bias_stride_2 + (pj + kj); d_bias[index] += d_bias_update; diff --git a/csrc/include/natten/cuda/fna/epilogue/epilogue_pipelined.h b/csrc/include/natten/cuda/fna/epilogue/epilogue_pipelined.h new file mode 100644 index 0000000..8dfd417 --- /dev/null +++ b/csrc/include/natten/cuda/fna/epilogue/epilogue_pipelined.h @@ -0,0 +1,638 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Epilogue for threadblock scoped GEMMs using Tensor Ops. + + File copied from "cutlass/epilogue/threadblock/epilogue.h" + then modified to: + (1) load 2 source fragments at the same time (pipelining) + (2) support reading from a different dtype + (3) pass the row id to the OutputOp if it takes it + (see MemoryEfficientAttentionNormalize) + Note that in general the fragment passed to the OutputOp could + span multiple rows but it does not happen with the configurations we have +*/ + +#pragma once + +#if defined(__CUDACC_RTC__) +#include +#else +#include +#endif + +#include "cutlass/aligned_buffer.h" +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/functional.h" +#include "cutlass/layout/tensor.h" +#include "cutlass/layout/vector.h" +#include "cutlass/numeric_types.h" +#include "cutlass/tensor_coord.h" + +#include "cutlass/gemm/gemm.h" + +#include "cutlass/transform/pitch_linear_thread_map.h" +#include "cutlass/transform/threadblock/regular_tile_iterator.h" + +#include "cutlass/epilogue/threadblock/epilogue_base.h" +#include "cutlass/epilogue/threadblock/predicated_tile_iterator.h" +#include "cutlass/numeric_types.h" + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace epilogue { +namespace threadblock { + +template +struct ApplyEpilogueOp { + static CUTLASS_DEVICE typename Op::FragmentOutput apply( + Op const& output_op, + int row_id, + typename Op::FragmentAccumulator const& accum, + typename Op::FragmentOutput const& source) { + return output_op(accum, source); + } + static CUTLASS_DEVICE typename Op::FragmentOutput apply( + Op const& output_op, + int row_id, + typename Op::FragmentAccumulator const& accum) { + return output_op(accum); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// Epilogue operator +template < + typename Shape_, ///< Shape of threadblock tile (concept: GemmShape) + typename WarpMmaOperator_, ///< Warp-level MMA operator (concept: + ///< gemm::warp::MmaTensorOp) + int PartitionsK, ///< Number of partitions of the K dimension + typename OutputTileIterator_, ///< Tile iterator writing output tensors + typename AccumulatorFragmentIterator_, ///< Fragment iterator selecting + ///< accumulators + typename WarpTileIterator_, ///< Warp-scoped tile iterator writing + ///< accumulators to SMEM + typename SharedLoadIterator_, ///< Threadblock-scoped tile iterator loading + ///< from SMEM + typename OutputOp_, ///< Output operator + typename Padding_, ///< Padding added to SMEM allocation to avoid bank + ///< conflicts (concept: MatrixShape) + int FragmentsPerPartition = + 1, ///< Used to coarsten the epilogue granularity + int IterationsUnroll = ///< Used to reduce binary size when epilogue op is + ///< large + (!IsEpilogueFunctorHeavy::value), + typename OutputTileSourceIterator_ = + OutputTileIterator_ ///< Tile iterator reading tensors + > +class EpiloguePipelined : public EpilogueBase< + Shape_, + typename WarpMmaOperator_::Shape, + PartitionsK, + AccumulatorFragmentIterator_, + WarpTileIterator_, + Padding_, + FragmentsPerPartition> { + public: + using Base = EpilogueBase< + Shape_, + typename WarpMmaOperator_::Shape, + PartitionsK, + AccumulatorFragmentIterator_, + WarpTileIterator_, + Padding_, + FragmentsPerPartition>; + + using Shape = Shape_; + using WarpMmaOperator = WarpMmaOperator_; + static int const kPartitionsK = PartitionsK; + using OutputTileIterator = OutputTileIterator_; + using OutputTileSourceIterator = OutputTileSourceIterator_; + using AccumulatorFragmentIterator = AccumulatorFragmentIterator_; + using WarpTileIterator = WarpTileIterator_; + using SharedLoadIterator = SharedLoadIterator_; + using OutputOp = OutputOp_; + using Padding = Padding_; + + using Layout = layout::RowMajor; + using LongIndex = typename Layout::LongIndex; + + /// The complete warp-level accumulator tile + using AccumulatorTile = typename Base::AccumulatorTile; + + /// Accumulator element + using ElementAccumulator = typename WarpTileIterator::Element; + + /// Output element + using ElementOutput = typename OutputTileIterator::Element; + using ElementSource = typename OutputTileSourceIterator::Element; + + /// Output access size + static int const kElementsPerAccess = OutputTileIterator::kElementsPerAccess; + + /// Tensor reference to destination tensor + using TensorRef = typename OutputTileIterator::TensorRef; + + /// Tensor reference to sync tensor + using SyncTensorRef = + typename cutlass::TensorRef; + + /// Const tensor reference to source tensor + using ConstTensorRef = typename OutputTileIterator::ConstTensorRef; + + /// Array type used to output + using OutputAccessType = Array< + typename OutputTileIterator::Element, + OutputTileIterator::kElementsPerAccess>; + using SourceAccessType = Array< + typename OutputTileSourceIterator::Element, + OutputTileSourceIterator::kElementsPerAccess>; + + /// Array type used by output functor + using AccumulatorAccessType = Array< + typename WarpTileIterator::Element, + OutputTileIterator::kElementsPerAccess>; + + /// Number of warps + using WarpCount = typename Base::WarpCount; + + static int constexpr kSmemTiles = Base::kFragmentsPerIteration > 1 + ? Base::kFragmentsPerIteration + : kPartitionsK; + static int constexpr kSmemPointerOffset = + Base::SharedStorage::StorageShape::kCount / kSmemTiles; + + public: + static_assert( + OutputTileSourceIterator::Fragment::kElements == + OutputTileIterator::Fragment::kElements, + "Mismatch between input tile and output tile iterator (kElements)"); + static_assert( + OutputTileSourceIterator::kIterations == OutputTileIterator::kIterations, + "Mismatch between input tile and output tile iterator (kIterations)"); + static_assert( + SharedLoadIterator::Fragment::kElements == + OutputTileIterator::Fragment::kElements, + "Mismatch between shared load iterator and output tile iterator."); + + static_assert( + OutputTileIterator::kElementsPerAccess, + "OutputTileIterator::kElementsPerAccess must not be zero."); + + static_assert( + !(OutputTileIterator::Fragment::kElements % + OutputTileIterator::kElementsPerAccess), + "Divisibility"); + + private: + /// Loads fragment from shared memory aligned with output tensor + SharedLoadIterator shared_load_iterator_; + + public: + /// Constructor + CUTLASS_DEVICE + EpiloguePipelined( + typename Base::SharedStorage& shared_storage, ///< Shared storage object + int thread_idx, ///< ID of a thread within the threadblock + int warp_idx, ///< ID of warp within threadblock + int lane_idx ///< Id of thread within warp + ) + : Base(shared_storage, thread_idx, warp_idx, lane_idx), + shared_load_iterator_(shared_storage.reference(), thread_idx) {} + + /// Streams the result to global memory + CUTLASS_DEVICE + void operator()( + OutputOp const& output_op, ///< Output operator + OutputTileIterator + destination_iterator, ///< Tile iterator for destination + AccumulatorTile const& + accumulators, ///< Complete warp-level accumulator tile + OutputTileSourceIterator + source_iterator) { ///< Threadblock tile coordinate in GEMM (in units + ///< of threadblock tiles) + + if (!output_op.is_source_needed()) { + compute_source_not_needed_(output_op, destination_iterator, accumulators); + } else { + compute_source_needed_( + output_op, destination_iterator, accumulators, source_iterator); + } + } + CUTLASS_DEVICE + void operator()( + OutputOp const& output_op, ///< Output operator + OutputTileIterator + destination_iterator, ///< Tile iterator for destination + AccumulatorTile const& + accumulators) { ///< Complete warp-level accumulator tile + compute_source_not_needed_(output_op, destination_iterator, accumulators); + } + + private: + template + struct acc2smem_source_not_needed; + + template + struct acc2smem_source_not_needed> { + template + CUTLASS_DEVICE static void helper( + AccumulatorFragmentIterator accum_fragment_iterator, + WarpTileIterator& warp_tile_iterator) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < Advance; i++) { + ++accum_fragment_iterator; + } + + CUTLASS_PRAGMA_UNROLL + for (int p = 0; p < Base::kFragmentsPerIteration; ++p) { + typename AccumulatorFragmentIterator::Fragment accum_fragment; + + accum_fragment_iterator.load(accum_fragment); + ++accum_fragment_iterator; + + warp_tile_iterator.store(accum_fragment); + if (p < Base::kFragmentsPerIteration - 1) { + warp_tile_iterator.add_pointer_offset(kSmemPointerOffset); + } + } + + if (Base::kFragmentsPerIteration > 1) { + warp_tile_iterator.add_pointer_offset( + kSmemPointerOffset * (1 - Base::kFragmentsPerIteration)); + } + } + + CUTLASS_DEVICE + static void push( + size_t pos, + AccumulatorFragmentIterator const& iterator_begin, + WarpTileIterator& warp_tile_iterator) { + int dummy[] = { + (pos == (Seq * Base::kFragmentsPerIteration)) && + (helper( + iterator_begin, warp_tile_iterator), + 0)...}; + + CUTLASS_UNUSED(dummy[0]); + } + }; + + static_assert( + kPartitionsK == 1 || Base::kFragmentsPerIteration == 1, + "One of these must be exactly 1."); + + /// Streams the result to global memory + CUTLASS_DEVICE + void compute_source_not_needed_( + OutputOp const& output_op, ///< Output operator + OutputTileIterator + destination_iterator, ///< Tile iterator for destination + AccumulatorTile const& + accumulators ///< Complete warp-level accumulator tile + ) { + // + // Iterator over warp-level accumulator fragment + // + + AccumulatorFragmentIterator accum_fragment_iterator(accumulators); + + // + // Iterate over accumulator tile + // + +#pragma unroll( \ + IterationsUnroll \ + ? OutputTileIterator::kIterations / Base::kFragmentsPerIteration \ + : 1) + for (int iter = 0; iter < OutputTileIterator::kIterations; + iter += Base::kFragmentsPerIteration) { + // + // Convert and store fragment + // + + __syncthreads(); + + acc2smem_source_not_needed>:: + push(iter, accum_fragment_iterator, this->warp_tile_iterator_); + + __syncthreads(); + + // + // Load fragments from shared memory + // + + CUTLASS_PRAGMA_UNROLL + for (int p = 0; p < Base::kFragmentsPerIteration; ++p) { + typename SharedLoadIterator::Fragment + aligned_accum_fragment[kPartitionsK]; + + shared_load_iterator_.load(aligned_accum_fragment[0]); + + if (p < Base::kFragmentsPerIteration - 1) { + shared_load_iterator_.add_pointer_offset(kSmemPointerOffset); + } else if (kPartitionsK > 1) { + plus add_fragments; + + CUTLASS_PRAGMA_UNROLL + for (int i = 1; i < kPartitionsK; ++i) { + shared_load_iterator_.add_pointer_offset(kSmemPointerOffset); + shared_load_iterator_.load(aligned_accum_fragment[i]); + aligned_accum_fragment[0] = add_fragments( + aligned_accum_fragment[0], aligned_accum_fragment[i]); + } + + shared_load_iterator_.add_pointer_offset( + (1 - kPartitionsK) * kSmemPointerOffset); + } + + // + // Compute the output result + // + + typename OutputTileIterator::Fragment output_fragment; + + apply_output_operator_source_not_needed_( + destination_iterator.thread_start_row(), + output_fragment, + output_op, + aligned_accum_fragment[0]); + + // + // Store the final result + // + + destination_iterator.store(output_fragment); + ++destination_iterator; + } + + if (Base::kFragmentsPerIteration > 1) { + shared_load_iterator_.add_pointer_offset( + kSmemPointerOffset * (1 - Base::kFragmentsPerIteration)); + } + } + } + + template + struct acc2smem_source_needed; + + template + struct acc2smem_source_needed> { + template + CUTLASS_DEVICE static void helper( + AccumulatorFragmentIterator accum_fragment_iterator, + WarpTileIterator& warp_tile_iterator) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < Advance; i++) { + ++accum_fragment_iterator; + } + + typename AccumulatorFragmentIterator::Fragment accum_fragment; + accum_fragment_iterator.load(accum_fragment); + warp_tile_iterator.store(accum_fragment); + } + + CUTLASS_DEVICE + static void push( + size_t pos, + AccumulatorFragmentIterator const& iterator_begin, + WarpTileIterator& warp_tile_iterator) { + int dummy[] = { + (pos == Seq) && + (helper(iterator_begin, warp_tile_iterator), 0)...}; + } + }; + + /// Streams the result to global memory + CUTLASS_DEVICE + void compute_source_needed_( + OutputOp const& output_op, ///< Output operator + OutputTileIterator + destination_iterator, ///< Tile iterator for destination + AccumulatorTile const& + accumulators, ///< Complete warp-level accumulator tile + OutputTileSourceIterator + source_iterator ///< Threadblock tile coordinate in GEMM (in units of + ///< threadblock tiles) + ) { + typename OutputTileSourceIterator::Fragment source_fragment[2]; + + source_fragment[0].clear(); + source_iterator.load(source_fragment[0]); + ++source_iterator; + source_fragment[1].clear(); + + // + // Iterator over warp-level accumulator fragment + // + + AccumulatorFragmentIterator accum_fragment_iterator(accumulators); + + // + // Iterate over accumulator tile + // + +#pragma unroll(IterationsUnroll ? OutputTileIterator::kIterations : 1) + for (int iter = 0; iter < OutputTileIterator::kIterations; ++iter) { + if (iter > 0) { + __syncthreads(); + } + // + // Load the source for next iteration (pipelining) + // + + if (iter + 1 < OutputTileIterator::kIterations) { + source_iterator.load(source_fragment[(iter + 1) % 2]); + } + ++source_iterator; + acc2smem_source_needed< + cutlass::make_index_sequence>:: + push(iter, accum_fragment_iterator, this->warp_tile_iterator_); + + __syncthreads(); + + // + // Load fragments from shared memory + // + + typename SharedLoadIterator::Fragment + aligned_accum_fragment[kPartitionsK]; + + shared_load_iterator_.load(aligned_accum_fragment[0]); + + // If the number of k-slices is > 1 - perform a reduction amongst the + // k-slices + if (kPartitionsK > 1) { + plus add_fragments; + + CUTLASS_PRAGMA_UNROLL + for (int i = 1; i < kPartitionsK; ++i) { + shared_load_iterator_.add_pointer_offset(kSmemPointerOffset); + shared_load_iterator_.load(aligned_accum_fragment[i]); + aligned_accum_fragment[0] = add_fragments( + aligned_accum_fragment[0], aligned_accum_fragment[i]); + } + + shared_load_iterator_.add_pointer_offset( + (1 - kPartitionsK) * kSmemPointerOffset); + } + + // + // Compute the output result + // + + typename OutputTileIterator::Fragment output_fragment; + + apply_output_operator_( + destination_iterator.thread_start_row(), + output_fragment, + output_op, + aligned_accum_fragment[0], + source_fragment[iter % 2]); + + // + // Store the final result + // + + destination_iterator.store(output_fragment); + ++destination_iterator; + } + } + + /// Helper to invoke the output functor over each vector of output + CUTLASS_DEVICE + void apply_output_operator_( + int begin_row, + typename OutputTileIterator::Fragment& output_fragment, + OutputOp const& output_op, ///< Output operator + typename SharedLoadIterator::Fragment const& aligned_accum_fragment, + typename OutputTileSourceIterator::Fragment const& source_fragment) { + OutputAccessType* output_frag_ptr = + reinterpret_cast(&output_fragment); + + AccumulatorAccessType const* compute_frag_ptr = + reinterpret_cast(&aligned_accum_fragment); + + SourceAccessType const* source_frag_ptr = + reinterpret_cast(&source_fragment); + + int const kOutputOpIterations = OutputTileIterator::Fragment::kElements / + OutputTileIterator::kElementsPerAccess; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kOutputOpIterations; ++i) { + // Call the output operator + output_frag_ptr[i] = ApplyEpilogueOp::apply( + output_op, + begin_row + getRowOffset(i * OutputTileIterator::kElementsPerAccess), + compute_frag_ptr[i], + source_frag_ptr[i]); + } + } + + /// Helper to invoke the output functor over each vector of output + CUTLASS_DEVICE + void apply_output_operator_source_not_needed_( + int begin_row, + typename OutputTileIterator::Fragment& output_fragment, + OutputOp const& output_op, ///< Output operator + typename SharedLoadIterator::Fragment const& aligned_accum_fragment) { + OutputAccessType* output_frag_ptr = + reinterpret_cast(&output_fragment); + + AccumulatorAccessType const* compute_frag_ptr = + reinterpret_cast(&aligned_accum_fragment); + + int const kOutputOpIterations = OutputTileIterator::Fragment::kElements / + OutputTileIterator::kElementsPerAccess; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kOutputOpIterations; ++i) { + // Call the output operator + output_frag_ptr[i] = ApplyEpilogueOp::apply( + output_op, + begin_row + getRowOffset(i * OutputTileIterator::kElementsPerAccess), + compute_frag_ptr[i]); + } + } + + // This should be constexpr, but it's only supported on c++14 + static int CUTLASS_HOST_DEVICE getRowOffset(int i) { + using ThreadMap = typename OutputTileIterator::ThreadMap; + + CUTLASS_PRAGMA_UNROLL + for (int cluster = 0; cluster < ThreadMap::Iterations::kCluster; + ++cluster) { + CUTLASS_PRAGMA_UNROLL + for (int group = 0; group < ThreadMap::Iterations::kGroup; ++group) { + CUTLASS_PRAGMA_UNROLL + for (int row = 0; row < ThreadMap::Iterations::kRow; ++row) { + int row_offset = row * ThreadMap::Delta::kRow + + group * ThreadMap::Delta::kGroup + + cluster * ThreadMap::Delta::kCluster; + int frag_row_idx = + (row + + ThreadMap::Iterations::kRow * + (group + ThreadMap::Iterations::kGroup * cluster)); + CUTLASS_PRAGMA_UNROLL + for (int column = 0; column < ThreadMap::Iterations::kColumn; + ++column) { + int frag_idx = ThreadMap::kElementsPerAccess * + (frag_row_idx * ThreadMap::Iterations::kColumn + column); + if (i < frag_idx + ThreadMap::kElementsPerAccess) { + return row_offset; + } + } + } + } + } + return -1; + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace threadblock +} // namespace epilogue +} // namespace cutlass + +//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/epilogue/epilogue_rescale_output.h b/csrc/include/natten/cuda/fna/epilogue/epilogue_rescale_output.h new file mode 100644 index 0000000..8a6c0f9 --- /dev/null +++ b/csrc/include/natten/cuda/fna/epilogue/epilogue_rescale_output.h @@ -0,0 +1,266 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +/*! \file + \brief Epilogue for threadblock scoped GEMMs using Tensor Ops. + + The epilogue rearranges the result of a matrix product through shared memory + to match canonical tensor layouts in global memory. Epilogues support + conversion and reduction operations. + + This is a copy of cutlass/epilogue/threadblock/epilogue.h that can + handle "row_id" as a first argument, as uses it to get the corresponding + `m_prime` / `s_prime` to rescale the output. +*/ + +#pragma once + +#if defined(__CUDACC_RTC__) +#include +#else +#include +#endif + +#include "cutlass/aligned_buffer.h" +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/functional.h" +#include "cutlass/layout/tensor.h" +#include "cutlass/layout/vector.h" +#include "cutlass/numeric_types.h" +#include "cutlass/tensor_coord.h" + +#include "cutlass/gemm/gemm.h" + +#include "cutlass/transform/pitch_linear_thread_map.h" +#include "cutlass/transform/threadblock/regular_tile_iterator.h" + +#include "cutlass/epilogue/threadblock/epilogue_base.h" +#include "cutlass/epilogue/threadblock/predicated_tile_iterator.h" +#include "cutlass/numeric_types.h" + +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/thread/scale_type.h" +#include "cutlass/functional.h" +#include "cutlass/numeric_conversion.h" +#include "cutlass/numeric_types.h" +#include "epilogue_pipelined.h" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace epilogue { +namespace thread { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +/// Applies a linear combination operator to an array of elements. +// output <- alpha * accumulator + beta * source +// with: +// alpha = 1 / s_prime (to normalize when isLast=True, 1 otherwise) +// beta = alpha / m_prime (renormalize the output when the max changes) +// source is the current output +template < + typename ElementOutput_, ///< Data type used to store tensors + typename ElementSource_, //< Data type for source (usually matches + //`ElementOutput`) + int Count, ///< Number of elements computed per operation. + ///< Usually it is 128/sizeof_bits, + ///< but we use 64 or 32 sometimes when there are not enough data + ///< to store + typename ElementAccumulator_, ///< Accumulator data type + typename ElementCompute_, ///< Data type used to compute linear combination + bool isFirst, + bool isLast, + typename FragmentAlphaBeta_, + FloatRoundStyle Round = FloatRoundStyle::round_to_nearest> +class MemoryEfficientAttentionNormalize { + public: + using ElementOutput = ElementOutput_; + using ElementSource = ElementSource_; + using ElementAccumulator = ElementAccumulator_; + using ElementCompute = ElementCompute_; + + static int const kCount = Count; + + using FragmentOutput = Array; + using FragmentSource = Array; + using FragmentAccumulator = Array; + using ComputeFragment = Array; + using FragmentAlphaBeta = FragmentAlphaBeta_; + + static FloatRoundStyle const kRound = Round; + + private: + // + // Data members + // + + FragmentAlphaBeta const& s_prime_; + FragmentAlphaBeta const& m_prime_; + + public: + /// Constructs the function object, possibly loading from pointers in host + /// memory + CUTLASS_HOST_DEVICE + MemoryEfficientAttentionNormalize( + FragmentAlphaBeta const& s_prime, + FragmentAlphaBeta const& m_prime) + : s_prime_(s_prime), m_prime_(m_prime) {} + + /// Returns true if source is needed + CUTLASS_HOST_DEVICE + bool is_source_needed() const { + return !isFirst; + } + + /// Functionally required for serial reduction in the epilogue + CUTLASS_HOST_DEVICE + void set_k_partition(int k_partition, int k_partition_count) {} + + /// Computes linear scaling: D = alpha * accumulator + beta * source + CUTLASS_HOST_DEVICE + FragmentOutput operator()( + int row, + FragmentAccumulator const& accumulator, + FragmentSource const& source) const { + assert(!isFirst); + + // Convert source to interal compute numeric type + NumericArrayConverter + source_converter; + NumericArrayConverter + accumulator_converter; + + // Convert to destination numeric type + NumericArrayConverter + destination_converter; + + ComputeFragment converted_source = source_converter(source); + ComputeFragment converted_accumulator = accumulator_converter(accumulator); + + // Perform binary operations + ComputeFragment intermediate; + + multiplies mul_add_source; + multiply_add mul_add_accumulator; + + ElementCompute alpha = isLast ? (1 / s_prime_[row]) : 1; + ElementCompute beta = alpha * m_prime_[row]; + + intermediate = mul_add_source(beta, converted_source); // X = beta * C + + intermediate = mul_add_accumulator( + alpha, converted_accumulator, intermediate); // D = alpha * Accum + X + + return destination_converter(intermediate); + } + + /// Computes linear scaling: D = alpha * accumulator + CUTLASS_HOST_DEVICE + FragmentOutput operator()(int row, FragmentAccumulator const& accumulator) + const { + assert(isFirst); + + // Convert source to interal compute numeric type + NumericArrayConverter + accumulator_converter; + + // Convert to destination numeric type + NumericArrayConverter + destination_converter; + + ComputeFragment converted_accumulator = accumulator_converter(accumulator); + + ComputeFragment intermediate; + multiplies mul_accumulator; + + ElementCompute alpha = isLast ? (1 / s_prime_[row]) : 1; + + intermediate = mul_accumulator( + alpha, converted_accumulator); // X = alpha * C + uniform + + return destination_converter(intermediate); + } +}; + +} // namespace thread + +namespace threadblock { +template < + typename EO, + typename ES, + int Count, + typename EA, + typename EC, + bool F, + bool L, + typename FAB, + FloatRoundStyle R> +struct ApplyEpilogueOp> { + using Op = thread:: + MemoryEfficientAttentionNormalize; + static CUTLASS_DEVICE typename Op::FragmentOutput apply( + Op const& output_op, + int row_id, + typename Op::FragmentAccumulator const& accum, + typename Op::FragmentSource const& source) { + return output_op(row_id, accum, source); + } + static CUTLASS_DEVICE typename Op::FragmentOutput apply( + Op const& output_op, + int row_id, + typename Op::FragmentAccumulator const& accum) { + return output_op(row_id, accum); + } +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace threadblock +} // namespace epilogue +} // namespace cutlass + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/epilogue/epilogue_thread_apply_logsumexp.h b/csrc/include/natten/cuda/fna/epilogue/epilogue_thread_apply_logsumexp.h new file mode 100644 index 0000000..6a53dc6 --- /dev/null +++ b/csrc/include/natten/cuda/fna/epilogue/epilogue_thread_apply_logsumexp.h @@ -0,0 +1,181 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Functor performing linear combination operations used by epilogues. +*/ + +#pragma once + +#include + +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/thread/activation.h" +#include "cutlass/functional.h" +#include "cutlass/numeric_conversion.h" +#include "cutlass/numeric_types.h" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace epilogue { +namespace thread { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace detail { + +template +struct ArrayExponential { + CUTLASS_HOST_DEVICE + Array operator()( + Array const& input) const { + Array result; + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < ElementsPerAccess; ++i) { + result[i] = expf(input[i]); + } + + return result; + } +}; + +template +struct ArrayExponential { + CUTLASS_DEVICE + Array operator()( + Array const& input) const { + Array result; + + int const kVectorCount = ElementsPerAccess / 2; + + __half2 const* input_ptr = + reinterpret_cast<__half2 const*>(input.raw_data()); + __half2* res_ptr = reinterpret_cast<__half2*>(result.raw_data()); + + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kVectorCount; ++i) { + res_ptr[i] = h2exp(input_ptr[i]); + } + + return result; + } +}; +} // namespace detail + +///////////////////////////////////////////////////////////////////////////////////////////////// + +/// Applies: +/// output <- (input - lse).exp() +template < + typename ElementOutput_, // output + typename ElementLSE_, // accumulator from LSE + typename ElementAccumulator_, // accumulator from matmul + typename ElementCompute_, // intermediate compute (and exp calculation) + int ElementsPerAccess> +class ApplyLogSumExp { + public: + using ElementOutput = ElementOutput_; + using ElementAccumulator = ElementAccumulator_; + using ElementCompute = ElementCompute_; + using ElementLSE = ElementLSE_; + + static int const kElementsPerAccess = ElementsPerAccess; + static int const kCount = kElementsPerAccess; + static const ScaleType::Kind kScale = + cutlass::epilogue::thread::ScaleType::NoBetaScaling; + + using FragmentOutput = Array; + using FragmentAccumulator = Array; + using FragmentCompute = Array; + using FragmentLSE = Array; + using FragmentScaleBias = FragmentLSE; // Used by epilogue_smem_accumulator.h + + public: + // + // Methods + // + + CUTLASS_HOST_DEVICE + ApplyLogSumExp() {} + + /// Returns true if source is needed + CUTLASS_HOST_DEVICE + bool is_source_needed() const { + return true; + } + + /// Functionally required for serial reduction in the epilogue + CUTLASS_HOST_DEVICE + void set_k_partition(int k_partition, int k_partition_count) {} + + CUTLASS_HOST_DEVICE + FragmentOutput operator()( + FragmentAccumulator const& AB, + FragmentLSE const& scale_unused, + // bias used as LSE + FragmentLSE const& bias) const { + FragmentCompute frag_AB = NumericArrayConverter< + ElementCompute, + ElementAccumulator, + kElementsPerAccess>()(AB); + FragmentCompute frag_lse_compute = + NumericArrayConverter()( + bias); + FragmentCompute frag_compute; + + minus minus_lse; + detail::ArrayExponential apply_exp; + frag_compute = minus_lse(frag_AB, frag_lse_compute); + frag_compute = apply_exp(frag_compute); + + return NumericArrayConverter< + ElementOutput, + ElementCompute, + kElementsPerAccess>()(frag_compute); + } +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace thread +} // namespace epilogue +} // namespace cutlass + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/epilogue/predicated_tile_iterator.h b/csrc/include/natten/cuda/fna/epilogue/predicated_tile_iterator.h new file mode 100644 index 0000000..d328721 --- /dev/null +++ b/csrc/include/natten/cuda/fna/epilogue/predicated_tile_iterator.h @@ -0,0 +1,629 @@ +/* + * Copied from CUTLASS (https://github.com/NVIDIA/cutlass/) and edited. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Epilogue for threadblock scoped GEMMs using Tensor Ops. + + The epilogue rearranges the result of a matrix product through shared memory + to match canonical tensor layouts in global memory. Epilogues support + conversion and reduction operations. + +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { + +//////////////////////////////////////////////////////////////////////////////// + +namespace epilogue { +namespace threadblock { + +//////////////////////////////////////////////////////////////////////////////// + +/// Tile iterator used to load and store output tile from global memory in +/// epilogue. +/// +/// Satisfies: ReadableTileIterator | CustomPredicatedTileIterator | +/// ForwardTileIterator +/// +template < + int NADim, + int kTileSizeRow, + typename ThreadMap_, ///< Thread map (conept: OutputTileThreadMap) + typename Element_ ///< Element data type + > +class CustomPredicatedTileIterator { + public: + static_assert(NADim >= 1 && NADim < 4); + using Dim = typename natten::cuda::fna::GetDim::type; + + using ThreadMap = ThreadMap_; + using Shape = typename ThreadMap::Shape; + + using Element = Element_; + + using Layout = layout::RowMajor; + using TensorRef = TensorRef; + using ConstTensorRef = typename TensorRef::ConstTensorRef; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + using TensorCoord = MatrixCoord; + + static int const kElementsPerAccess = ThreadMap::kElementsPerAccess; + static int const kThreads = ThreadMap::kThreads; + static int const kIterations = ThreadMap::Count::kTile; + + static_assert( + ThreadMap::Iterations::kRow > 0, + "ThreadMap::Iterations::kRow must be > 0"); + static_assert( + ThreadMap::Iterations::kGroup > 0, + "ThreadMap::Iterations::kGroup must be > 0"); + static_assert( + ThreadMap::Iterations::kCluster > 0, + "ThreadMap::Iterations::kCluster must be > 0"); + static_assert( + ThreadMap::Iterations::kColumn > 0, + "ThreadMap::Iterations::kColumn must be > 0"); + + /// Fragment object + using Fragment = Array< + Element, + ThreadMap::Iterations::kColumn * ThreadMap::Iterations::kRow * + ThreadMap::Iterations::kGroup * ThreadMap::Iterations::kCluster * + ThreadMap::kElementsPerAccess>; + + /// Memory access size + using AccessType = AlignedArray; + + // + // Parameters struct + // + using ParamsBase = CustomPredicatedTileIteratorParams; + + /// Uses a non-template class + struct Params : ParamsBase { + using Base = ParamsBase; + + CUTLASS_HOST_DEVICE + Params() {} + + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) + : ParamsBase( + stride, + int32_t(sizeof(AccessType)) / kElementsPerAccess, + extent_row, + make_OutputTileThreadMapDesc()) {} + + CUTLASS_HOST_DEVICE + Params(Base const& base) : Base(base) {} + }; + + /// Mask object + struct Mask { + static int const kCount = ThreadMap::Iterations::kColumn; + + /// Predicate state + bool predicates[kCount]; + + // + // Mask + // + CUTLASS_HOST_DEVICE + Mask() { + enable(); + } + + ///< Efficiently disables all accesses guarded by mask + CUTLASS_HOST_DEVICE void clear() { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kCount; ++i) { + predicates[i] = false; + } + } + + ///< CUTLASS_HOST_DEVICE enables all accesses guarded by mask + CUTLASS_DEVICE void enable() { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kCount; ++i) { + predicates[i] = true; + } + } + }; + + private: + // + // Data members + // + + /// Parameters structure containing reference and precomputed state. + ParamsBase params_; + + /// Byte-level pointer. This pointer is usually for both load() and store(), + /// unless PermuteD is performed. When having PermuteD, byte_pointer_ is only + /// for load(). + uint8_t* byte_pointer_; + + // /// Byte-level pointer for store(). Due to PermuteD Op, store_byte_pointer_ + // may be with different address computation compared to byte_pointer_. + // uint8_t *store_byte_pointer_; + + /// Array of boolean values to contain steady-state predicates + Mask mask_; + + /// Extent of the matrix tile in rows + Dim extent_row_; + int32_t extent_row_int; + + /// Extent of the matrix tile in rows + Index extent_column_; + + /// A thread's starting row position (assuming steady-state predicates have + /// been computed) + Index thread_start_row_; + + /// A thread's starting column + Index thread_start_column_; + + /// Internal state counter + int state_[3]; + + // + // Static asserts about internal strides + // + + static_assert(sizeof(extent_column_) == 4, "Expected 32b extents"); + static_assert(sizeof(thread_start_row_) == 4, "Expected 32b extents"); + + private: + // + // Methods + // + + public: + // + // Methods + // + + /// Constructor + CUTLASS_DEVICE + CustomPredicatedTileIterator( + ParamsBase const& params, + Element* pointer, + Dim extent_row, + int32_t extent_col, + int thread_idx, + TensorCoord threadblock_offset = TensorCoord()) + : params_(params) { + TensorCoord thread_offset = + ThreadMap::initial_offset(thread_idx) + threadblock_offset; + + extent_row_ = extent_row; + extent_column_ = extent_col; + extent_row_int = extent_row.prod32(); + + thread_start_row_ = thread_offset.row(); + thread_start_column_ = thread_offset.column(); + + // Initialize predicates + CUTLASS_PRAGMA_UNROLL + for (int c = 0; c < ThreadMap::Iterations::kColumn; ++c) { + mask_.predicates[c] = + ((thread_offset.column() + ThreadMap::Delta::kColumn * c) < + extent_col); + } + + // Null pointer performs no accesses + if (!pointer) { + mask_.clear(); + } + + // if (ScatterD && !indices) { + // mask_.clear(); + // } + + // Initialize byte_pointer_ + byte_pointer_ = reinterpret_cast(pointer) + + //(natten::cuda::fna::map_index_to_coord(thread_offset.row(), + //extent_row_) * params_.stride).sum() + + LongIndex(thread_offset.column()) * sizeof(AccessType) / + kElementsPerAccess; + + // if (ScatterD) { + // byte_pointer_ = reinterpret_cast(pointer) + + // LongIndex(thread_offset.column()) * sizeof(AccessType) / + // kElementsPerAccess; + //} + + // store_byte_pointer_ is set to be the same with byte_pointer_ unless + // PermuteD is used. + // store_byte_pointer_ = PermuteD ? reinterpret_cast(pointer) : + // byte_pointer_; + // store_byte_pointer_ = byte_pointer_; + + // Initialize internal state counter + state_[0] = state_[1] = state_[2] = 0; + } + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + // store_byte_pointer_ += pointer_offset * sizeof_bits::value / 8; + byte_pointer_ += pointer_offset * sizeof_bits::value / 8; + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load_with_byte_offset(Fragment& frag, int64_t byte_offset) const { + uint8_t* byte_pointer = byte_pointer_; + AccessType* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int cluster = 0; cluster < ThreadMap::Iterations::kCluster; + ++cluster) { + CUTLASS_PRAGMA_UNROLL + for (int group = 0; group < ThreadMap::Iterations::kGroup; ++group) { + CUTLASS_PRAGMA_UNROLL + for (int row = 0; row < ThreadMap::Iterations::kRow; ++row) { + int frag_row_idx = + (row + + ThreadMap::Iterations::kRow * + (group + ThreadMap::Iterations::kGroup * cluster)); + + int32_t row_offset = row * ThreadMap::Delta::kRow + + group * ThreadMap::Delta::kGroup + + cluster * ThreadMap::Delta::kCluster; + + auto row_offset_full_ = natten::cuda::fna::map_index_to_coord( + row_offset + thread_start_row_, extent_row_); + // bool row_guard = + // natten::cuda::fna::is_coord_within_upper_bound(row_offset_full_, + // extent_row_); + bool row_guard = row_offset + thread_start_row_ < extent_row_int; + + AccessType* memory_pointer = reinterpret_cast( + byte_pointer + byte_offset + + (row_offset_full_ * params_.stride).sum()); + + // if (ScatterD && row_guard) { + // assert(indices_); + + // memory_pointer = reinterpret_cast(byte_pointer + + // byte_offset + + // LongIndex(indices_[row_offset + thread_start_row_]) * + // LongIndex(params_.stride)); + //} + + CUTLASS_PRAGMA_UNROLL + for (int column = 0; column < ThreadMap::Iterations::kColumn; + ++column) { + bool guard = row_guard && mask_.predicates[column]; + + cutlass::arch::global_load( + frag_ptr + [frag_row_idx * ThreadMap::Iterations::kColumn + column], + (void*)&memory_pointer + [column * ThreadMap::Delta::kColumn / kElementsPerAccess], + guard); + } + + if (row + 1 < ThreadMap::Iterations::kRow) { + // if (!ScatterD) { + // byte_pointer += params_.increment_row; + //} + } + } + + if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + } + } + + if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + } + } + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load(Fragment& frag) const { + load_with_byte_offset(frag, 0); + } + + /// Stores a fragment to memory + CUTLASS_DEVICE + void store_with_byte_offset(Fragment const& frag, int64_t byte_offset) const { + // uint8_t *byte_pointer = store_byte_pointer_; + uint8_t* byte_pointer = byte_pointer_; + AccessType const* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int cluster = 0; cluster < ThreadMap::Iterations::kCluster; + ++cluster) { + CUTLASS_PRAGMA_UNROLL + for (int group = 0; group < ThreadMap::Iterations::kGroup; ++group) { + CUTLASS_PRAGMA_UNROLL + for (int row = 0; row < ThreadMap::Iterations::kRow; ++row) { + int frag_row_idx = + (row + + ThreadMap::Iterations::kRow * + (group + ThreadMap::Iterations::kGroup * cluster)); + + int32_t row_offset = row * ThreadMap::Delta::kRow + + group * ThreadMap::Delta::kGroup + + cluster * ThreadMap::Delta::kCluster; + + auto row_offset_full_ = natten::cuda::fna::map_index_to_coord( + row_offset + thread_start_row_, extent_row_); + // bool row_guard = + // natten::cuda::fna::is_coord_within_upper_bound(row_offset_full_, + // extent_row_); + bool row_guard = row_offset + thread_start_row_ < extent_row_int; + + AccessType* memory_pointer = reinterpret_cast( + byte_pointer + byte_offset + + (row_offset_full_ * params_.stride).sum()); + + // if (ScatterD && row_guard) { + // assert(indices_); + + // memory_pointer = reinterpret_cast(byte_pointer + + // byte_offset + + // LongIndex(indices_[row_offset + thread_start_row_]) * + // LongIndex(params_.stride)); + //} + + CUTLASS_PRAGMA_UNROLL + for (int column = 0; column < ThreadMap::Iterations::kColumn; + ++column) { + bool guard = row_guard && mask_.predicates[column]; + + // if (PermuteD) { + + // int col_offset = column * ThreadMap::Delta::kColumn; + + // int col = col_offset + thread_start_column_; + // int row = row_offset + thread_start_row_; + + // // Locate memory_pointer + // memory_pointer = reinterpret_cast(byte_pointer + + // byte_offset + // + permute_layout_(PitchLinearCoord(col, row)) * + // sizeof(AccessType) / kElementsPerAccess); + // } + + // if (UseCUDAStore) { + // if (guard) { + // memory_pointer[0] = + // frag_ptr[frag_row_idx * ThreadMap::Iterations::kColumn + + // column]; + // } + //} else { + cutlass::arch::global_store( + frag_ptr + [frag_row_idx * ThreadMap::Iterations::kColumn + column], + (void*)&memory_pointer[0], + guard); + //} + + // if (!PermuteD) { + memory_pointer += (ThreadMap::Delta::kColumn / kElementsPerAccess); + //} + } + + if (row + 1 < ThreadMap::Iterations::kRow) { + // if (!ScatterD && !PermuteD) { + // byte_pointer += params_.increment_row; + //} + } + } + + if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + } + } + + if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + } + } + } + + /// Stores a fragment to memory + CUTLASS_DEVICE + void store(Fragment const& frag) const { + store_with_byte_offset(frag, 0); + } + + CUTLASS_DEVICE + MatrixCoord thread_start() const { + return MatrixCoord(thread_start_row_, thread_start_column_); + } + + /// Need to get the thread start row from the tile iterator + CUTLASS_DEVICE + int32_t thread_start_row() const { + return thread_start_row_; + } + + /// Need to get the thread start row from the tile iterator + CUTLASS_DEVICE + int32_t thread_start_column() const { + return thread_start_column_; + } + + /// Extent of the matrix in columns + CUTLASS_DEVICE + Index extent_column() const { + return extent_column_; + } + + /// Advances to the next position to load or store + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator& operator++() { + ++state_[0]; + + // if (!ScatterD && !PermuteD) { + // store_byte_pointer_ += params_.advance_row; + //} + + // if (!ScatterD) { + // byte_pointer_ += params_.advance_row; + //} + + thread_start_row_ += ThreadMap::Shape::kRow; + + if (state_[0] == ThreadMap::Count::kRow) { + state_[0] = 0; + ++state_[1]; + // byte_pointer_ += params_.advance_group; + // store_byte_pointer_ += params_.advance_group; + + thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * + ThreadMap::Shape::kRow * ThreadMap::Count::kRow; + + if (state_[1] == ThreadMap::Count::kGroup) { + state_[1] = 0; + ++state_[2]; + // byte_pointer_ += params_.advance_cluster; + // store_byte_pointer_ += params_.advance_cluster; + + thread_start_row_ += ThreadMap::Count::kGroup * + ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * + ThreadMap::Shape::kRow; + + if (state_[2] == ThreadMap::Count::kCluster) { + state_[2] = 0; + // byte_pointer_ += params_.advance_tile; + // store_byte_pointer_ += params_.advance_tile; + + thread_start_row_ += ThreadMap::Shape::kGroup * + ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * + ThreadMap::Shape::kTile; + } + } + } + + return *this; + } + + /// Advances a number of positions to load or store + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator& operator+=(int increment) { + // Row + state_[0] += increment; + int increment_row = state_[0] / ThreadMap::Count::kRow; + state_[0] = state_[0] % ThreadMap::Count::kRow; + + // byte_pointer_ += (params_.advance_row * increment); + // store_byte_pointer_ += (params_.advance_row * increment); + thread_start_row_ += (ThreadMap::Shape::kRow * increment); + + // Group + state_[1] += increment_row; + int increment_group = state_[1] / ThreadMap::Count::kGroup; + state_[1] = state_[1] % ThreadMap::Count::kGroup; + + // byte_pointer_ += (params_.advance_group * increment_row); + // store_byte_pointer_ += (params_.advance_group * increment_row); + thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * + ThreadMap::Shape::kRow * ThreadMap::Count::kRow * increment_row; + + // Cluster + state_[2] += increment_group; + int increment_cluster = state_[2] / ThreadMap::Count::kCluster; + state_[2] = state_[2] % ThreadMap::Count::kCluster; + + // byte_pointer_ += (params_.advance_cluster * increment_group); + // store_byte_pointer_ += (params_.advance_cluster * increment_group); + thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * + ThreadMap::Count::kRow * ThreadMap::Shape::kRow * increment_group; + + // Tile + // byte_pointer_ += (params_.advance_tile * increment_cluster); + // store_byte_pointer_ += (params_.advance_tile * increment_cluster); + thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * + ThreadMap::Shape::kCluster * ThreadMap::Shape::kTile * + increment_cluster; + + return *this; + } + + ///< Efficiently disables all accesses guarded by mask + CUTLASS_DEVICE void clear_mask() { + mask_.clear(); + } + + ///< Efficiently enables all accesses guarded by mask + CUTLASS_DEVICE void enable_mask() { + mask_.enable(); + } + + ///< Sets the mask + CUTLASS_DEVICE void get_mask(Mask& mask) const { + mask = mask_; + } + + ///< Sets the mask + CUTLASS_DEVICE void set_mask(Mask const& mask) { + mask_ = mask; + } +}; + +} // namespace threadblock +} // namespace epilogue +} // namespace cutlass + +//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/epilogue/predicated_tile_iterator_params.h b/csrc/include/natten/cuda/fna/epilogue/predicated_tile_iterator_params.h new file mode 100644 index 0000000..9014c4f --- /dev/null +++ b/csrc/include/natten/cuda/fna/epilogue/predicated_tile_iterator_params.h @@ -0,0 +1,152 @@ +/* + * Copied from CUTLASS (https://github.com/NVIDIA/cutlass/) and edited. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief +*/ + +#pragma once + +#include + +#include +#include + +#include + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace epilogue { +namespace threadblock { + +// +// Parameters struct for PredicatedTileIterator +// + +template +struct CustomPredicatedTileIteratorParams { + using Dim = typename natten::cuda::fna::GetDim::type; + + using Index = int32_t; + using LongIndex = int64_t; + + // + // Data members + // + + Dim stride; ///< stride in bytes between rows + + // LongIndex increment_row; ///< increment quantity (in bytes) to + // advance when moving between rows LongIndex increment_group; ///< + // increment quantity (in bytes) to advance when moving to the next group + // LongIndex increment_cluster; ///< increment quantity (in bytes) to + // advance when moving to the next cluster + + // LongIndex advance_row; ///< amount to add to move to the next + // 'row' position LongIndex advance_group; ///< amount to add to move + // to the next 'group' position LongIndex advance_cluster; ///< amount to + // add to move to the next 'cluster' position LongIndex advance_tile; ///< + // amount to add to move to the next 'tile' + + // + // Methods + // + + CUTLASS_HOST_DEVICE + Status initialize( + Dim stride_, + Index elem, + Dim extent_row, + OutputTileThreadMapDesc thread_map) { + stride = stride_ * elem; + + // increment_row = (stride * + // natten::cuda::fna::map_index_to_coord(thread_map.delta.row, + // extent_row)).sum(); + + // increment_group = (stride * + // natten::cuda::fna::map_index_to_coord(thread_map.delta.group, extent_row) + // - stride * natten::cuda::fna::map_index_to_coord(thread_map.delta.row * + // (thread_map.iterations.row - 1), extent_row)).sum(); + + // increment_cluster = (stride * + // natten::cuda::fna::map_index_to_coord(thread_map.delta.cluster, + // extent_row) + // - stride * natten::cuda::fna::map_index_to_coord(thread_map.delta.group + // * (thread_map.iterations.group - 1), extent_row) + // - stride * natten::cuda::fna::map_index_to_coord(thread_map.delta.row * + // (thread_map.iterations.row - 1), extent_row)).sum(); + + // advance_row = (stride * + // natten::cuda::fna::map_index_to_coord(thread_map.shape.row, + // extent_row)).sum(); + + // advance_group = + // (stride * + // natten::cuda::fna::map_index_to_coord((thread_map.shape.group - 1) * + // thread_map.shape.row * thread_map.count.row, extent_row)).sum(); + // + // advance_cluster = ( + // stride * + // natten::cuda::fna::map_index_to_coord(thread_map.count.group * + // thread_map.shape.group * + // thread_map.count.row * + // thread_map.shape.row, extent_row)).sum(); + // + // advance_tile =( + // stride * + // natten::cuda::fna::map_index_to_coord(thread_map.shape.group * + // thread_map.shape.row * + // thread_map.shape.cluster * + // thread_map.shape.tile, extent_row)).sum(); + + return Status::kSuccess; + } + + CUTLASS_HOST_DEVICE + CustomPredicatedTileIteratorParams( + Dim stride, + Index elem, + Dim extent_row, + OutputTileThreadMapDesc thread_map) { + initialize(stride, elem, extent_row, thread_map); + } +}; + +} // namespace threadblock +} // namespace epilogue +} // namespace cutlass + +//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/fna_forward.cuh b/csrc/include/natten/cuda/fna/fna_forward.cuh new file mode 100644 index 0000000..063b8b3 --- /dev/null +++ b/csrc/include/natten/cuda/fna/fna_forward.cuh @@ -0,0 +1,183 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Fused Neighborhood Attention kernels are heavily based on the + * memory-efficient attention kernels from the xFormers project by Meta + * Platforms, Inc. + * + * Copyright (c) Facebook, Inc. and its affiliates + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +#include + +namespace natten { +namespace cuda { +namespace fna { + +template +void fna_forward_generic( + const int cc, + const size_t max_smem, + cudaStream_t stream, + void* query_ptr, + void* key_ptr, + void* value_ptr, + void* out_ptr, + void* rpb_ptr, + int32_t batch_size, + IntTuple spatial_extent, + int32_t heads, + int32_t dim, + int32_t dim_value, + IntTuple kernel_size, + IntTuple dilation, + BooleanTuple is_causal, + float attn_scale, + void* logsumexp_ptr, + IntTuple query_tile_shape, + IntTuple key_tile_shape) { + static constexpr auto kRank = + std::tuple_size::value; + using Dim = typename GetDim::type; + + bool has_rpb = rpb_ptr != nullptr; + bool compute_logsumexp = logsumexp_ptr != nullptr; + bool kernel_launched = false; + auto launchKernel = [&](auto _k, auto kernel_fn) { + using Kernel = decltype(_k); + using scalar_t = typename Kernel::scalar_t; + (void)_k; + + if (kernel_launched) { + return; + } + + if (dim_value > Kernel::kMaxK || dim > Kernel::kMaxK) { + return; + } + + if (natten::flatten(query_tile_shape) != Kernel::kQueriesPerBlock || + natten::flatten(key_tile_shape) != Kernel::kKeysPerBlock) { + return; + } + + // Alignment + if ((dim % Kernel::kAlignmentQ) || (dim % Kernel::kAlignmentK) || + (dim_value % Kernel::kAlignmentV)) { + return; + } + // Uses too much smem + size_t smem_bytes = sizeof(typename Kernel::SharedStorage); + if (smem_bytes > max_smem) { + return; + } + + kernel_launched = true; + + typename Kernel::Params p; + p.query_ptr = (scalar_t*)query_ptr; + p.key_ptr = (scalar_t*)key_ptr; + p.value_ptr = (scalar_t*)value_ptr; + p.rpb_ptr = (scalar_t*)rpb_ptr; + p.logsumexp_ptr = compute_logsumexp + ? (typename Kernel::lse_scalar_t*)logsumexp_ptr + : nullptr; + void* accum_ptr = nullptr; + if (Kernel::kNeedsOutputAccumulatorBuffer) { + using AccumType = typename Kernel::output_accum_t; + // TODO: let PT reserve space for accum_ptr and LSE. + // cudaMalloc-ing can break CUDA graphs, and probably does not + // guarantee the space is allocated on the same device (when multiple + // devices are present). + // cudaMallocAsync takes in the stream, which --should-- solve both + // issues. + // cudaMalloc(&accum_ptr, batch_size * natten::flatten(spatial_extent) * + // heads * dim_value * sizeof(AccumType)); + cudaMallocAsync( + &accum_ptr, + batch_size * natten::flatten(spatial_extent) * heads * dim_value * + sizeof(AccumType), + stream); + p.output_accum_ptr = (AccumType*)accum_ptr; + } else { + p.output_accum_ptr = nullptr; + } + p.output_ptr = (typename Kernel::output_t*)out_ptr; + + p.num_heads = heads; + p.head_dim = dim; + p.head_dim_value = dim_value; + p.num_queries = tuple_to_na_dim(spatial_extent); + p.num_batches = batch_size; + + p.scale = attn_scale; + + p.kernel_size = tuple_to_na_dim(kernel_size); + p.dilation = tuple_to_na_dim(dilation); + + p.query_tile_shape = tuple_to_na_dim(query_tile_shape); + p.key_tile_shape = tuple_to_na_dim(key_tile_shape); + + if (smem_bytes > 0xc000) { + auto err = cudaFuncSetAttribute( + kernel_fn, cudaFuncAttributeMaxDynamicSharedMemorySize, smem_bytes); + NATTEN_CHECK( + err != cudaErrorInvalidValue, + "This GPU does not have enough shared-memory."); + NATTEN_CUDA_CHECK(err); + } + auto blocks = p.getBlocksGrid(); + Kernel::check_supported(p); + kernel_fn<<>>(p); + if (Kernel::kNeedsOutputAccumulatorBuffer) { + //NATTEN_CHECK( + // accum_ptr != nullptr, "Expected accum_ptr to be set, got nullptr."); + cudaFreeAsync(accum_ptr, stream); + } + }; + + DISPATCH_FNA_FORWARD_KERNEL(kRank, cc, T, is_causal, has_rpb, launchKernel); + NATTEN_CHECK( + kernel_launched, + "Could not find a compatible fused neighborhood attention kernel."); + NATTEN_CUDA_CHECK(cudaGetLastError()); +} + +} // namespace fna +} // namespace cuda +} // namespace natten diff --git a/csrc/include/natten/cuda/fna/gemm/custom_mma.h b/csrc/include/natten/cuda/fna/gemm/custom_mma.h new file mode 100644 index 0000000..f5671ae --- /dev/null +++ b/csrc/include/natten/cuda/fna/gemm/custom_mma.h @@ -0,0 +1,139 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) and + * edited + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include + +#include +#include + +namespace natten { +namespace cuda { +namespace fna { + +template +struct MakeCustomMma; + +template < + typename Shape, + typename IteratorA, + typename SmemIteratorA, + cutlass::arch::CacheOperation::Kind CacheOpA, + typename IteratorB, + typename SmemIteratorB, + cutlass::arch::CacheOperation::Kind CacheOpB, + typename ElementC, + typename LayoutC, + typename Policy, + int Stages, + cutlass::gemm::SharedMemoryClearOption SharedMemoryClear, + int kMaxK> +struct MakeCustomMma< + cutlass::gemm::threadblock::MmaMultistage< + Shape, + IteratorA, + SmemIteratorA, + CacheOpA, + IteratorB, + SmemIteratorB, + CacheOpB, + ElementC, + LayoutC, + Policy, + Stages, + SharedMemoryClear>, + kMaxK> { + // Reduce the number of stages if we don't need that many + static int constexpr kStages = + kMaxK == cutlass::platform::numeric_limits::max() + ? Stages + : cutlass::const_min( + Stages, + (kMaxK + int(Shape::kK) - 1) / int(Shape::kK)); + using Mma = cutlass::gemm::threadblock::CustomMmaMultistage< + Shape, + IteratorA, + SmemIteratorA, + CacheOpA, + IteratorB, + SmemIteratorB, + CacheOpB, + ElementC, + LayoutC, + Policy, + kStages, + SharedMemoryClear, + kMaxK>; +}; + +template < + typename Shape, + typename IteratorA, + typename SmemIteratorA, + typename IteratorB, + typename SmemIteratorB, + typename ElementC, + typename LayoutC, + typename Policy, + int kMaxK> +struct MakeCustomMma< + cutlass::gemm::threadblock::MmaPipelined< + Shape, + IteratorA, + SmemIteratorA, + IteratorB, + SmemIteratorB, + ElementC, + LayoutC, + Policy>, + kMaxK> { + using Mma = cutlass::gemm::threadblock::CustomMmaPipelined< + Shape, + IteratorA, + SmemIteratorA, + IteratorB, + SmemIteratorB, + ElementC, + LayoutC, + Policy>; +}; + +} // namespace fna +} // namespace cuda +} // namespace natten diff --git a/csrc/include/natten/cuda/fna/gemm/custom_mma_base.h b/csrc/include/natten/cuda/fna/gemm/custom_mma_base.h new file mode 100644 index 0000000..62d55bd --- /dev/null +++ b/csrc/include/natten/cuda/fna/gemm/custom_mma_base.h @@ -0,0 +1,189 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Template for a double-buffered threadblock-scoped GEMM kernel. +*/ + +#pragma once + +#include "cutlass/aligned_buffer.h" +#include "cutlass/arch/memory.h" +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/gemm/threadblock/mma_base.h" +#include "cutlass/matrix_shape.h" +#include "cutlass/numeric_types.h" + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace gemm { +namespace threadblock { + +//////////////////////////////////////////////////////////////////////////////// + +/// Structure to compute the matrix product targeting CUDA cores and SIMT math +/// instructions. +template < + /// Size of the Gemm problem - concept: gemm::GemmShape<> + typename Shape_, + /// Policy describing tuning details (concept: MmaPolicy) + typename Policy_, + /// Number of stages, + int Stages, + /// Used for partial specialization + typename Enable = bool> +class CustomMmaBase { + public: + ///< Size of the Gemm problem - concept: gemm::GemmShape<> + using Shape = Shape_; + + ///< Policy describing tuning details + using Policy = Policy_; + + // + // Dependent types + // + + /// Warp-level Mma + using Operator = typename Policy::Operator; + + /// Shape describing the overall GEMM computed from shared memory + /// by each warp. + using WarpGemm = typename Policy::Operator::Shape; + + /// Shape describing the number of warps filling the CTA + using WarpCount = GemmShape< + Shape::kM / WarpGemm::kM, + Shape::kN / WarpGemm::kN, + Shape::kK / WarpGemm::kK>; + + /// Number of warp-level GEMM oeprations + static int const kWarpGemmIterations = + (WarpGemm::kK / Operator::Policy::MmaShape::kK); + + /// Number of stages + static int const kStages = Stages; + + // + // Nested structs + // + + /// Shared storage object needed by threadblock-scoped GEMM + template + struct OperandSharedStorage { + AlignedBuffer buffer; + using TensorRef = TensorRef; + + CUTLASS_DEVICE + static OperandLayout Layout() { + return OperandLayout::packed({OperandShape::kRow, OperandShape::kColumn}); + } + + /// Returns a TensorRef to the operand + CUTLASS_HOST_DEVICE + TensorRef ref() { + return TensorRef{buffer.data(), Layout()}; + } + }; + + /// Shape of the A matrix operand in shared memory + using ShapeA = MatrixShape< + Shape::kM + Policy::SmemPaddingA::kRow, + Shape::kK * kStages + Policy::SmemPaddingA::kColumn>; + + /// Shape of the B matrix operand in shared memory + using ShapeB = MatrixShape< + Shape::kK * kStages + Policy::SmemPaddingB::kRow, + Shape::kN + Policy::SmemPaddingB::kColumn>; + + using SharedStorageA = OperandSharedStorage< + typename Operator::ElementA, + ShapeA, + typename Operator::LayoutA>; + using SharedStorageB = OperandSharedStorage< + typename Operator::ElementB, + ShapeB, + typename Operator::LayoutB>; + using TensorRefA = typename SharedStorageA::TensorRef; + using TensorRefB = typename SharedStorageB::TensorRef; + + struct SharedStorage { + /// Buffer for A operand + SharedStorageA operand_A; + + /// Buffer for B operand + SharedStorageB operand_B; + }; + + protected: + // + // Data members + // + + /// Iterator to load a warp-scoped tile of A operand from shared memory + typename Operator::IteratorA warp_tile_iterator_A_; + + /// Iterator to load a warp-scoped tile of B operand from shared memory + typename Operator::IteratorB warp_tile_iterator_B_; + + public: + /// Construct from tensor references + CUTLASS_DEVICE + CustomMmaBase( + ///< Shared storage needed for internal use by threadblock-scoped GEMM + SharedStorageA& shared_storageA, + SharedStorageB& shared_storageB, + ///< ID within the threadblock + int thread_idx, + ///< ID of warp + int warp_idx, + ///< ID of each thread within a warp + int lane_idx) + : warp_tile_iterator_A_(shared_storageA.ref(), lane_idx), + warp_tile_iterator_B_(shared_storageB.ref(), lane_idx) {} +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace threadblock +} // namespace gemm +} // namespace cutlass + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/gemm/custom_mma_multistage.h b/csrc/include/natten/cuda/fna/gemm/custom_mma_multistage.h new file mode 100644 index 0000000..c4870b7 --- /dev/null +++ b/csrc/include/natten/cuda/fna/gemm/custom_mma_multistage.h @@ -0,0 +1,765 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Template for a double-buffered threadblock-scoped GEMM kernel. +*/ + +#pragma once + +#include "cutlass/aligned_buffer.h" +#include "cutlass/arch/cache_operation.h" +#include "cutlass/arch/memory.h" +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/matrix_shape.h" +#include "cutlass/numeric_types.h" + +#include "custom_mma_base.h" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace gemm { +namespace threadblock { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +/// Structure to compute the matrix product targeting CUDA cores and SIMT math +/// instructions. +template < + /// Size of the Gemm problem - concept: gemm::GemmShape<> + typename Shape_, + /// Iterates over tiles of A operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorA_, + /// Iterates over tiles of A operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorA_, + /// Cache operation for operand A + cutlass::arch::CacheOperation::Kind CacheOpA, + /// Iterates over tiles of B operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorB_, + /// Iterates over tiles of B operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorB_, + /// Cache operation for operand B + cutlass::arch::CacheOperation::Kind CacheOpB, + /// Data type of accumulator matrix + typename ElementC_, + /// Data type of accumulator matrix + typename LayoutC_, + /// Policy describing tuning details (concept: MmaPolicy) + typename Policy_, + /// Number of stages, + int Stages, + /// Use zfill or predicate for out-of-bound cp.async + SharedMemoryClearOption SharedMemoryClear = SharedMemoryClearOption::kNone, + /// Upper boundon the K dimension + int kMaxK = cutlass::platform::numeric_limits::max(), + /// Used for partial specialization + typename Enable = bool> +class CustomMmaMultistage : public CustomMmaBase { + public: + ///< Base class + using Base = CustomMmaBase; + ///< Size of the Gemm problem - concept: gemm::GemmShape<> + using Shape = Shape_; + ///< Iterates over tiles of A operand in global memory + using IteratorA = IteratorA_; + ///< Iterates over tiles of B operand in global memory + using IteratorB = IteratorB_; + ///< Data type of accumulator matrix + using ElementC = ElementC_; + ///< Layout of accumulator matrix + using LayoutC = LayoutC_; + ///< Policy describing tuning details + using Policy = Policy_; + + using SmemIteratorA = SmemIteratorA_; + using SmemIteratorB = SmemIteratorB_; + + static cutlass::arch::CacheOperation::Kind const kCacheOpA = CacheOpA; + static cutlass::arch::CacheOperation::Kind const kCacheOpB = CacheOpB; + + // + // Dependent types + // + + /// Fragment of accumulator tile + using FragmentC = typename Policy::Operator::FragmentC; + + /// Warp-level Mma + using Operator = typename Policy::Operator; + + /// Minimum architecture is Sm80 to support cp.async + using ArchTag = arch::Sm80; + + /// Complex transform on A operand + static ComplexTransform const kTransformA = Operator::kTransformA; + + /// Complex transform on B operand + static ComplexTransform const kTransformB = Operator::kTransformB; + + /// Internal structure exposed for introspection. + struct Detail { + static_assert( + Base::kWarpGemmIterations > 1, + "The pipelined structure requires at least two warp-level " + "GEMM operations."); + + /// Number of cp.async instructions to load one stage of operand A + static int const AsyncCopyIterationsPerStageA = + IteratorA::ThreadMap::Iterations::kCount; + + /// Number of cp.async instructions to load one stage of operand B + static int const AsyncCopyIterationsPerStageB = + IteratorB::ThreadMap::Iterations::kCount; + + /// Number of stages + static int const kStages = Stages; + + /// Number of cp.async instructions to load on group of operand A + static int const kAccessesPerGroupA = + (AsyncCopyIterationsPerStageA + Base::kWarpGemmIterations - 1) / + Base::kWarpGemmIterations; + + /// Number of cp.async instructions to load on group of operand B + static int const kAccessesPerGroupB = + (AsyncCopyIterationsPerStageB + Base::kWarpGemmIterations - 1) / + Base::kWarpGemmIterations; + }; + + static bool const kSmemContainsEntireMat = kMaxK <= Shape::kK * Stages; + static constexpr int kNumStagesConcurrentLoad = + kSmemContainsEntireMat ? Stages : Stages - 1; + + private: + using WarpLoadedFragmentA = typename Operator::FragmentA; + using WarpLoadedFragmentB = typename Operator::FragmentB; + using WarpTransformedFragmentA = typename Operator::TransformedFragmentA; + using WarpTransformedFragmentB = typename Operator::TransformedFragmentB; + + private: + // + // Data members + // + + /// Iterator to write threadblock-scoped tile of A operand to shared memory + SmemIteratorA smem_iterator_A_; + + /// Iterator to write threadblock-scoped tile of B operand to shared memory + SmemIteratorB smem_iterator_B_; + + bool prologue_done_; + + // Set to `True` to ensure the accumulator will be zero outside the GEMM + // footprint + bool zero_outside_bounds_; + + public: + /// Construct from tensor references + CUTLASS_DEVICE + CustomMmaMultistage( + ///< Shared storage needed for internal use by threadblock-scoped GEMM + typename Base::SharedStorageA& shared_storageA, + typename Base::SharedStorageB& shared_storageB, + ///< ID within the threadblock + int thread_idx, + ///< ID of warp + int warp_idx, + ///< ID of each thread within a warp + int lane_idx) + : Base(shared_storageA, shared_storageB, thread_idx, warp_idx, lane_idx), + smem_iterator_A_(shared_storageA.ref(), thread_idx), + smem_iterator_B_(shared_storageB.ref(), thread_idx), + prologue_done_(false), + zero_outside_bounds_(false) { + // Compute warp location within threadblock tile by mapping the warp_id to + // three coordinates: + // _m: the warp's position within the threadblock along the M dimension + // _n: the warp's position within the threadblock along the N dimension + // _k: the warp's position within the threadblock along the K dimension + + int warp_idx_mn = warp_idx % (Base::WarpCount::kM * Base::WarpCount::kN); + int warp_idx_k = warp_idx / (Base::WarpCount::kM * Base::WarpCount::kN); + + int warp_idx_m = warp_idx_mn % Base::WarpCount::kM; + int warp_idx_n = warp_idx_mn / Base::WarpCount::kM; + + // Add per-warp offsets in units of warp-level tiles + this->warp_tile_iterator_A_.add_tile_offset( + {warp_idx_m, Base::kWarpGemmIterations * warp_idx_k}); + this->warp_tile_iterator_B_.add_tile_offset( + {Base::kWarpGemmIterations * warp_idx_k, warp_idx_n}); + } + CUTLASS_DEVICE + CustomMmaMultistage( + ///< Shared storage needed for internal use by threadblock-scoped GEMM + typename Base::SharedStorage& st, + ///< ID within the threadblock + int thread_idx, + ///< ID of warp + int warp_idx, + ///< ID of each thread within a warp + int lane_idx) + : CustomMmaMultistage( + st.operand_A, + st.operand_B, + thread_idx, + warp_idx, + lane_idx) {} + + CUTLASS_DEVICE + bool set_prologue_done(bool value) { + prologue_done_ = value; + } + + CUTLASS_DEVICE + bool set_zero_outside_bounds(bool value) { + zero_outside_bounds_ = value; + } + + template + CUTLASS_DEVICE static void prologue( + typename Base::SharedStorage& shared_storage, + ///< iterator over A operand in global memory + IteratorA iterator_A, + ///< iterator over B operand in global memory + IteratorB iterator_B, + int thread_idx, + int problem_size_k) { + prologue( + shared_storage.operand_A, + shared_storage.operand_B, + iterator_A, + iterator_B, + thread_idx, + problem_size_k); + } + + template + CUTLASS_DEVICE static void prologue( + typename Base::SharedStorageA& shared_storageA, + typename Base::SharedStorageB& shared_storageB, + ///< iterator over A operand in global memory + IteratorA iterator_A, + ///< iterator over B operand in global memory + IteratorB iterator_B, + int thread_idx, + int problem_size_k) { + SmemIteratorA smem_iterator_A(shared_storageA.ref(), thread_idx); + SmemIteratorB smem_iterator_B(shared_storageB.ref(), thread_idx); + int32_t iter = (problem_size_k + Base::Shape::kK - 1) / Base::Shape::kK; + _prologue( + iterator_A, iterator_B, iter, smem_iterator_A, smem_iterator_B); + } + + CUTLASS_DEVICE + void copy_tiles_and_advance( + IteratorA& iterator_A, + IteratorB& iterator_B, + int group_start_A = 0, + int group_start_B = 0) { + iterator_A.set_iteration_index( + group_start_A * IteratorA::kAccessesPerVector); + this->smem_iterator_A_.set_iteration_index(group_start_A); + + // Async Copy for operand A + CUTLASS_PRAGMA_UNROLL + for (int j = 0; j < Detail::kAccessesPerGroupA; ++j) { + if (group_start_A + j < Detail::AsyncCopyIterationsPerStageA) { + typename IteratorA::AccessType* dst_ptr = + reinterpret_cast( + this->smem_iterator_A_.get()); + + int const kSrcBytes = sizeof_bits::value * + IteratorA::ThreadMap::kElementsPerAccess / + IteratorA::kAccessesPerVector / 8; + + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < IteratorA::kAccessesPerVector; ++v) { + auto gmem_ptr = iterator_A.get(); + + if (zero_outside_bounds_ || + SharedMemoryClear == SharedMemoryClearOption::kZfill) { + cutlass::arch::cp_async_zfill( + dst_ptr + v, gmem_ptr, iterator_A.valid()); + } else { + cutlass::arch::cp_async( + dst_ptr + v, gmem_ptr, iterator_A.valid()); + } + + ++iterator_A; + } + + ++this->smem_iterator_A_; + } + } + + iterator_B.set_iteration_index( + group_start_B * IteratorB::kAccessesPerVector); + this->smem_iterator_B_.set_iteration_index(group_start_B); + + // Async Copy for operand B + CUTLASS_PRAGMA_UNROLL + for (int j = 0; j < Detail::kAccessesPerGroupB; ++j) { + if (group_start_B + j < Detail::AsyncCopyIterationsPerStageB) { + typename IteratorB::AccessType* dst_ptr = + reinterpret_cast( + this->smem_iterator_B_.get()); + + int const kSrcBytes = sizeof_bits::value * + IteratorB::ThreadMap::kElementsPerAccess / + IteratorB::kAccessesPerVector / 8; + + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < IteratorB::kAccessesPerVector; ++v) { + auto gmem_ptr = iterator_B.get(); + + if (zero_outside_bounds_ || + SharedMemoryClear == SharedMemoryClearOption::kZfill) { + cutlass::arch::cp_async_zfill( + dst_ptr + v, gmem_ptr, iterator_B.valid()); + } else { + cutlass::arch::cp_async( + dst_ptr + v, gmem_ptr, iterator_B.valid()); + } + + ++iterator_B; + } + ++this->smem_iterator_B_; + } + } + } + + template + CUTLASS_DEVICE static void _prologue( + IteratorA& iterator_A, + IteratorB& iterator_B, + int32_t& gemm_k_iterations, + SmemIteratorA& smem_iterator_A_, + SmemIteratorB& smem_iterator_B_) { + // Issue several complete stages + CUTLASS_PRAGMA_UNROLL + for (int stage = 0; stage < kNumStagesConcurrentLoad; + ++stage, --gemm_k_iterations) { + iterator_A.clear_mask(gemm_k_iterations == 0); + iterator_B.clear_mask(gemm_k_iterations == 0); + + iterator_A.set_iteration_index(0); + smem_iterator_A_.set_iteration_index(0); + + // Async Copy for operand A + CUTLASS_PRAGMA_UNROLL + for (int j = 0; j < Detail::AsyncCopyIterationsPerStageA; ++j) { + typename IteratorA::AccessType* dst_ptr = + reinterpret_cast( + smem_iterator_A_.get()); + + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < IteratorA::kAccessesPerVector; ++v) { + int const kSrcBytes = + sizeof_bits::value * + IteratorA::ThreadMap::kElementsPerAccess / + IteratorA::kAccessesPerVector / 8; + + int src_bytes = (iterator_A.valid() ? kSrcBytes : 0); + + if (kLoadA) { + cutlass::arch::cp_async_zfill( + dst_ptr + v, iterator_A.get(), iterator_A.valid()); + } + + ++iterator_A; + } + + ++smem_iterator_A_; + } + + iterator_B.set_iteration_index(0); + smem_iterator_B_.set_iteration_index(0); + + // Async Copy for operand B + CUTLASS_PRAGMA_UNROLL + for (int j = 0; j < Detail::AsyncCopyIterationsPerStageB; ++j) { + typename IteratorB::AccessType* dst_ptr = + reinterpret_cast( + smem_iterator_B_.get()); + + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < IteratorB::kAccessesPerVector; ++v) { + int const kSrcBytes = + sizeof_bits::value * + IteratorB::ThreadMap::kElementsPerAccess / + IteratorB::kAccessesPerVector / 8; + + if (kLoadB) { + cutlass::arch::cp_async_zfill( + dst_ptr + v, iterator_B.get(), iterator_B.valid()); + } + + ++iterator_B; + } + + ++smem_iterator_B_; + } + + // Move to the next stage + iterator_A.add_tile_offset({0, 1}); + iterator_B.add_tile_offset({1, 0}); + + smem_iterator_A_.add_tile_offset({0, 1}); + smem_iterator_B_.add_tile_offset({1, 0}); + + // Defines the boundary of a stage of cp.async. + cutlass::arch::cp_async_fence(); + } + } + + /// Perform a threadblock-scoped matrix multiply-accumulate + CUTLASS_DEVICE + void operator()( + ///< problem size of GEMM + int gemm_k_iterations, + ///< destination accumulator tile + FragmentC& accum, + ///< iterator over A operand in global memory + IteratorA iterator_A, + ///< iterator over B operand in global memory + IteratorB iterator_B, + ///< initial value of accumulator + FragmentC const& src_accum) { + // + // Prologue + // + + if (!prologue_done_) { + _prologue( + iterator_A, + iterator_B, + gemm_k_iterations, + smem_iterator_A_, + smem_iterator_B_); + } else if (!kSmemContainsEntireMat) { + _prologue( + iterator_A, + iterator_B, + gemm_k_iterations, + smem_iterator_A_, + smem_iterator_B_); + } else { + gemm_k_iterations -= kNumStagesConcurrentLoad; + } + + // Perform accumulation in the 'd' output operand + accum = src_accum; + + // + // Clear the remaining tiles of SMEM. This is a functional requirement for + // some kernels so that all accumulator elements outside the GEMM footprint + // are zero. + // + + if (SharedMemoryClear == SharedMemoryClearOption::kClearLastStage) { + /// Iterator to write threadblock-scoped tile of A operand to shared + /// memory + SmemIteratorA last_smem_iterator_A(this->smem_iterator_A_); + + typename IteratorA::AccessType zero_A; + zero_A.clear(); + + last_smem_iterator_A.set_iteration_index(0); + + // Async Copy for operand A + CUTLASS_PRAGMA_UNROLL + for (int j = 0; j < Detail::AsyncCopyIterationsPerStageA; ++j) { + typename IteratorA::AccessType* dst_ptr = + reinterpret_cast( + last_smem_iterator_A.get()); + + *dst_ptr = zero_A; + + ++last_smem_iterator_A; + } + + /// Iterator to write threadblock-scoped tile of B operand to shared + /// memory + SmemIteratorB last_smem_iterator_B(this->smem_iterator_B_); + typename IteratorB::AccessType zero_B; + + zero_B.clear(); + last_smem_iterator_B.set_iteration_index(0); + + // Async Copy for operand B + CUTLASS_PRAGMA_UNROLL + for (int j = 0; j < Detail::AsyncCopyIterationsPerStageB; ++j) { + typename IteratorB::AccessType* dst_ptr = + reinterpret_cast( + last_smem_iterator_B.get()); + + *dst_ptr = zero_B; + + ++last_smem_iterator_B; + } + } + + // Waits until kStages-2 stages have committed. + cutlass::arch::cp_async_wait(); + __syncthreads(); + + // Pair of fragments used to overlap shared memory loads and math + // instructions + WarpLoadedFragmentA warp_loaded_frag_A[2]; + WarpLoadedFragmentB warp_loaded_frag_B[2]; + WarpTransformedFragmentA warp_transformed_frag_A[2]; + WarpTransformedFragmentB warp_transformed_frag_B[2]; + + Operator warp_mma; + + this->warp_tile_iterator_A_.set_kgroup_index(0); + this->warp_tile_iterator_B_.set_kgroup_index(0); + + this->warp_tile_iterator_A_.load(warp_loaded_frag_A[0]); + this->warp_tile_iterator_B_.load(warp_loaded_frag_B[0]); + + ++this->warp_tile_iterator_A_; + ++this->warp_tile_iterator_B_; + + iterator_A.clear_mask(gemm_k_iterations == 0); + iterator_B.clear_mask(gemm_k_iterations == 0); + + int smem_write_stage_idx = Base::kStages - 1; + int smem_read_stage_idx = 0; + + warp_mma.transform( + warp_transformed_frag_A[0], + warp_transformed_frag_B[0], + warp_loaded_frag_A[0], + warp_loaded_frag_B[0]); + + // tf32x3 kernels use staging accumulation. warp_mma uses a temporary + // accumulator and this temporary accumulator is added to the final + // accumulator once in every mainloop iteration. + plus plus_accum; + + FragmentC tmp_accum; + + if (platform::is_same< + typename Operator::MathOperator, + arch::OpMultiplyAddFastF32>::value || + platform::is_same< + typename Operator::MathOperator, + arch::OpMultiplyAddComplexFastF32>::value) { + tmp_accum.clear(); + } + + // + // Mainloop + // + + CUTLASS_GEMM_LOOP + for (; gemm_k_iterations > (-kNumStagesConcurrentLoad);) { + // + // Loop over GEMM K dimension + // + + // Computes a warp-level GEMM on data held in shared memory + // Each "warp_mma_k" refers to a warp-level matrix multiply-accumulate + CUTLASS_PRAGMA_UNROLL + for (int warp_mma_k = 0; warp_mma_k < Base::kWarpGemmIterations; + ++warp_mma_k) { + // Load warp-level tiles from shared memory, wrapping to k offset if + // this is the last group as the case may be. + + this->warp_tile_iterator_A_.set_kgroup_index( + (warp_mma_k + 1) % Base::kWarpGemmIterations); + this->warp_tile_iterator_B_.set_kgroup_index( + (warp_mma_k + 1) % Base::kWarpGemmIterations); + + // In case of a non-circular buffer ("kSmemContainsEntireMat") + // make sure we don't load out of bounds data. + if (!kSmemContainsEntireMat || + gemm_k_iterations > (-kNumStagesConcurrentLoad) || + warp_mma_k < Base::kWarpGemmIterations - 1) { + this->warp_tile_iterator_A_.load( + warp_loaded_frag_A[(warp_mma_k + 1) % 2]); + this->warp_tile_iterator_B_.load( + warp_loaded_frag_B[(warp_mma_k + 1) % 2]); + } + + ++this->warp_tile_iterator_A_; + ++this->warp_tile_iterator_B_; + + if (warp_mma_k > 0) + warp_mma.transform( + warp_transformed_frag_A[warp_mma_k % 2], + warp_transformed_frag_B[warp_mma_k % 2], + warp_loaded_frag_A[warp_mma_k % 2], + warp_loaded_frag_B[warp_mma_k % 2]); + + if (platform::is_same< + typename Operator::MathOperator, + arch::OpMultiplyAddFastF32>::value || + platform::is_same< + typename Operator::MathOperator, + arch::OpMultiplyAddComplexFastF32>::value) { + warp_mma( + tmp_accum, + warp_transformed_frag_A[warp_mma_k % 2], + warp_transformed_frag_B[warp_mma_k % 2], + tmp_accum); + + if (warp_mma_k == 0) { + accum = plus_accum(accum, tmp_accum); + tmp_accum.clear(); + } + } else { + warp_mma( + accum, + warp_transformed_frag_A[warp_mma_k % 2], + warp_transformed_frag_B[warp_mma_k % 2], + accum); + } + + // Issue global->shared copies for the this stage + if (!kSmemContainsEntireMat && + warp_mma_k < Base::kWarpGemmIterations - 1) { + int group_start_iteration_A, group_start_iteration_B; + + group_start_iteration_A = warp_mma_k * Detail::kAccessesPerGroupA; + group_start_iteration_B = warp_mma_k * Detail::kAccessesPerGroupB; + + copy_tiles_and_advance( + iterator_A, + iterator_B, + group_start_iteration_A, + group_start_iteration_B); + } + + if (warp_mma_k + 2 == Base::kWarpGemmIterations) { + if (!kSmemContainsEntireMat) { + int group_start_iteration_A, group_start_iteration_B; + group_start_iteration_A = + (warp_mma_k + 1) * Detail::kAccessesPerGroupA; + group_start_iteration_B = + (warp_mma_k + 1) * Detail::kAccessesPerGroupB; + + copy_tiles_and_advance( + iterator_A, + iterator_B, + group_start_iteration_A, + group_start_iteration_B); + } + + // Inserts a memory fence between stages of cp.async instructions. + cutlass::arch::cp_async_fence(); + + // Waits until kStages-2 stages have committed. + cutlass::arch::cp_async_wait(); + __syncthreads(); + + // Move to the next stage + iterator_A.add_tile_offset({0, 1}); + iterator_B.add_tile_offset({1, 0}); + + this->smem_iterator_A_.add_tile_offset({0, 1}); + this->smem_iterator_B_.add_tile_offset({1, 0}); + + // Add negative offsets to return iterators to the 'start' of the + // circular buffer in shared memory + if (smem_write_stage_idx == (Base::kStages - 1)) { + this->smem_iterator_A_.add_tile_offset({0, -Base::kStages}); + this->smem_iterator_B_.add_tile_offset({-Base::kStages, 0}); + smem_write_stage_idx = 0; + } else { + ++smem_write_stage_idx; + } + + if (!kSmemContainsEntireMat && + smem_read_stage_idx == (Base::kStages - 1)) { + this->warp_tile_iterator_A_.add_tile_offset( + {0, + -Base::kStages * Policy::kPartitionsK * + Base::kWarpGemmIterations}); + this->warp_tile_iterator_B_.add_tile_offset( + {-Base::kStages * Policy::kPartitionsK * + Base::kWarpGemmIterations, + 0}); + smem_read_stage_idx = 0; + } else { + ++smem_read_stage_idx; + } + + --gemm_k_iterations; + iterator_A.clear_mask(gemm_k_iterations == 0); + iterator_B.clear_mask(gemm_k_iterations == 0); + } + + // Do any conversions feeding the first stage at the end of the loop so + // we can start right away on mma instructions + if (warp_mma_k + 1 == Base::kWarpGemmIterations) + warp_mma.transform( + warp_transformed_frag_A[(warp_mma_k + 1) % 2], + warp_transformed_frag_B[(warp_mma_k + 1) % 2], + warp_loaded_frag_A[(warp_mma_k + 1) % 2], + warp_loaded_frag_B[(warp_mma_k + 1) % 2]); + } + } + + if (platform::is_same< + typename Operator::MathOperator, + arch::OpMultiplyAddFastF32>::value || + platform::is_same< + typename Operator::MathOperator, + arch::OpMultiplyAddComplexFastF32>::value) { + accum = plus_accum(accum, tmp_accum); + } + } +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace threadblock +} // namespace gemm +} // namespace cutlass + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/gemm/custom_mma_pipelined.h b/csrc/include/natten/cuda/fna/gemm/custom_mma_pipelined.h new file mode 100644 index 0000000..6c8c399 --- /dev/null +++ b/csrc/include/natten/cuda/fna/gemm/custom_mma_pipelined.h @@ -0,0 +1,408 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Template for a double-buffered threadblock-scoped GEMM kernel. +*/ + +#pragma once + +#include "cutlass/aligned_buffer.h" +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/numeric_conversion.h" + +#include "cutlass/matrix_shape.h" +#include "cutlass/numeric_types.h" + +#include "custom_mma_base.h" +#include "cutlass/gemm/gemm.h" + +///////////////////////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace gemm { +namespace threadblock { + +///////////////////////////////////////////////////////////////////////////////////////////////// + +/// Structure to compute the matrix product targeting CUDA cores and SIMT math +/// instructions. +template < + /// Size of the Gemm problem - concept: gemm::GemmShape<> + typename Shape_, + /// Iterates over tiles of A operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorA_, + /// Iterates over tiles of A operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorA_, + /// Iterates over tiles of B operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorB_, + /// Iterates over tiles of B operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorB_, + /// Data type of accumulator matrix + typename ElementC_, + /// Data type of accumulator matrix + typename LayoutC_, + /// Policy describing tuning details (concept: MmaPolicy) + typename Policy_, + /// Transformation applied to A operand + typename TransformA_ = NumericArrayConverter< + typename SmemIteratorA_::Element, + typename IteratorA_::Element, + IteratorA_::Fragment::kElements>, + /// + /// Transformation applied to B operand + typename TransformB_ = NumericArrayConverter< + typename SmemIteratorB_::Element, + typename IteratorB_::Element, + IteratorB_::Fragment::kElements>, + /// Used for partial specialization + typename Enable = bool> +class CustomMmaPipelined : public CustomMmaBase { + public: + ///< Base class + using Base = CustomMmaBase; + + using Shape = + Shape_; ///< Size of the Gemm problem - concept: gemm::GemmShape<> + using IteratorA = + IteratorA_; ///< Iterates over tiles of A operand in global memory + using IteratorB = + IteratorB_; ///< Iterates over tiles of B operand in global memory + using ElementC = ElementC_; ///< Data type of accumulator matrix + using LayoutC = LayoutC_; ///< Layout of accumulator matrix + using Policy = Policy_; ///< Policy describing tuning details + + using SmemIteratorA = SmemIteratorA_; + using SmemIteratorB = SmemIteratorB_; + + using TransformA = TransformA_; + using TransformB = TransformB_; + + // + // Dependent types + // + + /// Fragment of operand A loaded from global memory + using FragmentA = typename IteratorA::Fragment; + + /// Fragment of operand B loaded from global memory + using FragmentB = typename IteratorB::Fragment; + + /// Fragment of accumulator tile + using FragmentC = typename Policy::Operator::FragmentC; + + /// Warp-level Mma + using Operator = typename Policy::Operator; + + /// Obtain the arch tag from the warp-level operator + using ArchTag = typename Policy::Operator::ArchTag; + + /// Complex transform on A operand + static ComplexTransform const kTransformA = Operator::kTransformA; + + /// Complex transform on B operand + static ComplexTransform const kTransformB = Operator::kTransformB; + + // staticaly assert kStages for MmaPipelined is two (Double-buffered pipeline) + static_assert( + (Base::kStages == 2), + "MmaPipelined requires kStages set to value 2"); + + static bool const kSmemContainsEntireMat = false; + + private: + using WarpFragmentA = typename Operator::FragmentA; + using WarpFragmentB = typename Operator::FragmentB; + + protected: + /// Iterator to write threadblock-scoped tile of A operand to shared memory + SmemIteratorA smem_iterator_A_; + + /// Iterator to write threadblock-scoped tile of B operand to shared memory + SmemIteratorB smem_iterator_B_; + + public: + /// Construct from tensor references + CUTLASS_DEVICE + CustomMmaPipelined( + typename Base::SharedStorageA& shared_storageA, + typename Base::SharedStorageB& shared_storageB, + int thread_idx, ///< ID within the threadblock + int warp_idx, ///< ID of warp + int lane_idx ///< ID of each thread within a warp + ) + : Base(shared_storageA, shared_storageB, thread_idx, warp_idx, lane_idx), + smem_iterator_A_(shared_storageA.ref(), thread_idx), + smem_iterator_B_(shared_storageB.ref(), thread_idx) { + // Compute warp location within threadblock tile by mapping the warp_id to + // three coordinates: + // _m: the warp's position within the threadblock along the M dimension + // _n: the warp's position within the threadblock along the N dimension + // _k: the warp's position within the threadblock along the K dimension + + int warp_idx_mn = warp_idx % (Base::WarpCount::kM * Base::WarpCount::kN); + int warp_idx_k = warp_idx / (Base::WarpCount::kM * Base::WarpCount::kN); + + int warp_idx_m = warp_idx_mn % Base::WarpCount::kM; + int warp_idx_n = warp_idx_mn / Base::WarpCount::kM; + + // Add per-warp offsets in units of warp-level tiles + this->warp_tile_iterator_A_.add_tile_offset( + {warp_idx_m, Base::kWarpGemmIterations * warp_idx_k}); + this->warp_tile_iterator_B_.add_tile_offset( + {Base::kWarpGemmIterations * warp_idx_k, warp_idx_n}); + } + CUTLASS_DEVICE + CustomMmaPipelined( + ///< Shared storage needed for internal use by threadblock-scoped GEMM + typename Base::SharedStorage& st, + ///< ID within the threadblock + int thread_idx, + ///< ID of warp + int warp_idx, + ///< ID of each thread within a warp + int lane_idx) + : CustomMmaPipelined( + st.operand_A, + st.operand_B, + thread_idx, + warp_idx, + lane_idx) {} + + CUTLASS_DEVICE + bool set_prologue_done(bool value) { + // NOT IMPLEMENTED FOR PIPELINED + } + + CUTLASS_DEVICE + bool set_zero_outside_bounds(bool value) { + // NOT NEEDED FOR PIPELINED + // shared memory will always be zero-filled + } + + template + CUTLASS_DEVICE static void prologue( + typename Base::SharedStorage& shared_storage, + ///< iterator over A operand in global memory + IteratorA iterator_A, + ///< iterator over B operand in global memory + IteratorB iterator_B, + int thread_idx, + int problem_size_k) { + prologue( + shared_storage.operand_A, + shared_storage.operand_B, + iterator_A, + iterator_B, + thread_idx, + problem_size_k); + } + + template + CUTLASS_DEVICE static void prologue( + typename Base::SharedStorageA& shared_storageA, + typename Base::SharedStorageB& shared_storageB, + ///< iterator over A operand in global memory + IteratorA iterator_A, + ///< iterator over B operand in global memory + IteratorB iterator_B, + int thread_idx, + int problem_size_k) { + // NOT IMPLEMENTED FOR PIPELINED + } + + /// Perform a threadblock-scoped matrix multiply-accumulate + CUTLASS_DEVICE + void operator()( + int gemm_k_iterations, ///< number of iterations of the mainloop + FragmentC& accum, ///< destination accumulator tile + IteratorA iterator_A, ///< iterator over A operand in global memory + IteratorB iterator_B, ///< iterator over B operand in global memory + FragmentC const& src_accum, ///< source accumulator tile + TransformA transform_A = + TransformA(), ///< transformation applied to A fragment + TransformB transform_B = + TransformB()) { ///< transformation applied to B fragment + + // + // Prologue + // + + // Perform accumulation in the 'd' output operand + accum = src_accum; + + FragmentA tb_frag_A; + FragmentB tb_frag_B; + + tb_frag_A.clear(); + tb_frag_B.clear(); + + // The last kblock is loaded in the prolog + iterator_A.load(tb_frag_A); + iterator_B.load(tb_frag_B); + + ++iterator_A; + ++iterator_B; + + this->smem_iterator_A_.store(transform_A(tb_frag_A)); + this->smem_iterator_B_.store(transform_B(tb_frag_B)); + + ++this->smem_iterator_A_; + ++this->smem_iterator_B_; + + __syncthreads(); + + // Pair of fragments used to overlap shared memory loads and math + // instructions + WarpFragmentA warp_frag_A[2]; + WarpFragmentB warp_frag_B[2]; + + this->warp_tile_iterator_A_.set_kgroup_index(0); + this->warp_tile_iterator_B_.set_kgroup_index(0); + + this->warp_tile_iterator_A_.load(warp_frag_A[0]); + this->warp_tile_iterator_B_.load(warp_frag_B[0]); + + ++this->warp_tile_iterator_A_; + ++this->warp_tile_iterator_B_; + + Operator warp_mma; + + int smem_write_stage_idx = 1; + + // Avoid reading out of bounds + iterator_A.clear_mask(gemm_k_iterations <= 1); + iterator_B.clear_mask(gemm_k_iterations <= 1); + + // Issue loads during the first warp-level matrix multiply-add *AFTER* + // issuing shared memory loads (which have the tightest latency + // requirement). + + // + // Mainloop + // + + // Note: The main loop does not support Base::kWarpGemmIterations == 2. + CUTLASS_GEMM_LOOP + for (; gemm_k_iterations > 0; --gemm_k_iterations) { + // + // Loop over GEMM K dimension + // + + CUTLASS_PRAGMA_UNROLL + for (int warp_mma_k = 0; warp_mma_k < Base::kWarpGemmIterations; + ++warp_mma_k) { + // Load warp-level tiles from shared memory, wrapping to k offset if + // this is the last group as the case may be. + + if (warp_mma_k == Base::kWarpGemmIterations - 1) { + // Write fragments to shared memory + this->smem_iterator_A_.store(transform_A(tb_frag_A)); + + this->smem_iterator_B_.store(transform_B(tb_frag_B)); + + __syncthreads(); + + ++this->smem_iterator_A_; + ++this->smem_iterator_B_; + + // Add negative offsets to return iterators to the 'start' of the + // circular buffer in shared memory + if (smem_write_stage_idx == 1) { + this->smem_iterator_A_.add_tile_offset({0, -Base::kStages}); + this->smem_iterator_B_.add_tile_offset({-Base::kStages, 0}); + } else { + this->warp_tile_iterator_A_.add_tile_offset( + {0, + -Base::kStages * Policy::kPartitionsK * + Base::kWarpGemmIterations}); + this->warp_tile_iterator_B_.add_tile_offset( + {-Base::kStages * Policy::kPartitionsK * + Base::kWarpGemmIterations, + 0}); + } + + smem_write_stage_idx ^= 1; + } + + this->warp_tile_iterator_A_.set_kgroup_index( + (warp_mma_k + 1) % Base::kWarpGemmIterations); + this->warp_tile_iterator_B_.set_kgroup_index( + (warp_mma_k + 1) % Base::kWarpGemmIterations); + + this->warp_tile_iterator_A_.load(warp_frag_A[(warp_mma_k + 1) % 2]); + this->warp_tile_iterator_B_.load(warp_frag_B[(warp_mma_k + 1) % 2]); + + ++this->warp_tile_iterator_A_; + ++this->warp_tile_iterator_B_; + + if (warp_mma_k == 0) { + iterator_A.load(tb_frag_A); + iterator_B.load(tb_frag_B); + + ++iterator_A; + ++iterator_B; + + // Avoid reading out of bounds if this was the last loop iteration + iterator_A.clear_mask(gemm_k_iterations <= 2); + iterator_B.clear_mask(gemm_k_iterations <= 2); + } + + warp_mma( + accum, + warp_frag_A[warp_mma_k % 2], + warp_frag_B[warp_mma_k % 2], + accum); + } + } + } +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +} // namespace threadblock +} // namespace gemm +} // namespace cutlass + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/gemm/find_default_mma.h b/csrc/include/natten/cuda/fna/gemm/find_default_mma.h new file mode 100644 index 0000000..ac57788 --- /dev/null +++ b/csrc/include/natten/cuda/fna/gemm/find_default_mma.h @@ -0,0 +1,272 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Fused Neighborhood Attention kernels are heavily based on the + * memory-efficient attention kernels from the xFormers project by Meta + * Platforms, Inc. + * + * Copyright (c) Facebook, Inc. and its affiliates + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +/*! \file + \brief Cutlass provides helper template functions to figure out the right + datastructures to instanciate to run a GEMM with various parameters (see + `cutlass/gemm/threadblock/default_mma.h`). However, due to template + instantiation priority rules, it will only create an MmaMultiStage with + kStages=3 (otherwise creates an MmePipelined - which is not compatible with + FastF32). kStages=3 uses too much shared memory and we want to use kStages=2, + so we just copy-pasted some code from `default_mma.h` and + `default_mma_core.h` files and wrapped this template to allow our usecase. + + This is really only for the FastF32 case - aka using TensorCores with fp32. +*/ + +#pragma once + +#include +#include +#include +#include +#include + +#include +#include + +#include + +namespace cutlass { +namespace gemm { +namespace threadblock { + +template < + /// Neighborhood attention spatial rank; must be 0 (self attention), 1, 2, + /// or 3 + int NADim, + /// Element type for A matrix operand + typename ElementA, + /// Layout type for A matrix operand + typename LayoutA, + /// Access granularity of A matrix in units of elements + int kAlignmentA, + /// Element type for B matrix operand + typename ElementB, + /// Layout type for B matrix operand + typename LayoutB, + /// Access granularity of B matrix in units of elements + int kAlignmentB, + /// Element type for internal accumulation + typename ElementAccumulator, + /// Layout type for C and D matrix operand + typename LayoutC, + /// Operator class tag + typename OperatorClass, + /// Tag indicating architecture to tune for + typename ArchTag, + /// Threadblock-level tile size (concept: GemmShape) + typename ThreadblockShape, + /// Warp-level tile size (concept: GemmShape) + typename WarpShape, + /// Instruction-level tile size (concept: GemmShape) + typename InstructionShape, + /// Number of stages used in the pipelined mainloop + int Stages, + /// Operation perfomed by GEMM + typename Operator, + typename Enable_ = void> +struct FindDefaultMma { + static_assert(NADim >= 1 && NADim < 4); + static constexpr bool AccumulatorsInRowMajor = false; + static constexpr SharedMemoryClearOption SharedMemoryClear = + SharedMemoryClearOption::kNone; + using DefaultMma_ = cutlass::gemm::threadblock::DefaultMma< + ElementA, + LayoutA, + kAlignmentA, + ElementB, + LayoutB, + kAlignmentB, + ElementAccumulator, + LayoutC, + OperatorClass, + ArchTag, + ThreadblockShape, + WarpShape, + InstructionShape, + Stages, + Operator, + AccumulatorsInRowMajor, + SharedMemoryClear>; + struct DefaultMma : DefaultMma_ { + using MmaCore_ = typename DefaultMma_::MmaCore; + using IteratorA_ = typename DefaultMma_::IteratorA; + using IteratorB_ = typename DefaultMma_::IteratorB; + using ThreadblockMma_ = typename DefaultMma_::ThreadblockMma; + + // struct ThreadblockMma : ThreadblockMma_ { + using IteratorA = + cutlass::transform::threadblock::CustomPredicatedTileIterator< + NADim, + typename IteratorA_::Shape, + typename IteratorA_::Element, + typename IteratorA_::Layout, + IteratorA_::kAdvanceRank, + typename IteratorA_::ThreadMap, + kAlignmentA>; + + using IteratorB = + cutlass::transform::threadblock::CustomPredicatedTileIterator< + NADim, + typename IteratorB_::Shape, + typename IteratorB_::Element, + typename IteratorB_::Layout, + IteratorB_::kAdvanceRank, + typename IteratorB_::ThreadMap, + kAlignmentB>; + //}; + + // using IteratorA = typename ThreadblockMma::IteratorA; + // using IteratorB = typename ThreadblockMma::IteratorA; + + using ThreadblockMma = typename natten::cuda::fna:: + ReplaceMmaIterators::Mma; + }; +}; + +/// Specialization for sm80 / FastF32 / multistage with kStages=2 +template < + /// Neighborhood attention spatial rank; must be 0 (self attention), 1, 2, + /// or 3 + int NADim, + /// Element type for A matrix operand + typename ElementA_, + /// Layout type for A matrix operand + typename LayoutA_, + /// Access granularity of A matrix in units of elements + int kAlignmentA, + /// Element type for B matrix operand + typename ElementB_, + /// Layout type for B matrix operand + typename LayoutB_, + /// Access granularity of B matrix in units of elements + int kAlignmentB, + /// Element type for internal accumulation + typename ElementAccumulator, + /// Threadblock-level tile size (concept: GemmShape) + typename ThreadblockShape, + /// Warp-level tile size (concept: GemmShape) + typename WarpShape, + /// Instruction-level tile size (concept: GemmShape) + typename InstructionShape, + int kStages, + typename Operator> +struct FindDefaultMma< + NADim, + ElementA_, + LayoutA_, + kAlignmentA, + ElementB_, + LayoutB_, + kAlignmentB, + ElementAccumulator, + layout::RowMajor, + arch::OpClassTensorOp, + arch::Sm80, + ThreadblockShape, + WarpShape, + InstructionShape, + kStages, + Operator, + typename cutlass::platform::enable_if<(kAlignmentA > 1)>::type> { + static_assert(NADim >= 1 && NADim < 4); + using LayoutC = layout::RowMajor; + using OperatorClass = arch::OpClassTensorOp; + using ArchTag = arch::Sm80; + + using DefaultMma_ = cutlass::gemm::threadblock::DefaultMma< + ElementA_, + LayoutA_, + kAlignmentA, + ElementB_, + LayoutB_, + kAlignmentB, + ElementAccumulator, + LayoutC, + OperatorClass, + ArchTag, + ThreadblockShape, + WarpShape, + InstructionShape, + 3, + Operator>; + struct DefaultMma : DefaultMma_ { + using MmaCore_ = typename DefaultMma_::MmaCore; + using IteratorA_ = typename DefaultMma_::IteratorA; + using IteratorB_ = typename DefaultMma_::IteratorB; + + using IteratorA = + cutlass::transform::threadblock::CustomPredicatedTileAccessIterator< + NADim, + typename IteratorA_::Shape, + typename IteratorA_::Element, + typename IteratorA_::Layout, + IteratorA_::kAdvanceRank, + typename IteratorA_::ThreadMap, + typename DefaultMma_::AccessTypeA>; + + using IteratorB = + cutlass::transform::threadblock::CustomPredicatedTileAccessIterator< + NADim, + typename IteratorB_::Shape, + typename IteratorB_::Element, + typename IteratorB_::Layout, + IteratorB_::kAdvanceRank, + typename IteratorB_::ThreadMap, + typename DefaultMma_::AccessTypeB>; + + // Define the threadblock-scoped multistage matrix multiply + using ThreadblockMma = cutlass::gemm::threadblock::MmaMultistage< + typename MmaCore_::Shape, + IteratorA, + typename MmaCore_::SmemIteratorA, + MmaCore_::kCacheOpA, + IteratorB, + typename MmaCore_::SmemIteratorB, + MmaCore_::kCacheOpB, + ElementAccumulator, + LayoutC, + typename MmaCore_::MmaPolicy, + kStages>; + }; +}; + +} // namespace threadblock +} // namespace gemm +} // namespace cutlass diff --git a/csrc/include/natten/cuda/fna/gemm/mma_accum_lambda_iterator.h b/csrc/include/natten/cuda/fna/gemm/mma_accum_lambda_iterator.h new file mode 100644 index 0000000..7deb5d4 --- /dev/null +++ b/csrc/include/natten/cuda/fna/gemm/mma_accum_lambda_iterator.h @@ -0,0 +1,393 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Fused Neighborhood Attention kernels are heavily based on the + * memory-efficient attention kernels from the xFormers project by Meta + * Platforms, Inc. + * + * Copyright (c) Facebook, Inc. and its affiliates + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include +#include +#include +#include + +/* +TensorCores have different accumulator layouts. +This file provides a class to easily map the accumulator +i-th element with the corresponding matrix row/col. +*/ + +template +struct AccumLambdaIteratorSm80 { + static_assert( + cutlass::platform:: + is_same::value, + "only RowMajor is supported"); + + using Policy = typename T::Policy; + using InstructionShape = typename T::InstructionShape; + using OpDelta = typename T::OpDelta; + using Shape = typename T::Shape; + static int const kElementsPerAccess = InstructionShape::kN / 4; + static int const kRowsPerTile = 8; + static int const kAccumulatorRows = InstructionShape::kM / kRowsPerTile; + + static int const kRowIters = Policy::MmaIterations::kRow * kAccumulatorRows; + + static cutlass::MatrixCoord CUTLASS_DEVICE get_lane_offset( + int8_t lane_id, + int8_t warp_id, + typename T::TensorCoord const& tile_offset) { + int quad = (lane_id >> 2); + int lane_in_quad = (lane_id & 3); + return cutlass::MatrixCoord( + quad + tile_offset.row() * Shape::kRow, + lane_in_quad * kElementsPerAccess + + tile_offset.column() * Shape::kColumn); + } + + template + CUTLASS_DEVICE static void iterateRows( + cutlass::MatrixCoord& lane_offset, + FA beginRow, + FB op, + FC endRow) { + // See cutlass/gemm/warp/mma_tensor_op_tile_iterator.h + CUTLASS_PRAGMA_UNROLL + for (int mma_m = 0; mma_m < Policy::MmaIterations::kRow; ++mma_m) { + CUTLASS_PRAGMA_UNROLL + for (int row = 0; row < kAccumulatorRows; ++row) { + int accum_m = mma_m * InstructionShape::kM * OpDelta::kRow + + row * kRowsPerTile + lane_offset.row(); + beginRow(accum_m); + + CUTLASS_PRAGMA_UNROLL + for (int mma_n = 0; mma_n < Policy::MmaIterations::kColumn; ++mma_n) { + int mma_accum_start = kAccumulatorRows * kElementsPerAccess * + (mma_n * Policy::MmaIterations::kRow + mma_m); + CUTLASS_PRAGMA_UNROLL + for (int col = 0; col < kElementsPerAccess; ++col) { + int accum_n = mma_n * InstructionShape::kN * OpDelta::kColumn + + col + lane_offset.column(); + int idx = mma_accum_start + row * kElementsPerAccess + col; + op(accum_m, accum_n, idx); + } + } + + endRow(accum_m); + } + } + } + + template + CUTLASS_DEVICE static bool reduceSameRow(int lane_id, DT& myValue, F fn) { + // In each warp, 4 threads will work on the same row + // - the ones with the same `quad` + auto otherV = __shfl_xor_sync(0xffffffff, myValue, 1); + myValue = fn(myValue, otherV); + otherV = __shfl_xor_sync(0xffffffff, myValue, 2); + myValue = fn(myValue, otherV); + int lane_in_quad = (lane_id & 3); + return lane_in_quad == 0; + } +}; + +template +struct AccumLambdaIteratorSm70 { + static_assert( + cutlass::platform:: + is_same::value, + "only RowMajor is supported"); + + using Policy = typename T::Policy; + using InstructionShape = typename T::InstructionShape; + using OpDelta = typename T::OpDelta; + using Shape = typename T::Shape; + using Element = accum_t; + + static int const kElementsPerPartial = 4; + using EleShapePerPatial = typename cutlass::platform::conditional< + cutlass::platform::is_same::value, + cutlass::MatrixShape<2, 2>, + cutlass::MatrixShape<1, 4>>::type; + static int const kElementsPerMma = 8; + static int const kAccumulatorPatials = 2; + using QuadShapePerPatialMma = cutlass::MatrixShape<4, 4>; + + static int const kRowIters = Policy::TileIterations::kRow * + Policy::MmaIterations::kRow * EleShapePerPatial::kRow; + + static cutlass::MatrixCoord CUTLASS_DEVICE get_lane_offset( + int8_t lane_id, + int8_t warp_id, + typename T::TensorCoord const& tile_offset) { + int quad = (lane_id >> 2); + int lane_in_quad = (lane_id & 3); + int accum_m, accum_n; + + if (cutlass::platform::is_same::value) { + // (quad[2],quad[0])+lane_in_quad[0] + accum_m = (((quad & 0x4) >> 1) + (quad & 0x1)) * 8 + (lane_in_quad & 1); + // (quad[1])+lane_in_quad[1] + accum_n = + ((quad >> 1) & 0x1) * kElementsPerPartial * kAccumulatorPatials + + (lane_in_quad & 2); + } else { + accum_m = (((quad & 0x4) >> 1) + (quad & 0x1)) * 8 + + lane_in_quad; // (quad[2],quad[0]) + accum_n = ((quad >> 1) & 0x1) * kElementsPerPartial * kAccumulatorPatials; + } + return cutlass::MatrixCoord( + accum_m + tile_offset.row() * Shape::kRow, + accum_n + tile_offset.column() * Shape::kColumn); + } + + template + CUTLASS_DEVICE static bool reduceSameRow(int lane_id, DT& myValue, F fn) { + static_assert( + cutlass::platform::is_same::value, + "update to support non-float accum"); + // https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#warp-level-matrix-fragment-mma-884-f16 + // T0 & T2 share same line within a quad + auto otherV = __shfl_xor_sync(0xffffffff, myValue, 1 << 1); + myValue = fn(myValue, otherV); + // quad 0 and quad 2 are on the same lines + otherV = __shfl_xor_sync(0xffffffff, myValue, 1 << 3); + myValue = fn(myValue, otherV); + return (lane_id & ((1 << 1) | (1 << 3))) == 0; + } + + template + CUTLASS_DEVICE static void iterateRows( + cutlass::MatrixCoord& lane_offset, + FA beginRow, + FB op, + FC endRow) { + CUTLASS_PRAGMA_UNROLL + for (int tile_m = 0; tile_m < Policy::TileIterations::kRow; ++tile_m) { + CUTLASS_PRAGMA_UNROLL + for (int mma_m = 0; mma_m < Policy::MmaIterations::kRow; ++mma_m) { + CUTLASS_PRAGMA_UNROLL + for (int m = 0; m < EleShapePerPatial::kRow; ++m) { + int accum_m = tile_m * Policy::InterleavedTile::kRow + + mma_m * QuadShapePerPatialMma::kRow + m * 2 + lane_offset.row(); + beginRow(accum_m); + + CUTLASS_PRAGMA_UNROLL + for (int tile_n = 0; tile_n < Policy::TileIterations::kColumn; + ++tile_n) { + CUTLASS_PRAGMA_UNROLL + for (int mma_n = 0; mma_n < Policy::MmaIterations::kColumn; + ++mma_n) { + CUTLASS_PRAGMA_UNROLL + for (int p = 0; p < kAccumulatorPatials; ++p) { + CUTLASS_PRAGMA_UNROLL + for (int n = 0; n < EleShapePerPatial::kColumn; ++n) { + int mma_accum_start = + (((tile_n * Policy::TileIterations::kRow + tile_m) * + Policy::MmaIterations::kColumn + + mma_n) * + Policy::MmaIterations::kRow + + mma_m) * + kElementsPerMma; + int accum_n = tile_n * Policy::InterleavedTile::kColumn + + mma_n * QuadShapePerPatialMma::kColumn + + p * Policy::InterleavedTile::kColumn / 2 + n + + lane_offset.column(); + int idx = mma_accum_start + p * kElementsPerPartial + + m * EleShapePerPatial::kColumn + n; + op(accum_m, accum_n, idx); + } + } + } + } + endRow(accum_m); + } + } + } + } +}; + +template +struct AccumLambdaIteratorSimt { + using Policy = typename T::Policy; + using Iterations = typename T::Iterations; + using Element = typename T::Element; + using Delta = typename T::Delta; + using Shape = typename T::Shape; + static_assert( + cutlass::platform:: + is_same::value, + "only RowMajor is supported"); + + static int const kRowIters = Iterations::kRow * Policy::LaneMmaShape::kM; + + template + CUTLASS_DEVICE static bool reduceSameRow(int lane_id, DT& myValue, F fn) { + CUTLASS_PRAGMA_UNROLL + for (int bit = 1; bit < Policy::WarpShape::kColumn; bit *= 2) { + auto otherV = __shfl_xor_sync(0xffffffff, myValue, bit); + myValue = fn(myValue, otherV); + } + return (lane_id & (Policy::WarpShape::kColumn - 1)) == 0; + } + + template + CUTLASS_DEVICE static void iterateRows( + cutlass::MatrixCoord& lane_offset, + FA beginRow, + FB op, + FC endRow) { + CUTLASS_PRAGMA_UNROLL + for (int mma_m = 0; mma_m < Iterations::kRow; ++mma_m) { + CUTLASS_PRAGMA_UNROLL + for (int m = 0; m < Policy::LaneMmaShape::kM; ++m) { + int accum_m = mma_m * Delta::kRow + m + lane_offset.row(); + beginRow(accum_m); + + CUTLASS_PRAGMA_UNROLL + for (int mma_n = 0; mma_n < Iterations::kColumn; ++mma_n) { + int accum_n = + mma_n * Policy::WarpShape::kColumn * Policy::LaneMmaShape::kN + + lane_offset.column(); + CUTLASS_PRAGMA_UNROLL + for (int n = 0; n < Policy::LaneMmaShape::kN; ++n) { + int idx = n + + Policy::LaneMmaShape::kN * + (mma_n + + Iterations::kColumn * + (m + mma_m * Policy::LaneMmaShape::kM)); + op(accum_m, accum_n + n, idx); + } + } + endRow(accum_m); + } + } + } + + static cutlass::MatrixCoord CUTLASS_DEVICE get_lane_offset( + int8_t lane_id, + int8_t warp_id, + typename T::TensorCoord const& tile_offset) { + static_assert( + cutlass::platform::is_same< + typename Policy::LaneLayout, + cutlass::layout::RowMajorInterleaved<1>>::value, + ""); + typename Policy::LaneLayout lane_layout = Policy::get_lane_layout(); + + cutlass::MatrixCoord lane_offset = lane_layout.inverse(lane_id) * + cutlass::MatrixCoord(Policy::LaneMmaShape::kM, + Policy::LaneMmaShape::kN); + return lane_offset + + tile_offset * cutlass::MatrixCoord(Shape::kRow, Shape::kColumn); + } +}; + +template +struct DefaultMmaAccumLambdaIterator; + +// Simt +template +struct DefaultMmaAccumLambdaIterator< + cutlass::gemm::warp::MmaSimtTileIterator< + S, + cutlass::gemm::Operand::kC, + accum_t, + cutlass::layout::RowMajor, + P, + 1, + 1>, + accum_t, + kWarpSize> { + using WarpIterator = typename cutlass::gemm::warp::MmaSimtTileIterator< + S, + cutlass::gemm::Operand::kC, + accum_t, + cutlass::layout::RowMajor, + P, + 1, + 1>; + using Iterator = AccumLambdaIteratorSimt; +}; + +// TensorOp - Volta +template +struct DefaultMmaAccumLambdaIterator< + cutlass::gemm::warp::MmaVoltaTensorOpAccumulatorTileIterator< + S1, + accum_t, + cutlass::layout::RowMajor, + S2, + cutlass::MatrixShape<1, 1>>, + accum_t, + kWarpSize> { + using WarpIterator = + typename cutlass::gemm::warp::MmaVoltaTensorOpAccumulatorTileIterator< + S1, + accum_t, + cutlass::layout::RowMajor, + S2, + cutlass::MatrixShape<1, 1>>; + using Iterator = AccumLambdaIteratorSm70; +}; + +// TensorOp - Sm75+ +template < + typename S1, + typename S2, + typename S3, + typename accum_t, + int kWarpSize> +struct DefaultMmaAccumLambdaIterator< + cutlass::gemm::warp::MmaTensorOpAccumulatorTileIterator< + S1, + accum_t, + cutlass::layout::RowMajor, + S2, + S3>, + accum_t, + kWarpSize> { + using WarpIterator = + typename cutlass::gemm::warp::MmaTensorOpAccumulatorTileIterator< + S1, + accum_t, + cutlass::layout::RowMajor, + S2, + S3>; + using Iterator = AccumLambdaIteratorSm80; +}; diff --git a/csrc/include/natten/cuda/fna/gemm/mma_from_smem.h b/csrc/include/natten/cuda/fna/gemm/mma_from_smem.h new file mode 100644 index 0000000..8502497 --- /dev/null +++ b/csrc/include/natten/cuda/fna/gemm/mma_from_smem.h @@ -0,0 +1,1966 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) and + * edited. + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Tools and utils to store a GEMM output in shmem, and to use that + output as operandA for another GEMM back-to-back +*/ + +#pragma once + +#include "cutlass/aligned_buffer.h" +#include "cutlass/arch/memory.h" +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/thread/linear_combination.h" +#include "cutlass/epilogue/threadblock/default_epilogue_simt.h" +#include "cutlass/epilogue/threadblock/default_epilogue_tensor_op.h" +#include "cutlass/epilogue/threadblock/default_epilogue_volta_tensor_op.h" +#include "cutlass/functional.h" +#include "cutlass/gemm/gemm.h" +#include "cutlass/gemm/warp/mma_tensor_op_fragment_iterator.h" +#include "cutlass/matrix_shape.h" +#include "cutlass/numeric_conversion.h" +#include "cutlass/numeric_types.h" +#include "cutlass/platform/platform.h" +#include "cutlass/transform/threadblock/vector_iterator.h" + +#include "../epilogue/epilogue_thread_apply_logsumexp.h" +#include "../gemm/mma_accum_lambda_iterator.h" +#include "../gemm_kernel_utils.h" +#include "../iterators/default_warp_iterator_from_smem.h" +#include "../iterators/make_residual_last.h" +#include "../iterators/transpose_warp_iterator.h" +#include "../iterators/warp_iterator_from_smem.h" +#include "cutlass/epilogue/threadblock/epilogue_smem_accumulator.h" +#include "cutlass/gemm/threadblock/mma_base.h" +#include "cutlass/gemm/threadblock/mma_multistage.h" +#include "cutlass/gemm/threadblock/mma_pipelined.h" +#include "cutlass/gemm/warp/mma_tensor_op_tile_access_iterator.h" + +namespace cutlass { +namespace gemm { +namespace threadblock { + +/// Shared storage object needed by accumulator +/// From 13_two_tensor_op_fusion/threadblock/b2b_mma_base_smem_accumulator.h +template < + typename Shape_, + typename Element_, + typename Layout_, + typename Padding_> +class AccumulatorSharedStorage { + public: + // + // Type definitions + // + using Shape = Shape_; + using Element = Element_; + using Layout = Layout_; + using Padding = Padding_; + + /// Tensor reference to the accumulator + using TensorRefAccum = cutlass::TensorRef; + + /// Shape of the accumulator matrix in shared memory + using ShapeAccum = cutlass:: + MatrixShape; + + public: + // + // Data members + // + + /// Buffer for accumulator + cutlass::AlignedBuffer accum; + + public: + // + // Methods + // + + /// Returns a layout object for the Accum matrix + CUTLASS_DEVICE + static Layout LayoutAccum() { + return Layout::packed({ShapeAccum::kRow, ShapeAccum::kColumn}); + } + + /// Returns a TensorRef to the Accumulator + CUTLASS_HOST_DEVICE + TensorRefAccum accum_ref() { + return TensorRefAccum{accum.data(), LayoutAccum()}; + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// Taken from +// https://github.com/NVIDIA/cutlass/blob/master/examples/13_two_tensor_op_fusion/threadblock/b2b_mma_base_smem_accumulator.h +//////////////////////////////////////////////////////////////////////////////// + +/// Structure to compute the matrix product targeting CUDA cores and SIMT math +/// instructions. +template < + /// Size of the Gemm problem - concept: gemm::GemmShape<> + typename Shape_, + // Maximum K dimension - also the dimension of the shared-memory + // holding `OperandA` + int kMaxK_, + /// Policy describing tuning details (concept: MmaPolicy) + typename Policy_, + /// Number of stages, + int Stages, + /// Layout in shared-memory of operand A + typename SmemLayoutA, + /// Used for partial specialization + typename Enable = bool> +class MmaBaseFromSharedMemory { + public: + ///< Size of the Gemm problem - concept: gemm::GemmShape<> + using Shape = Shape_; + static constexpr int kMaxK = kMaxK_; + + ///< Policy describing tuning details + using Policy = Policy_; + + // + // Dependent types + // + + /// Warp-level Mma + using Operator = typename Policy::Operator; + + /// Shape describing the overall GEMM computed from shared memory + /// by each warp. + using WarpGemm = typename Policy::Operator::Shape; + + /// Shape describing the number of warps filling the CTA + using WarpCount = GemmShape< + Shape::kM / WarpGemm::kM, + Shape::kN / WarpGemm::kN, + Shape::kK / WarpGemm::kK>; + using WarpCount1 = WarpCount; + + /// Number of warp-level GEMM oeprations + static int const kWarpGemmIterations = + (WarpGemm::kK / Operator::Policy::MmaShape::kK); + static int const kWarpGemmIterations1 = kWarpGemmIterations; + + /// Number of stages + static int const kStages = Stages; + + /// If this is true, we fill the entire shmem buffer at start + /// and don't need to iterate through it in a circular fashion + static bool const kSmemContainsEntireB = kMaxK <= Shape::kK * kStages; + + /// Tensor reference to the A operand + using TensorRefA = TensorRef; + + /// Tensor reference to the B operand + using TensorRefB = + TensorRef; + + // + // Nested structs + // + + /// Shared storage object needed by threadblock-scoped GEMM + class SharedStorage { + public: + // + // Type definitions + // + + /// Shape of the B matrix operand in shared memory + using ShapeB = MatrixShape< + Shape::kK * kStages + Policy::SmemPaddingB::kRow, + Shape::kN + Policy::SmemPaddingB::kColumn>; + + public: + // + // Data members + // + + /// Buffer for B operand + AlignedBuffer operand_B; + + public: + // + // Methods + // + + /// Returns a layout object for the B matrix + CUTLASS_HOST_DEVICE + static typename Operator::LayoutB LayoutB() { + return Operator::LayoutB::packed({ShapeB::kRow, ShapeB::kColumn}); + } + + /// Returns a TensorRef to the B operand + CUTLASS_HOST_DEVICE + TensorRefB operand_B_ref() { + return TensorRefB{operand_B.data(), LayoutB()}; + } + }; + + protected: + // + // Data members + // + + // /// Iterator to load a warp-scoped tile of A operand from shared memory + // typename Operator::IteratorA warp_tile_iterator_A_; + + /// Iterator to load a warp-scoped tile of B operand from shared memory + typename Operator::IteratorB warp_tile_iterator_B_; + + public: + /// Construct from tensor references + CUTLASS_DEVICE + MmaBaseFromSharedMemory( + ///< Shared storage needed for internal use by threadblock-scoped GEMM + TensorRefB& b_tile, + ///< ID within the threadblock + int thread_idx, + ///< ID of warp + int warp_idx, + ///< ID of each thread within a warp + int lane_idx) + : warp_tile_iterator_B_(b_tile, lane_idx) {} +}; + +namespace { + +// has necessary trait compliance with WarpIteratorFromSmem but doesn't do +// anything, can be default initialized, and uses fragment that takes up +// (almost) no space. this warp iterator is selected at compile time when +// elementwise on-the-fly scaling for operand A is disabled, in which case +// operations related to loading scale factors for operand A get wiped out by +// the compiler. +template +class NoOpWarpIteratorScale { + public: + // in pipelined+multistage MMA implementations we keep an array of fragments. + // if we aren't using scaling we don't want to waste registers on fragments + // of scale elements, so ideally this would be sized 0. + // Since arrays of zero-sized objects are not allowed, using size as 1. + // The compiler will most likely wipe it out anyways. + using Fragment = cutlass::Array; + + CUTLASS_HOST_DEVICE + NoOpWarpIteratorScale() {} + + CUTLASS_HOST_DEVICE + NoOpWarpIteratorScale(TensorRef const&, int) {} + + CUTLASS_HOST_DEVICE + NoOpWarpIteratorScale& add_tile_offset( + typename TensorRef::TensorCoord const&) { + return *this; + } + + CUTLASS_HOST_DEVICE + NoOpWarpIteratorScale& operator++() { + return *this; + } + + CUTLASS_DEVICE + void load(Fragment&) const {} +}; + +// if scaling is enabled, performs fragment elementwise multiplication between +// fragment and its scaling factor. +template +class FragmentElementwiseScaler; + +// specialization for scaling being enabled. +template +class FragmentElementwiseScaler { + public: + // cast scale_frag to correct type then apply elementwise to fragment + CUTLASS_DEVICE + static Fragment apply(Fragment frag, FragmentScale const& scale_frag) { + Fragment converted_scale_frag = cutlass::NumericArrayConverter< + typename Fragment::Element, + typename FragmentScale::Element, + FragmentScale::kElements>()(scale_frag); + return cutlass::multiplies()(frag, converted_scale_frag); + } +}; + +// specialization for scaling being disabled. doesn't do anything and should +// just get wiped out by the compiler. +template +class FragmentElementwiseScaler { + public: + CUTLASS_DEVICE + static Fragment apply(Fragment frag, FragmentScale const&) { + return frag; + } +}; +} // namespace + +//////////////////////////////////////////////////////////////////////////////// +// Taken from +// https://github.com/NVIDIA/cutlass/blob/master/examples/13_two_tensor_op_fusion/threadblock/b2b_mma_pipelined_smem_accumulator.h +//////////////////////////////////////////////////////////////////////////////// + +/// Structure to compute the matrix product targeting CUDA cores and SIMT math +/// instructions. +template < + /// Size of the Gemm problem - concept: gemm::GemmShape<> + typename Shape_, + // BEGIN smem + /// Iterates over the intermediate accumulator tile in shared memory + typename WarpIteratorA_, + /// whether or not to perform elementwise multiplication of A + // by another matrix (A_scale) that is also kept in shared memory prior + // to matmul A @ B + bool ScaleOperandA_, + /// Max GEMM problem size in K dimension + int MaxK, + /// Iterates over tiles of B operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorB_, + /// Iterates over tiles of B operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorB_, + /// Data type of accumulator matrix + typename ElementC_, + /// Data type of accumulator matrix + typename LayoutC_, + /// Policy describing tuning details (concept: MmaPolicy) + typename Policy_, + /// Transformation applied to B operand + typename TransformB_ = NumericArrayConverter< + typename SmemIteratorB_::Element, + typename IteratorB_::Element, + IteratorB_::Fragment::kElements>, + /// Used for partial specialization + typename Enable = bool> +class MmaPipelinedFromSharedMemory : public MmaBaseFromSharedMemory< + Shape_, + MaxK, + Policy_, + 2, + typename WarpIteratorA_::Layout> { + public: + ///< Base class + using Base = MmaBaseFromSharedMemory< + Shape_, + MaxK, + Policy_, + 2, + typename WarpIteratorA_::Layout>; + + using Shape = + Shape_; ///< Size of the Gemm problem - concept: gemm::GemmShape<> + static constexpr bool ScaleOperandA = ScaleOperandA_; + + using WarpIteratorA = WarpIteratorA_; + ///< loads fragments of A_scale from shared memory if operand A scaling is + ///< enabled. otherwise no-op. + using WarpIteratorAScale = typename cutlass::platform::conditional< + ScaleOperandA, + WarpIteratorA, + NoOpWarpIteratorScale>::type; + + using IteratorB = + IteratorB_; ///< Iterates over tiles of B operand in global memory + using ElementC = ElementC_; ///< Data type of accumulator matrix + using LayoutC = LayoutC_; ///< Layout of accumulator matrix + using Policy = Policy_; ///< Policy describing tuning details + + using SmemIteratorB = SmemIteratorB_; + + using TransformB = TransformB_; + + // + // Dependent types + // + + /// Fragment of operand B loaded from global memory + using FragmentB = typename IteratorB::Fragment; + + /// Fragment of accumulator tile + using FragmentC = typename Policy::Operator::FragmentC; + + /// Warp-level Mma + using Operator = typename Policy::Operator; + + /// Obtain the arch tag from the warp-level operator + using ArchTag = typename Policy::Operator::ArchTag; + + /// Complex transform on B operand + static ComplexTransform const kTransformB = Operator::kTransformB; + + // staticaly assert kStages for MmaPipelined is two (Double-buffered pipeline) + static_assert( + (Base::kStages == 2), + "MmaPipelined requires kStages set to value 2"); + + private: + using WarpFragmentA = typename Operator::FragmentA; + + /// fragment type of OperandA elementwise scaling matrix. (almost) empty + /// if operand A scaling is disabled. + using WarpFragmentAScale = typename WarpIteratorAScale::Fragment; + + using WarpFragmentB = typename Operator::FragmentB; + + /// applies scaling factor to operand A fragment if operand A scaling is + /// enabled. otherwise no-op. + using FragmentAScaler = FragmentElementwiseScaler< + WarpFragmentA, + WarpFragmentAScale, + ScaleOperandA>; + + protected: + // /// Iterator to write threadblock-scoped tile of A operand to shared memory + // SmemIteratorA smem_iterator_A_; + + /// Iterator to write threadblock-scoped tile of B operand to shared memory + SmemIteratorB smem_iterator_B_; + + /// Iterator to load a warp-scoped tile of A operand from intermediate + /// accumulator tile + WarpIteratorA warp_tile_iterator_A_; + + /// Iterator to load a warp-scoped tile of A_scale from intermediate + /// accumulator tile (only used if ScaleOperandA_ is true) + WarpIteratorAScale warp_tile_iterator_A_scale_; + + public: + /// constructor for MMA with operand A scaling enabled. + CUTLASS_DEVICE + MmaPipelinedFromSharedMemory( + typename Base::TensorRefA a, // Operand A in shared memory + typename Base::TensorRefA a_scale, // Operand A_scale in shared memory + typename Base::TensorRefB + b_staging, // staging memory for loading tiles of B + int thread_idx, + int warp_idx, + int lane_idx) + : Base(b_staging, thread_idx, warp_idx, lane_idx), + warp_tile_iterator_A_(a, lane_idx), + warp_tile_iterator_A_scale_(a_scale, lane_idx), + smem_iterator_B_(b_staging, thread_idx) { + // Compute warp location within threadblock tile by mapping the warp_id to + // three coordinates: + // _m: the warp's position within the threadblock along the M dimension + // _n: the warp's position within the threadblock along the N dimension + // _k: the warp's position within the threadblock along the K dimension + int warp_idx_mn = warp_idx % (Base::WarpCount::kM * Base::WarpCount::kN); + int warp_idx_k = warp_idx / (Base::WarpCount::kM * Base::WarpCount::kN); + int warp_idx_m = warp_idx_mn % Base::WarpCount::kM; + int warp_idx_n = warp_idx_mn / Base::WarpCount::kM; + + // Add per-warp offsets in units of warp-level tiles + this->warp_tile_iterator_A_.add_tile_offset( + {warp_idx_m, Base::kWarpGemmIterations * warp_idx_k}); + this->warp_tile_iterator_A_scale_.add_tile_offset( + {warp_idx_m, Base::kWarpGemmIterations * warp_idx_k}); + this->warp_tile_iterator_B_.add_tile_offset( + {Base::kWarpGemmIterations * warp_idx_k, warp_idx_n}); + } + + /// Construct from tensor references + CUTLASS_DEVICE + MmaPipelinedFromSharedMemory( + typename Base::TensorRefA a, ///< Operand A in shared memory + typename Base::TensorRefB b_staging, ///< staging memory for loading B + int thread_idx, ///< ID within the threadblock + int warp_idx, ///< ID of warp + int lane_idx) ///< ID of each thread within a warp + : Base(b_staging, thread_idx, warp_idx, lane_idx), + warp_tile_iterator_A_(a, lane_idx), + smem_iterator_B_(b_staging, thread_idx) { + // Compute warp location within threadblock tile by mapping the warp_id to + // three coordinates: + // _m: the warp's position within the threadblock along the M dimension + // _n: the warp's position within the threadblock along the N dimension + // _k: the warp's position within the threadblock along the K dimension + + int warp_idx_mn = warp_idx % (Base::WarpCount::kM * Base::WarpCount::kN); + int warp_idx_k = warp_idx / (Base::WarpCount::kM * Base::WarpCount::kN); + + int warp_idx_m = warp_idx_mn % Base::WarpCount::kM; + int warp_idx_n = warp_idx_mn / Base::WarpCount::kM; + + // Add per-warp offsets in units of warp-level tiles + this->warp_tile_iterator_A_.add_tile_offset( + {warp_idx_m, Base::kWarpGemmIterations * warp_idx_k}); + this->warp_tile_iterator_B_.add_tile_offset( + {Base::kWarpGemmIterations * warp_idx_k, warp_idx_n}); + } + + // For API compatibility with MmaMultistageFromSharedMemory + // but not supported as it worsens perf: older gpus < sm80 don't + // support async tranfers and have to waste registers + CUTLASS_DEVICE + void set_prologue_done(bool value) {} + CUTLASS_DEVICE + static void prologue( + typename Base::SharedStorage& shared_storage, + IteratorB iterator_B1, + int thread_idx, + int problem_size_0_n) {} + + CUTLASS_DEVICE + static void drain_cp_asyncs() {} + + /// Perform a threadblock-scoped matrix multiply-accumulate + CUTLASS_DEVICE + void operator()( + int gemm_k_iterations, ///< number of iterations of the mainloop + FragmentC& accum, ///< destination accumulator tile + // IteratorA iterator_A, ///< iterator over A + // operand in global memory + IteratorB iterator_B, ///< iterator over B operand in global memory + FragmentC const& src_accum, ///< source accumulator tile + // TransformA transform_A = TransformA(), ///< transformation + // applied to A fragment + TransformB transform_B = + TransformB()) { ///< transformation applied to B fragment + + // + // Prologue + // + + // Perform accumulation in the 'd' output operand + accum = src_accum; + + FragmentB tb_frag_B; + + tb_frag_B.clear(); + + // The last kblock is loaded in the prolog + iterator_B.set_residual_tile(gemm_k_iterations == 1); + iterator_B.load(tb_frag_B); + + ++iterator_B; + + this->smem_iterator_B_.store(transform_B(tb_frag_B)); + + ++this->smem_iterator_B_; + + __syncthreads(); + + // remember that WarpFragmentAScale and WarpIteratorAScale are empty/no-op + // if scaling is disabled. + + // Pair of fragments used to overlap shared memory loads and math + // instructions + WarpFragmentA warp_frag_A[2]; + WarpFragmentAScale warp_frag_A_scale[2]; + WarpFragmentB warp_frag_B[2]; + warp_frag_A[0].clear(); + warp_frag_A_scale[0].clear(); + warp_frag_B[0].clear(); + + this->warp_tile_iterator_B_.set_kgroup_index(0); + + this->warp_tile_iterator_A_.load(warp_frag_A[0]); + this->warp_tile_iterator_A_scale_.load(warp_frag_A_scale[0]); + this->warp_tile_iterator_B_.load(warp_frag_B[0]); + + ++this->warp_tile_iterator_A_; + ++this->warp_tile_iterator_A_scale_; + ++this->warp_tile_iterator_B_; + + Operator warp_mma; + + int smem_write_stage_idx = 1; + + // Avoid reading out of bounds + iterator_B.set_residual_tile(gemm_k_iterations == 2); + iterator_B.clear_mask(gemm_k_iterations <= 1); + + // Issue loads during the first warp-level matrix multiply-add *AFTER* + // issuing shared memory loads (which have the tightest latency + // requirement). + + // + // Mainloop + // + + // Note: The main loop does not support Base::kWarpGemmIterations == 2. + CUTLASS_GEMM_LOOP + for (; gemm_k_iterations > 0; --gemm_k_iterations) { + // + // Loop over GEMM K dimension + // + + CUTLASS_PRAGMA_UNROLL + for (int warp_mma_k = 0; warp_mma_k < Base::kWarpGemmIterations; + ++warp_mma_k) { + // Load warp-level tiles from shared memory, wrapping to k offset if + // this is the last group as the case may be. + bool hasNext = true; + + if (warp_mma_k == Base::kWarpGemmIterations - 1) { + if (gemm_k_iterations > 1) { + // Write fragments to shared memory + this->smem_iterator_B_.store(transform_B(tb_frag_B)); + } + + __syncthreads(); + + ++this->smem_iterator_B_; + + // Add negative offsets to return iterators to the 'start' of the + // circular buffer in shared memory SMEM: Don't reset iterator A, as + // we are continuing our iteration at this point + if (smem_write_stage_idx == 1) { + this->smem_iterator_B_.add_tile_offset({-Base::kStages, 0}); + } else { + this->warp_tile_iterator_B_.add_tile_offset( + {-Base::kStages * Policy::kPartitionsK * + Base::kWarpGemmIterations, + 0}); + } + + smem_write_stage_idx ^= 1; + hasNext = gemm_k_iterations > 1; + } + + // Only read the next if we need to + if (hasNext) { + this->warp_tile_iterator_B_.set_kgroup_index( + (warp_mma_k + 1) % Base::kWarpGemmIterations); + + this->warp_tile_iterator_A_.load(warp_frag_A[(warp_mma_k + 1) % 2]); + this->warp_tile_iterator_A_scale_.load( + warp_frag_A_scale[(warp_mma_k + 1) % 2]); + this->warp_tile_iterator_B_.load(warp_frag_B[(warp_mma_k + 1) % 2]); + + ++this->warp_tile_iterator_A_; + ++this->warp_tile_iterator_A_scale_; + ++this->warp_tile_iterator_B_; + + if (warp_mma_k == 0) { + iterator_B.load(tb_frag_B); + + ++iterator_B; + + // Avoid reading out of bounds if this was the last loop iteration + iterator_B.set_residual_tile(gemm_k_iterations == 3); + iterator_B.clear_mask(gemm_k_iterations <= 2); + } + } + + warp_mma( + accum, + FragmentAScaler::apply( + warp_frag_A[warp_mma_k % 2], warp_frag_A_scale[warp_mma_k % 2]), + warp_frag_B[warp_mma_k % 2], + accum); + } + } + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// Taken from +// https://github.com/NVIDIA/cutlass/blob/master/examples/13_two_tensor_op_fusion/threadblock/b2b_mma_multistage_smem_accumulator.h +//////////////////////////////////////////////////////////////////////////////// + +/// Structure to compute the matrix product targeting CUDA cores and SIMT math +/// instructions. +template < + /// Size of the Gemm problem - concept: gemm::GemmShape<> + typename Shape1_, + /// Iterates over the intermediate accumulator tile in shared memory + typename WarpIteratorA1_, + /// whether or not to perform elementwise multiplication of A + // by another matrix (A_scale) that is also kept in shared memory prior + // to matmul A @ B + bool ScaleOperandA_, + /// Iterates over tiles of B operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorB1_, + /// Iterates over tiles of B operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorB1_, + /// Cache operation for operand B + cutlass::arch::CacheOperation::Kind CacheOpB1, + /// Data type of accumulator matrix + typename ElementC_, + /// Data type of accumulator matrix + typename LayoutC_, + /// Policy describing tuning details (concept: MmaPolicy) + typename Policy1_, + /// Number of stages, + int Stages_, + int kMaxK_, + /// Used for partial specialization + typename Enable = bool> +class MmaMultistageFromSharedMemory : public MmaBaseFromSharedMemory< + Shape1_, + kMaxK_, + Policy1_, + Stages_, + typename WarpIteratorA1_::Layout> { + public: + ///< Base class + using Base = MmaBaseFromSharedMemory< + Shape1_, + kMaxK_, + Policy1_, + Stages_, + typename WarpIteratorA1_::Layout>; + + ///< Size of the Gemm problem - concept: gemm::GemmShape<> + using Shape1 = Shape1_; + ///< Iterates over tiles of B operand in global memory + using IteratorB1 = IteratorB1_; + using IteratorB = IteratorB1; + ///< Policy describing tuning details + using Policy1 = Policy1_; + + using SmemIteratorB1 = SmemIteratorB1_; + using WarpIteratorA1 = WarpIteratorA1_; ///< Iterates over the intermediate + ///< accumulator tile in shared memory + static constexpr bool ScaleOperandA = ScaleOperandA_; + + ///< warp level iterator over A_scale matrix tile kept in shared memory. + ///< if elementwise A scaling is disabled then everything this does is no-op. + using WarpIteratorAScale = typename cutlass::platform::conditional< + ScaleOperandA, + WarpIteratorA1, + NoOpWarpIteratorScale>::type; + ///< Data type of accumulator matrix + using ElementC = ElementC_; + ///< Layout of accumulator matrix + using LayoutC = LayoutC_; + + static cutlass::arch::CacheOperation::Kind const kCacheOpB1 = CacheOpB1; + static constexpr bool kSmemContainsEntireB = Base::kSmemContainsEntireB; + + // + // Dependent types + // + + /// Fragment of accumulator tile + using FragmentC1 = typename Policy1::Operator::FragmentC; + using FragmentC = FragmentC1; + + /// Warp-level Mma + using Operator1 = typename Policy1::Operator; + + /// Minimum architecture is Sm80 to support cp.async + using ArchTag = arch::Sm80; + + /// Complex transform on B operand + static ComplexTransform const kTransformB1 = Operator1::kTransformB; + + /// Internal structure exposed for introspection. + struct Detail { + static_assert( + Base::kWarpGemmIterations1 > 1, + "The pipelined structure requires at least two warp-level " + "GEMM operations."); + + /// Number of cp.async instructions to load one stage of operand B + static int const TBLoadIterationsB1 = + IteratorB1::ThreadMap::Iterations::kCount; + + /// Number of cp.async instructions to load on group of operand B + static int const kAccessesPerGroupB1 = + (TBLoadIterationsB1 + Base::kWarpGemmIterations1 - 1) / + Base::kWarpGemmIterations1; + }; + + static constexpr int kNumStagesConcurrentLoad = + kSmemContainsEntireB ? Base::kStages : Base::kStages - 1; + + private: + using WarpLoadedFragmentA1 = typename Operator1::FragmentA; + /// fragment of OperandA scale matrix. if operand A scaling is disabled this + /// is (almost) empty. + using WarpLoadedFragmentA1Scale = typename WarpIteratorAScale::Fragment; + using WarpLoadedFragmentB1 = typename Operator1::FragmentB; + using WarpTransformedFragmentA1 = typename Operator1::TransformedFragmentA; + using WarpTransformedFragmentB1 = typename Operator1::TransformedFragmentB; + + /// applies elementwise scaling to fragment of A. if operand A scaling is + /// disabled this is a no-op. + using FragmentAScaler = FragmentElementwiseScaler< + WarpLoadedFragmentA1, + WarpLoadedFragmentA1Scale, + ScaleOperandA>; + + private: + // + // Data members + // + + /// Iterator to load a warp-scoped tile of A1 operand from intermediate + /// accumulator tile + WarpIteratorA1 warp_tile_iterator_A1_; + + /// Iterator to load a warp-scoped tile of A1_scale operand from shared memory + /// if operand A scaling is disabled everything this does is a no-op. + WarpIteratorAScale warp_tile_iterator_A1_scale_; + + /// Iterator to write threadblock-scoped tile of B operand to shared memory + SmemIteratorB1 smem_iterator_B1_; + + bool prologue_done_; + + public: + /// constructor for MMA with operand A scaling enabled. + CUTLASS_DEVICE + MmaMultistageFromSharedMemory( + typename Base::TensorRefA a, + typename Base::TensorRefA a_scale, + typename Base::TensorRefB b_tile, + int thread_idx, + int warp_idx, + int lane_idx) + : Base(b_tile, thread_idx, warp_idx, lane_idx), + warp_tile_iterator_A1_(a, lane_idx), + warp_tile_iterator_A1_scale_(a_scale, lane_idx), + smem_iterator_B1_(b_tile, thread_idx), + prologue_done_(false) { + // Compute warp location within threadblock tile by mapping the warp_id to + // three coordinates: + // _m: the warp's position within the threadblock along the M dimension + // _n: the warp's position within the threadblock along the N dimension + // _k: the warp's position within the threadblock along the K dimension + int warp_idx_mn_1 = + warp_idx % (Base::WarpCount1::kM * Base::WarpCount1::kN); + int warp_idx_k_1 = warp_idx / (Base::WarpCount1::kM * Base::WarpCount1::kN); + int warp_idx_m_1 = warp_idx_mn_1 % Base::WarpCount1::kM; + int warp_idx_n_1 = warp_idx_mn_1 / Base::WarpCount1::kM; + + // Add per-warp offsets in units of warp-level tiles + warp_tile_iterator_A1_.add_tile_offset( + {warp_idx_m_1, Base::kWarpGemmIterations1 * warp_idx_k_1}); + warp_tile_iterator_A1_scale_.add_tile_offset( + {warp_idx_m_1, Base::kWarpGemmIterations1 * warp_idx_k_1}); + this->warp_tile_iterator_B_.add_tile_offset( + {Base::kWarpGemmIterations1 * warp_idx_k_1, warp_idx_n_1}); + } + + /// Construct from tensor references + CUTLASS_DEVICE + MmaMultistageFromSharedMemory( + typename Base::TensorRefA a, + typename Base::TensorRefB b_tile, + ///< ID within the threadblock + int thread_idx, + ///< ID of warp + int warp_idx, + ///< ID of each thread within a warp + int lane_idx) + : Base(b_tile, thread_idx, warp_idx, lane_idx), + warp_tile_iterator_A1_(a, lane_idx), + smem_iterator_B1_(b_tile, thread_idx), + prologue_done_(false) { + // Compute warp location within threadblock tile by mapping the warp_id to + // three coordinates: + // _m: the warp's position within the threadblock along the M dimension + // _n: the warp's position within the threadblock along the N dimension + // _k: the warp's position within the threadblock along the K dimension + + int warp_idx_mn_1 = + warp_idx % (Base::WarpCount1::kM * Base::WarpCount1::kN); + int warp_idx_k_1 = warp_idx / (Base::WarpCount1::kM * Base::WarpCount1::kN); + + int warp_idx_m_1 = warp_idx_mn_1 % Base::WarpCount1::kM; + int warp_idx_n_1 = warp_idx_mn_1 / Base::WarpCount1::kM; + + // Add per-warp offsets in units of warp-level tiles + warp_tile_iterator_A1_.add_tile_offset( + {warp_idx_m_1, Base::kWarpGemmIterations1 * warp_idx_k_1}); + this->warp_tile_iterator_B_.add_tile_offset( + {Base::kWarpGemmIterations1 * warp_idx_k_1, warp_idx_n_1}); + } + + CUTLASS_DEVICE + void set_prologue_done(bool value) { + prologue_done_ = value; + } + + CUTLASS_DEVICE + static void prologue( + typename Base::SharedStorage& shared_storage, + IteratorB iterator_B1, + int thread_idx, + int problem_size_0_n) { + SmemIteratorB1 smem_iterator_B1(shared_storage.operand_B_ref(), thread_idx); + _prologue( + iterator_B1, + (problem_size_0_n + Base::Shape::kK - 1) / Base::Shape::kK, + smem_iterator_B1); + } + + CUTLASS_DEVICE + static void drain_cp_asyncs() { + // commit and drain all pending and predicated cp.async pnz from the GEMM + // mainloop + cutlass::arch::cp_async_fence(); + cutlass::arch::cp_async_wait<0>(); + __syncthreads(); + } + + CUTLASS_DEVICE + void copy_tiles_and_advance_1( + IteratorB1& iterator_B1, + int group_start_B1 = 0) { + iterator_B1.set_iteration_index( + group_start_B1 * IteratorB1::kAccessesPerVector); + this->smem_iterator_B1_.set_iteration_index(group_start_B1); + + // Load for operand B + CUTLASS_PRAGMA_UNROLL + for (int j = 0; j < Detail::kAccessesPerGroupB1; ++j) { + if (group_start_B1 + j < Detail::TBLoadIterationsB1) { + typename IteratorB1::AccessType* dst_ptr = + reinterpret_cast( + this->smem_iterator_B1_.get()); + + int const kSrcBytes = sizeof_bits::value * + IteratorB1::ThreadMap::kElementsPerAccess / + IteratorB1::kAccessesPerVector / 8; + + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < IteratorB1::kAccessesPerVector; ++v) { + auto gmem_ptr = iterator_B1.get(); + + cutlass::arch::cp_async_zfill( + dst_ptr + v, gmem_ptr, iterator_B1.valid()); + + ++iterator_B1; + } + ++this->smem_iterator_B1_; + } + } + } + + CUTLASS_DEVICE + static void _prologue( + IteratorB& iterator_B1, + int32_t gemm_k_iterations_1, + SmemIteratorB1& smem_iterator_B1_) { + // Issue several complete stages + CUTLASS_PRAGMA_UNROLL + for (int stage = 0; stage < kNumStagesConcurrentLoad; + ++stage, --gemm_k_iterations_1) { + iterator_B1.set_residual_tile(gemm_k_iterations_1 == 1); + iterator_B1.clear_mask(gemm_k_iterations_1 == 0); + + iterator_B1.set_iteration_index(0); + smem_iterator_B1_.set_iteration_index(0); + + // Load for operand B + CUTLASS_PRAGMA_UNROLL + for (int j = 0; j < Detail::TBLoadIterationsB1; ++j) { + typename IteratorB1::AccessType* dst_ptr = + reinterpret_cast( + smem_iterator_B1_.get()); + + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < IteratorB1::kAccessesPerVector; ++v) { + int const kSrcBytes = + sizeof_bits::value * + IteratorB1::ThreadMap::kElementsPerAccess / + IteratorB1::kAccessesPerVector / 8; + + cutlass::arch::cp_async_zfill( + dst_ptr + v, iterator_B1.get(), iterator_B1.valid()); + + ++iterator_B1; + } + + ++smem_iterator_B1_; + } + + // Move to the next stage + iterator_B1.add_tile_offset({1, 0}); + + smem_iterator_B1_.add_tile_offset({1, 0}); + + // Defines the boundary of a stage of cp.async. + cutlass::arch::cp_async_fence(); + } + iterator_B1.set_residual_tile(gemm_k_iterations_1 == 1); + iterator_B1.clear_mask(gemm_k_iterations_1 == 0); + } + + /// Perform a threadblock-scoped matrix multiply-accumulate + CUTLASS_DEVICE + void operator()( + ///< problem size of GEMM + int gemm_k_iterations_1_, + ///< destination accumulator tile + FragmentC1& accum, + ///< iterator over B1 operand in global memory + IteratorB1 iterator_B1, + ///< initial value of accumulator + FragmentC1 const& src_accum) { + // 2nd Gemm + + // + // Prologue + // + // Perform accumulation in the 'd' output operand + accum = src_accum; + + if (!prologue_done_) { + _prologue(iterator_B1, gemm_k_iterations_1_, smem_iterator_B1_); + } else if (!kSmemContainsEntireB) { + // Restore the iterators increments + + int gemm_k_iterations_1 = gemm_k_iterations_1_; + // Issue several complete stages + CUTLASS_PRAGMA_UNROLL + for (int stage = 0; stage < kNumStagesConcurrentLoad; + ++stage, --gemm_k_iterations_1) { + iterator_B1.set_iteration_index(0); + this->smem_iterator_B1_.set_iteration_index(0); + + // Load for operand B + CUTLASS_PRAGMA_UNROLL + for (int j = 0; j < Detail::TBLoadIterationsB1; ++j) { + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < IteratorB1::kAccessesPerVector; ++v) { + ++iterator_B1; + } + ++this->smem_iterator_B1_; + } + iterator_B1.add_tile_offset({1, 0}); + this->smem_iterator_B1_.add_tile_offset({1, 0}); + } + iterator_B1.set_residual_tile(gemm_k_iterations_1 <= 1); + iterator_B1.clear_mask(gemm_k_iterations_1 <= 0); + } + + // DEPBAR+SYNC + cutlass::arch::cp_async_wait(); + __syncthreads(); + + // remember that WarpFragmentAScale and WarpIteratorAScale are no-op/empty + // if scaling is disabled. + + // Pair of fragments used to overlap shared memory loads and math + // instructions + WarpLoadedFragmentA1 warp_loaded_frag_A1[2]; + WarpLoadedFragmentA1Scale warp_loaded_frag_A1_scale[2]; + WarpLoadedFragmentB1 warp_loaded_frag_B1[2]; + WarpTransformedFragmentA1 warp_transformed_frag_A1[2]; + WarpTransformedFragmentB1 warp_transformed_frag_B1[2]; + + Operator1 warp_mma1; + + warp_tile_iterator_A1_.load(warp_loaded_frag_A1[0]); + ++warp_tile_iterator_A1_; + + warp_tile_iterator_A1_scale_.load(warp_loaded_frag_A1_scale[0]); + ++warp_tile_iterator_A1_scale_; + + this->warp_tile_iterator_B_.set_kgroup_index(0); + this->warp_tile_iterator_B_.load(warp_loaded_frag_B1[0]); + ++this->warp_tile_iterator_B_; + + int smem_write_stage_idx = Base::kStages - 1; + int smem_read_stage_idx = 0; + + warp_mma1.transform( + warp_transformed_frag_A1[0], + warp_transformed_frag_B1[0], + FragmentAScaler::apply( + warp_loaded_frag_A1[0], warp_loaded_frag_A1_scale[0]), + warp_loaded_frag_B1[0]); + + // tf32x3 kernels use staging accumulation. warp_mma uses a temporary + // accumulator and this temporary accumulator is added to the final + // accumulator once in every mainloop iteration. + plus plus_accum; + + FragmentC1 tmp_accum; + + if (platform::is_same< + typename Operator1::MathOperator, + arch::OpMultiplyAddFastF32>::value || + platform::is_same< + typename Operator1::MathOperator, + arch::OpMultiplyAddComplexFastF32>::value) { + tmp_accum.clear(); + } + + // + // Mainloop + // + + CUTLASS_PRAGMA_UNROLL + for (int gemm_k_iterations_1 = gemm_k_iterations_1_ - (Base::kStages - 1); + gemm_k_iterations_1 > (-Base::kStages + 1); + gemm_k_iterations_1--) { + // + // Loop over GEMM K dimension + // + + // Computes a warp-level GEMM on data held in shared memory + // Each "warp_mma_k" refers to a warp-level matrix multiply-accumulate + CUTLASS_PRAGMA_UNROLL + for (int warp_mma_k = 0; warp_mma_k < Base::kWarpGemmIterations1; + ++warp_mma_k) { + // Load warp-level tile from accumulator fragment (A) + // or shared memory (operand B) + this->warp_tile_iterator_B_.set_kgroup_index( + (warp_mma_k + 1) % Base::kWarpGemmIterations1); + // skip warp tile loading for the last kgroup (we are out of the buf) + if (gemm_k_iterations_1 > (-Base::kStages + 2) || + warp_mma_k < Base::kWarpGemmIterations1 - 1) { + warp_tile_iterator_A1_.load( + warp_loaded_frag_A1[(warp_mma_k + 1) % 2]); + warp_tile_iterator_A1_scale_.load( + warp_loaded_frag_A1_scale[(warp_mma_k + 1) % 2]); + this->warp_tile_iterator_B_.load( + warp_loaded_frag_B1[(warp_mma_k + 1) % 2]); + } + ++warp_tile_iterator_A1_; + ++warp_tile_iterator_A1_scale_; + ++this->warp_tile_iterator_B_; + + if (warp_mma_k > 0) + warp_mma1.transform( + warp_transformed_frag_A1[warp_mma_k % 2], + warp_transformed_frag_B1[warp_mma_k % 2], + FragmentAScaler::apply( + warp_loaded_frag_A1[warp_mma_k % 2], + warp_loaded_frag_A1_scale[warp_mma_k % 2]), + warp_loaded_frag_B1[warp_mma_k % 2]); + + if (platform::is_same< + typename Operator1::MathOperator, + arch::OpMultiplyAddFastF32>::value || + platform::is_same< + typename Operator1::MathOperator, + arch::OpMultiplyAddComplexFastF32>::value) { + warp_mma1( + tmp_accum, + warp_transformed_frag_A1[warp_mma_k % 2], + warp_transformed_frag_B1[warp_mma_k % 2], + tmp_accum); + + if (warp_mma_k == 0) { + accum = plus_accum(accum, tmp_accum); + tmp_accum.clear(); + } + } else { + warp_mma1( + accum, + warp_transformed_frag_A1[warp_mma_k % 2], + warp_transformed_frag_B1[warp_mma_k % 2], + accum); + } + + // Issue global->shared copies for the this stage + if (warp_mma_k < Base::kWarpGemmIterations1 - 1) { + int group_start_iteration_B1; + + group_start_iteration_B1 = warp_mma_k * Detail::kAccessesPerGroupB1; + + if (!kSmemContainsEntireB) { + copy_tiles_and_advance_1(iterator_B1, group_start_iteration_B1); + } + } + + if (warp_mma_k + 2 == Base::kWarpGemmIterations1) { + int group_start_iteration_B1; + group_start_iteration_B1 = + (warp_mma_k + 1) * Detail::kAccessesPerGroupB1; + + if (!kSmemContainsEntireB) { + copy_tiles_and_advance_1(iterator_B1, group_start_iteration_B1); + } + + // Inserts a memory fence between stages of cp.async instructions. + cutlass::arch::cp_async_fence(); + + // Waits until kStages-2 stages have committed. + arch::cp_async_wait(); + __syncthreads(); + + // Move to the next stage + iterator_B1.add_tile_offset({1, 0}); + + this->smem_iterator_B1_.add_tile_offset({1, 0}); + + // Add negative offsets to return iterators to the 'start' of the + // circular buffer in shared memory + if (!kSmemContainsEntireB) { + if (smem_write_stage_idx == (Base::kStages - 1)) { + this->smem_iterator_B1_.add_tile_offset({-Base::kStages, 0}); + smem_write_stage_idx = 0; + } else { + ++smem_write_stage_idx; + } + + if (smem_read_stage_idx == (Base::kStages - 1)) { + this->warp_tile_iterator_B_.add_tile_offset( + {-Base::kStages * Policy1::kPartitionsK * + Base::kWarpGemmIterations1, + 0}); + smem_read_stage_idx = 0; + } else { + ++smem_read_stage_idx; + } + } + + iterator_B1.set_residual_tile(gemm_k_iterations_1 == 2); + iterator_B1.clear_mask(gemm_k_iterations_1 == 1); + } + + // Do any conversions feeding the first stage at the end of the loop so + // we can start right away on mma instructions + if (warp_mma_k + 1 == Base::kWarpGemmIterations1) + warp_mma1.transform( + warp_transformed_frag_A1[(warp_mma_k + 1) % 2], + warp_transformed_frag_B1[(warp_mma_k + 1) % 2], + FragmentAScaler::apply( + warp_loaded_frag_A1[(warp_mma_k + 1) % 2], + warp_loaded_frag_A1_scale[(warp_mma_k + 1) % 2]), + warp_loaded_frag_B1[(warp_mma_k + 1) % 2]); + } + } + + if (platform::is_same< + typename Operator1::MathOperator, + arch::OpMultiplyAddFastF32>::value || + platform::is_same< + typename Operator1::MathOperator, + arch::OpMultiplyAddComplexFastF32>::value) { + accum = plus_accum(accum, tmp_accum); + } + } +}; + +// Converts a "regular" Mma into their counterpart from shared memory +template < + int NADim, + typename Mma_, + int kMaxK, + typename WarpIteratorA_, + /// whether or not to apply elementwise multiplication of operand A by + /// another matrix in shared memory before usage in A @ B + bool kScaleOperandA, + bool kTransposeA = false> +struct DefaultMmaFromSharedMemory; + +// Mma pipelined +template < + int NADim, + /// Size of the Gemm problem - concept: gemm::GemmShape<> + typename Shape_, + /// Iterates over tiles of A operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorA_, + /// Iterates over tiles of A operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorA_, + typename WarpIteratorA_, + /// Iterates over tiles of B operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorB_, + /// Iterates over tiles of B operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorB_, + /// Data type of accumulator matrix + typename ElementC_, + /// Data type of accumulator matrix + typename LayoutC_, + /// Policy describing tuning details (concept: MmaPolicy) + typename Policy_, + /// Transformation applied to A operand + typename TransformA_, + /// Transformation applied to B operand + typename TransformB_, + // Max MMA problem size K + int kMaxK, + /// whether or not to apply elementwise multiplication of operand A by + /// another matrix in shared memory before usage in A @ B + bool kScaleOperandA, + bool kTransposeA> +struct DefaultMmaFromSharedMemory< + NADim, + MmaPipelined< + Shape_, + IteratorA_, + SmemIteratorA_, + IteratorB_, + SmemIteratorB_, + ElementC_, + LayoutC_, + Policy_, + TransformA_, + TransformB_>, + kMaxK, + WarpIteratorA_, + kScaleOperandA, + kTransposeA> { + using RegularMma = MmaPipelined< + Shape_, + IteratorA_, + SmemIteratorA_, + IteratorB_, + SmemIteratorB_, + ElementC_, + LayoutC_, + Policy_, + TransformA_, + TransformB_>; + + using WarpShape = typename Policy_::Operator::Shape; + using InstructionShape = typename Policy_::Operator::InstructionShape; + using ArchMmaOperator = typename Policy_::Operator; + + static constexpr bool kIsTransposedA = false; + using WarpIteratorA = WarpIteratorA_; + using IteratorB = typename cutlass::transform::threadblock:: + MakeIteratorResidualLast::Iterator; + + using Mma = typename cutlass::gemm::threadblock::MmaPipelinedFromSharedMemory< + Shape_, + WarpIteratorA, + kScaleOperandA, + kMaxK, + IteratorB, + SmemIteratorB_, + ElementC_, + LayoutC_, + Policy_>; +}; + +template < + int NADim, + /// Size of the Gemm problem - concept: gemm::GemmShape<> + typename Shape_, + /// Iterates over tiles of A operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorA_, + /// Iterates over tiles of A operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorA_, + typename WarpIteratorA_, + /// Cache operation for operand A + cutlass::arch::CacheOperation::Kind CacheOpA, + /// Iterates over tiles of B operand in global memory + // (concept: ReadableTileIterator | ForwardTileIterator | + // MaskedTileIterator) + typename IteratorB_, + /// Iterates over tiles of B operand in shared memory + /// (concept: WriteableTileIterator | RandomAccessTileIterator) + typename SmemIteratorB_, + /// Cache operation for operand B + cutlass::arch::CacheOperation::Kind CacheOpB, + /// Data type of accumulator matrix + typename ElementC_, + /// Data type of accumulator matrix + typename LayoutC_, + /// Policy describing tuning details (concept: MmaPolicy) + typename Policy_, + /// Number of stages, + int Stages, + /// Use zfill or predicate for out-of-bound cp.async + SharedMemoryClearOption SharedMemoryClear, + int kMaxK, + /// whether or not to apply elementwise multiplication of operand A by + /// another matrix in shared memory before usage in A @ B + bool kScaleOperandA, + bool kTransposeA> +struct DefaultMmaFromSharedMemory< + NADim, + MmaMultistage< + Shape_, + IteratorA_, + SmemIteratorA_, + CacheOpA, + IteratorB_, + SmemIteratorB_, + CacheOpB, + ElementC_, + LayoutC_, + Policy_, + Stages, + SharedMemoryClear>, + kMaxK, + WarpIteratorA_, + kScaleOperandA, + kTransposeA> { + using RegularMma = MmaMultistage< + Shape_, + IteratorA_, + SmemIteratorA_, + CacheOpA, + IteratorB_, + SmemIteratorB_, + CacheOpB, + ElementC_, + LayoutC_, + Policy_, + Stages, + SharedMemoryClear>; + + using WarpShape = typename Policy_::Operator::Shape; + using InstructionShape = typename Policy_::Operator::InstructionShape; + using WarpIteratorTranspose = TransposeWarpIterator; + static constexpr bool kIsTransposedA = + WarpIteratorTranspose::kSupportsTranspose && kTransposeA; + using WarpIteratorA = typename platform::conditional< + kIsTransposedA, + typename WarpIteratorTranspose::Iterator, + WarpIteratorA_>::type; + + // Reduce the number of stages if we don't need that many + static int constexpr kStagesMax = + (kMaxK + int(Shape_::kK) - 1) / int(Shape_::kK); + static int constexpr kStages = cutlass::const_min(Stages, kStagesMax); + + using IteratorB = typename cutlass::transform::threadblock:: + MakeIteratorResidualLast::Iterator; + using Mma = + typename cutlass::gemm::threadblock::MmaMultistageFromSharedMemory< + Shape_, + WarpIteratorA, + kScaleOperandA, + IteratorB, + SmemIteratorB_, + RegularMma::kCacheOpB, + ElementC_, + LayoutC_, + Policy_, + kStages, + kMaxK>; +}; + +///////////////////////////////////////////////////////////////////////////////////////////////// + +template < + typename IteratorC, + typename Operator, + typename scalar_t, + typename WarpShape_, + typename ThreadblockShape_> +struct B2bGemm; + +// Tensor Cores >= Sm75 specialization (Ampere ...) +template < /// Size of the matrix to load (concept: MatrixShape) + typename Shape_, + /// Element type + typename Element_, + /// Layout of operand in memory + typename Layout_, + /// Shape of one matrix product operation (concept: MatrixShape) + typename InstructionShape_, + /// Interval between adjacent *MMA instructions (in units of MMA + /// instructions, concept: MatrixShape) + typename OpDelta_, + typename Operator, + typename scalar_t, + typename WarpShape_, + typename ThreadblockShape_> +struct B2bGemm< + cutlass::gemm::warp::MmaTensorOpAccumulatorTileIterator< + Shape_, + Element_, + Layout_, + InstructionShape_, + OpDelta_>, + Operator, + scalar_t, + WarpShape_, + ThreadblockShape_> { + using IteratorC = + typename cutlass::gemm::warp::MmaTensorOpAccumulatorTileIterator< + Shape_, + Element_, + Layout_, + InstructionShape_, + OpDelta_>; + using FragmentC = typename IteratorC::Fragment; + using InstructionShape = InstructionShape_; + using WarpShape = WarpShape_; + using ThreadblockShape = ThreadblockShape_; + using accum_t = Element_; + using lse_scalar_t = float; + + using SmemAccumulatorLayout = cutlass::layout::RowMajor; + + // Iterator to load accumulators (results of matmul in registers) + using FragmentIteratorAccumulator = + cutlass::epilogue::warp::FragmentIteratorTensorOp< + WarpShape, + InstructionShape, + accum_t, + typename Operator::Policy::Operator::FragmentC, + cutlass::layout::RowMajor>; + + // Iterator to store to shared-memory + using SmemIteratorD0 = typename cutlass::epilogue::warp::TileIteratorTensorOp< + WarpShape, + InstructionShape, + scalar_t, // accum_t, + SmemAccumulatorLayout>; + using AccumulatorSharedStorage = + cutlass::gemm::threadblock::AccumulatorSharedStorage< + ThreadblockShape, + typename SmemIteratorD0::Element, + typename SmemIteratorD0::TensorLayout, + typename SmemIteratorD0::Padding>; + // We need to provide an operation for the epilogue. Let's create an + // operation that does nothing (ScaleType::Nothing), just converts + // from accum_t (float) -> scalar_t (can be half) + using OutputOpNoOp = cutlass::epilogue::thread::LinearCombination< + typename SmemIteratorD0::Element, // ElementOutput + FragmentIteratorAccumulator::Fragment::kElements, + accum_t, // ElementAccumulator + typename SmemIteratorD0::Element, // ElementCompute + cutlass::epilogue::thread::ScaleType::Nothing>; + using Epilogue = cutlass::epilogue::threadblock::EpilogueSmemAccumulator< + SmemIteratorD0, + FragmentIteratorAccumulator, + SmemIteratorD0, // ScaleBiasIterator - not used + OutputOpNoOp>; + + // Epilogue 2: with LSE (for backwards pass) + static int const kElementsPerAccess = 2; // TODO: Why 2? + using IteratorAccumulatorLSE = + cutlass::transform::threadblock::VectorIterator< + cutlass::transform::threadblock::PredicatedVectorAccessIterator< + // Shape + cutlass::MatrixShape, + // WarpShape + cutlass::MatrixShape, + lse_scalar_t, + cutlass::layout::RowMajor, + kElementsPerAccess>>; + using EpilogueOpApplyLSE = cutlass::epilogue::thread::ApplyLogSumExp< + scalar_t, // ElementOutput_ + lse_scalar_t, // ElementLSE_ + accum_t, // ElementAccumulator_ + accum_t, // ElementCompute_ + 128 / cutlass::sizeof_bits::value + // FragmentIteratorAccumulator::Fragment::kElements + // InstructionShape::kM * InstructionShape::kN / 32 + >; + using EpilogueWithLSE = + cutlass::epilogue::threadblock::EpilogueSmemAccumulator< + SmemIteratorD0, + FragmentIteratorAccumulator, + IteratorAccumulatorLSE, + EpilogueOpApplyLSE>; + + static void CUTLASS_DEVICE accumToSmem( + AccumulatorSharedStorage& shared_storage, + FragmentC const& accum, + int lane_id, + cutlass::MatrixCoord const& tile_coords) { + SmemIteratorD0 smem_iterator_attn(shared_storage.accum_ref(), lane_id); + smem_iterator_attn.add_tile_offset( + tile_coords * + cutlass::MatrixCoord{ + SmemIteratorD0::TileIterations::kRow, + SmemIteratorD0::TileIterations::kColumn}); + Epilogue epilogue; + epilogue(OutputOpNoOp({}), smem_iterator_attn, accum); + } + + static void CUTLASS_DEVICE accumApplyLSEToSmem( + AccumulatorSharedStorage& shared_storage, + FragmentC& accum, + lse_scalar_t const* lse, + int32_t lse_extents, + int thread_id, + int warp_id, + int lane_id, + cutlass::MatrixCoord const& tile_coords) { + constexpr int32_t kAlignLSE = 32; + IteratorAccumulatorLSE iterator_lse( + lse, + {(int32_t)0, (int32_t)ceil_div(lse_extents, kAlignLSE) * kAlignLSE}, + thread_id, + warp_id, + cutlass::MatrixCoord{0, 0} // offset + ); + + SmemIteratorD0 smem_iterator_attn(shared_storage.accum_ref(), lane_id); + smem_iterator_attn.add_tile_offset( + tile_coords * + cutlass::MatrixCoord{ + SmemIteratorD0::TileIterations::kRow, + SmemIteratorD0::TileIterations::kColumn}); + EpilogueWithLSE epilogue; + EpilogueOpApplyLSE minus_lse_exp({}); + epilogue( + minus_lse_exp, + smem_iterator_attn, + accum, + // scale - unused + iterator_lse, + // bias + iterator_lse); + } +}; + +// Volta Specialization +// only supported for f16 +template +struct B2bGemm< + cutlass::gemm::warp::MmaVoltaTensorOpAccumulatorTileIterator< + cutlass::MatrixShape<32, 32>, + float, + cutlass::layout::RowMajor, + cutlass::gemm::GemmShape<16, 16, 4>, + cutlass::MatrixShape<1, 1>>, + Operator, + cutlass::half_t, + WarpShape_, + ThreadblockShape_> { + using IteratorC = + cutlass::gemm::warp::MmaVoltaTensorOpAccumulatorTileIterator< + cutlass::MatrixShape<32, 32>, + float, + cutlass::layout::RowMajor, + cutlass::gemm::GemmShape<16, 16, 4>, + cutlass::MatrixShape<1, 1>>; + using scalar_t = cutlass::half_t; + using accum_t = IteratorC::Element; + using WarpShape = WarpShape_; + using ThreadblockShape = ThreadblockShape_; + using FragmentC = IteratorC::Fragment; + using lse_scalar_t = float; + + // Storage in shared-memory for Q.Kt + using SmemAccumulatorLayout = + cutlass::layout::RowMajorVoltaTensorOpMultiplicandCrosswise<16, 32>; + using AccumulatorSharedStorage = + cutlass::gemm::threadblock::AccumulatorSharedStorage< + ThreadblockShape, + scalar_t, + SmemAccumulatorLayout, + cutlass::MatrixShape<0, 0> // Padding + >; + using TensorRef = cutlass::TensorRef; + using Policy = typename IteratorC::Policy; + using Element = accum_t; + // Those are MmaVoltaTensorOpAccumulatorTileIterator private fields + // Let's copy their values + static int const kElementsPerPartial = 4; + using EleShapePerPatial = typename cutlass::platform::conditional< + cutlass::platform::is_same::value, + cutlass::MatrixShape<2, 2>, + cutlass::MatrixShape<1, 4>>::type; + static int const kElementsPerMma = 8; + static int const kAccumulatorPatials = 2; + using QuadShapePerPatialMma = cutlass::MatrixShape<4, 4>; + + static void CUTLASS_DEVICE accumToSmem( + AccumulatorSharedStorage& shared_storage, + FragmentC const& accum, + int lane_id, + cutlass::MatrixCoord const& tile_coords) { + // ctor - from MmaVoltaTensorOpAccumulatorTileIterator + TensorRef ref_(shared_storage.accum_ref()); + int quad = (lane_id >> 2); + int lane_in_quad = (lane_id & 3); + int accum_m, accum_n; + + if (cutlass::platform::is_same::value) { + // (quad[2],quad[0])+lane_in_quad[0] + accum_m = (((quad & 0x4) >> 1) + (quad & 0x1)) * 8 + (lane_in_quad & 1); + // (quad[1])+lane_in_quad[1] + accum_n = + ((quad >> 1) & 0x1) * kElementsPerPartial * kAccumulatorPatials + + (lane_in_quad & 2); + } else { + accum_m = (((quad & 0x4) >> 1) + (quad & 0x1)) * 8 + + lane_in_quad; // (quad[2],quad[0]) + accum_n = ((quad >> 1) & 0x1) * kElementsPerPartial * kAccumulatorPatials; + } + cutlass::MatrixCoord lane_offset(accum_m, accum_n); + + // Tile offset + ref_.add_coord_offset( + tile_coords * + cutlass::MatrixCoord( + {IteratorC::Shape::kRow, IteratorC::Shape::kColumn})); + + using AccessType = cutlass::Array; + + // store - from MmaVoltaTensorOpAccumulatorTileIterator + CUTLASS_PRAGMA_UNROLL + for (int tile_n = 0; tile_n < Policy::TileIterations::kColumn; ++tile_n) { + CUTLASS_PRAGMA_UNROLL + for (int tile_m = 0; tile_m < Policy::TileIterations::kRow; ++tile_m) { + CUTLASS_PRAGMA_UNROLL + for (int mma_n = 0; mma_n < Policy::MmaIterations::kColumn; ++mma_n) { + CUTLASS_PRAGMA_UNROLL + for (int mma_m = 0; mma_m < Policy::MmaIterations::kRow; ++mma_m) { + int mma_accum_start = + (((tile_n * Policy::TileIterations::kRow + tile_m) * + Policy::MmaIterations::kColumn + + mma_n) * + Policy::MmaIterations::kRow + + mma_m) * + kElementsPerMma; + + CUTLASS_PRAGMA_UNROLL + for (int p = 0; p < kAccumulatorPatials; ++p) { + CUTLASS_PRAGMA_UNROLL + for (int m = 0; m < EleShapePerPatial::kRow; ++m) { + int accum_m = tile_m * Policy::InterleavedTile::kRow + + mma_m * QuadShapePerPatialMma::kRow + m * 2; + int accum_n = tile_n * Policy::InterleavedTile::kColumn + + mma_n * QuadShapePerPatialMma::kColumn + + p * Policy::InterleavedTile::kColumn / 2; + int r = (accum_m + lane_offset.row()); + AccessType to_store; + CUTLASS_PRAGMA_UNROLL + for (int n = 0; n < EleShapePerPatial::kColumn; ++n) { + int idx = mma_accum_start + p * kElementsPerPartial + + m * EleShapePerPatial::kColumn + n; + int c = (accum_n + n + lane_offset.column()); + to_store[n] = scalar_t(accum[idx]); + } + int c = (accum_n + lane_offset.column()); + assert(r < 32); + assert(c < 32); + *reinterpret_cast( + ref_.data() + ref_.offset({r, c})) = to_store; + } + } + } + } + } + } + } + + static void CUTLASS_DEVICE accumApplyLSEToSmem( + AccumulatorSharedStorage& shared_storage, + typename IteratorC::Fragment& accum, + lse_scalar_t const* lse, + int lse_extent, + int thread_id, + int warp_id, + int lane_id, + cutlass::MatrixCoord const& tile_coords) { + // Non-optimized way to apply LSE to registers + // NOTE: accum is attn.T + // TODO: Optimize for each architecture + static constexpr int WarpSize = 32; + using AccumLambdaIterator = + typename DefaultMmaAccumLambdaIterator:: + Iterator; + auto lane_offset = + AccumLambdaIterator::get_lane_offset(lane_id, warp_id, tile_coords); + + cutlass::Array lse_prefetched; + lse_prefetched.clear(); + int rowIdx = 0; + int colIdx = 0; + AccumLambdaIterator::iterateRows( + lane_offset, + [&](int accum_m) { + ++rowIdx; + colIdx = 0; + }, + [&](int accum_m, int accum_n, int idx) { + if (rowIdx == 1) { + lse_prefetched[colIdx] = accum_n < lse_extent + ? lse[accum_n] + : platform::numeric_limits::infinity(); + } + accum[idx] = expf(accum[idx] - lse_prefetched[colIdx]); + ++colIdx; + }, + [&](int accum_m) {}); + accumToSmem(shared_storage, accum, lane_id, tile_coords); + } +}; + +// Simt Specialization +// for f32 on Sm70-Sm75 and f16/f32 below + +template < + typename Operator, + typename OperatorPolicy, + typename scalar_t, + typename WarpShape_, + typename ThreadblockShape_> +struct B2bGemm< + cutlass::gemm::warp::MmaSimtTileIterator< + cutlass::MatrixShape<32, 32>, + cutlass::gemm::Operand::kC, + float, + cutlass::layout::RowMajor, + OperatorPolicy, + 1, + 1>, + Operator, + scalar_t, + WarpShape_, + ThreadblockShape_> { + using IteratorC = cutlass::gemm::warp::MmaSimtTileIterator< + cutlass::MatrixShape<32, 32>, + cutlass::gemm::Operand::kC, + float, + cutlass::layout::RowMajor, + OperatorPolicy, + 1, + 1>; + using accum_t = typename IteratorC::Element; + using WarpShape = WarpShape_; + using ThreadblockShape = ThreadblockShape_; + using FragmentC = typename IteratorC::Fragment; + using lse_scalar_t = float; + + // Storage in shared-memory for Q.Kt + using AccumulatorSharedStorage = + cutlass::gemm::threadblock::AccumulatorSharedStorage< + ThreadblockShape, + scalar_t, + cutlass::layout::ColumnMajor, + cutlass::MatrixShape<0, 0> // Padding + >; + + static void CUTLASS_DEVICE accumToSmem( + AccumulatorSharedStorage& shared_storage, + FragmentC const& accum, + int lane_id, + cutlass::MatrixCoord const& tile_coords) { + using Policy = typename IteratorC::Policy; + using Element = typename IteratorC::Element; + using Iterations = typename IteratorC::Iterations; + using Delta = typename IteratorC::Delta; + + auto ref_ = shared_storage.accum_ref(); + // ctor - MmaSimtTileIterator + // compute offset based on thread ID and lane layout + typename Policy::LaneLayout lane_layout = Policy::get_lane_layout(); + + MatrixCoord lane_offset = lane_layout.inverse(lane_id) * + MatrixCoord(Policy::LaneMmaShape::kM, Policy::LaneMmaShape::kN); + + ref_.add_coord_offset(lane_offset); + + // Tile offset + ref_.add_coord_offset( + tile_coords * + cutlass::MatrixCoord( + {IteratorC::Shape::kRow, IteratorC::Shape::kColumn})); + + // store - MmaSimtTileIterator + CUTLASS_PRAGMA_UNROLL + for (int mma_n = 0; mma_n < Iterations::kColumn; ++mma_n) { + CUTLASS_PRAGMA_UNROLL + for (int n = 0; n < Policy::LaneMmaShape::kN; ++n) { + CUTLASS_PRAGMA_UNROLL + for (int mma_m = 0; mma_m < Iterations::kRow; ++mma_m) { + CUTLASS_PRAGMA_UNROLL + for (int m = 0; m < Policy::LaneMmaShape::kM; ++m) { + int r = + Policy::LaneMmaShape::kM * (mma_m * Policy::WarpShape::kRow) + + m; + int c = mma_n * Delta::kColumn + n; + int idx = n + + Policy::LaneMmaShape::kN * + (mma_n + + Iterations::kColumn * + (m + mma_m * Policy::LaneMmaShape::kM)); + ref_.at({r, c}) = scalar_t(accum[idx]); + } + } + } + } + } + + static void CUTLASS_DEVICE accumApplyLSEToSmem( + AccumulatorSharedStorage& shared_storage, + typename IteratorC::Fragment& accum, + lse_scalar_t const* lse, + int lse_extent, + int thread_id, + int warp_id, + int lane_id, + cutlass::MatrixCoord const& tile_coords) { + // Non-optimized way to apply LSE to registers + // NOTE: accum is attn.T + // TODO: Optimize for each architecture + static constexpr int WarpSize = 32; + using AccumLambdaIterator = + typename DefaultMmaAccumLambdaIterator:: + Iterator; + auto lane_offset = + AccumLambdaIterator::get_lane_offset(lane_id, warp_id, tile_coords); + + cutlass::Array lse_prefetched; + lse_prefetched.clear(); + int rowIdx = 0; + int colIdx = 0; + AccumLambdaIterator::iterateRows( + lane_offset, + [&](int accum_m) { + ++rowIdx; + colIdx = 0; + }, + [&](int accum_m, int accum_n, int idx) { + if (rowIdx == 1) { + lse_prefetched[colIdx] = accum_n < lse_extent + ? lse[accum_n] + : platform::numeric_limits::infinity(); + } + accum[idx] = expf(accum[idx] - lse_prefetched[colIdx]); + ++colIdx; + }, + [&](int accum_m) {}); + accumToSmem(shared_storage, accum, lane_id, tile_coords); + } +}; + +} // namespace threadblock +} // namespace gemm +} // namespace cutlass + +///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/gemm/replace_mma_iterators.h b/csrc/include/natten/cuda/fna/gemm/replace_mma_iterators.h new file mode 100644 index 0000000..cab443e --- /dev/null +++ b/csrc/include/natten/cuda/fna/gemm/replace_mma_iterators.h @@ -0,0 +1,123 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + *all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **************************************************************************************************/ + +#pragma once + +#include +#include + +namespace natten { +namespace cuda { +namespace fna { + +// Technically we can easily replace iterators with a derived +// class, but `MakeCustomMma` dispatches based on Mma classes, +// which makes it really difficult to add arbitrary derived classes, +// so to avoid that, we just replace the Mma iterators by creating +// new Mma instantiations instead of using inheritance. +template +struct ReplaceMmaIterators; + +template < + typename Shape, + typename IteratorA, + typename SmemIteratorA, + cutlass::arch::CacheOperation::Kind CacheOpA, + typename IteratorB, + typename SmemIteratorB, + cutlass::arch::CacheOperation::Kind CacheOpB, + typename ElementC, + typename LayoutC, + typename Policy, + int kStages, + cutlass::gemm::SharedMemoryClearOption SharedMemoryClear, + typename NewIteratorA, + typename NewIteratorB> +struct ReplaceMmaIterators< + cutlass::gemm::threadblock::MmaMultistage< + Shape, + IteratorA, + SmemIteratorA, + CacheOpA, + IteratorB, + SmemIteratorB, + CacheOpB, + ElementC, + LayoutC, + Policy, + kStages, + SharedMemoryClear>, + NewIteratorA, + NewIteratorB> { + using Mma = cutlass::gemm::threadblock::MmaMultistage< + Shape, + NewIteratorA, + SmemIteratorA, + CacheOpA, + NewIteratorB, + SmemIteratorB, + CacheOpB, + ElementC, + LayoutC, + Policy, + kStages, + SharedMemoryClear>; +}; + +template < + typename Shape, + typename IteratorA, + typename SmemIteratorA, + typename IteratorB, + typename SmemIteratorB, + typename ElementC, + typename LayoutC, + typename Policy, + typename NewIteratorA, + typename NewIteratorB> +struct ReplaceMmaIterators< + cutlass::gemm::threadblock::MmaPipelined< + Shape, + IteratorA, + SmemIteratorA, + IteratorB, + SmemIteratorB, + ElementC, + LayoutC, + Policy>, + NewIteratorA, + NewIteratorB> { + using Mma = cutlass::gemm::threadblock::MmaPipelined< + Shape, + NewIteratorA, + SmemIteratorA, + NewIteratorB, + SmemIteratorB, + ElementC, + LayoutC, + Policy>; +}; + +} // namespace fna +} // namespace cuda +} // namespace natten diff --git a/csrc/include/natten/cuda/fna/gemm_kernel_utils.h b/csrc/include/natten/cuda/fna/gemm_kernel_utils.h new file mode 100644 index 0000000..fef0499 --- /dev/null +++ b/csrc/include/natten/cuda/fna/gemm_kernel_utils.h @@ -0,0 +1,186 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Fused Neighborhood Attention kernels are heavily based on the + * memory-efficient attention kernels from the xFormers project by Meta + * Platforms, Inc. + * + * Copyright (c) Facebook, Inc. and its affiliates + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include + +#include + +#define DISPATCH_BOOL(BOOL_V, BOOL_NAME, F) \ + { \ + if (BOOL_V) { \ + constexpr bool BOOL_NAME = true; \ + F(); \ + } else { \ + constexpr bool BOOL_NAME = false; \ + F(); \ + } \ + } + +#define CHECK_ALIGNED_PTR(PTR, ALIGNMENT) \ + NATTEN_CHECK(uint64_t(PTR) % ALIGNMENT == 0, #PTR " is not correctly aligned") + +namespace gemm_kernel_utils { + +template +constexpr CUTLASS_HOST_DEVICE integer ceil_div(integer n, integer m) { + return (n + m - 1) / m; +} + +template +constexpr CUTLASS_HOST_DEVICE integer align_up(integer n, integer m) { + return ((n + m - 1) / m) * m; +} + +//////////////////////////////////////////////////////////////////////////////// +// Determine the type of GEMM we do (TensorCores or not, Shapes ...) +// TODO: Maybe we could rely on Cutlass's DefaultGemm templates +//////////////////////////////////////////////////////////////////////////////// + +// Fallback to Simt (FMA on cuda cores) if not in a special case below +template +struct DefaultGemmType { + static constexpr int ThreadK = 8; + static constexpr int WarpK = 8; + static constexpr int kMinimumAlignment = 1; + using InstructionShape = cutlass::gemm::GemmShape<1, 1, 1>; + using OpClass = cutlass::arch::OpClassSimt; + using Operator = cutlass::arch::OpMultiplyAdd; +}; + +// Specialization for tensorcores with f32 +template +struct DefaultGemmType< + ArchTag, + float, + typename cutlass::platform::enable_if< + ArchTag::kMinComputeCapability >= 80>::type> { + static constexpr int ThreadK = 32; + static constexpr int WarpK = 32; + static constexpr int kMinimumAlignment = 4; + using OpClass = cutlass::arch::OpClassTensorOp; + using InstructionShape = cutlass::gemm::GemmShape<16, 8, 8>; + using Operator = cutlass::arch::OpMultiplyAddFastF32; +}; + +// Specialization for tensorcores with f16/bf16 - Sm75+ +template +struct DefaultGemmType< + ArchTag, + scalar_t, + typename cutlass::platform::enable_if< + ArchTag::kMinComputeCapability >= 75 && + cutlass::sizeof_bits::value == 16>::type> { + static constexpr int ThreadK = 32; + static constexpr int WarpK = 32; + static constexpr int kMinimumAlignment = 4; + using OpClass = cutlass::arch::OpClassTensorOp; + using InstructionShape = cutlass::gemm::GemmShape<16, 8, 8>; + using Operator = cutlass::arch::OpMultiplyAdd; +}; + +// Specialization for tensorcores with f16 - Volta +template <> +struct DefaultGemmType { + static constexpr int ThreadK = 32; + static constexpr int WarpK = 32; + static constexpr int kMinimumAlignment = 2; + using OpClass = cutlass::arch::OpClassTensorOp; + using InstructionShape = cutlass::gemm::GemmShape<8, 8, 4>; + using Operator = cutlass::arch::OpMultiplyAdd; +}; + +// Enables to do +// `auto x = kCondition ? fa(arg) : fb(arg)` +// when `fa` and `fb` have different types +template +struct call_conditional; + +template +struct call_conditional { + template + static CUTLASS_HOST_DEVICE auto apply(TA ta, TB tb, Arg arg) + -> decltype(ta(arg)) { + return ta(arg); + } +}; + +template +struct call_conditional { + template + static CUTLASS_HOST_DEVICE auto apply(TA ta, TB tb, Arg arg) + -> decltype(tb(arg)) { + return tb(arg); + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// Mark a variable as warp-uniform - enables some compiler optimizations +// The cheapest way to do it is just to broadcast it from lane 0 +//////////////////////////////////////////////////////////////////////////////// + +template +CUTLASS_DEVICE T warp_uniform(T value) { + struct { + union { + T value; + uint32_t asInt; + }; + } p; + p.value = value; + p.asInt = __shfl_sync(0xffffffff, (unsigned)p.asInt, 0); + return p.value; +} + +template +CUTLASS_DEVICE T* warp_uniform(T* ptr) { + struct { + union { + T* ptr; + uint32_t asInt[2]; + }; + } p; + p.ptr = ptr; + p.asInt[0] = warp_uniform(p.asInt[0]); + p.asInt[1] = warp_uniform(p.asInt[1]); + return p.ptr; +} + +} // namespace gemm_kernel_utils diff --git a/csrc/include/natten/cuda/fna/iterators/default_warp_iterator_from_smem.h b/csrc/include/natten/cuda/fna/iterators/default_warp_iterator_from_smem.h new file mode 100644 index 0000000..a7256e4 --- /dev/null +++ b/csrc/include/natten/cuda/fna/iterators/default_warp_iterator_from_smem.h @@ -0,0 +1,149 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Instanciates the right WarpIterator to read from shared memory + The class `DefaultWarpIteratorAFromSharedMemory` is useful when reading + data dumped with `B2bGemm::accumToSmem`. +*/ + +#pragma once + +#include "cutlass/cutlass.h" +#include "cutlass/gemm/warp/mma_tensor_op_tile_access_iterator.h" +#include "cutlass/platform/platform.h" + +#include "warp_iterator_from_smem.h" + +namespace cutlass { +namespace gemm { +namespace threadblock { + +template < + typename WarpShape, + typename InstructionShape, + typename RegularWarpIterator, + typename Policy, + typename Enable = void> +struct DefaultWarpIteratorAFromSharedMemory {}; + +// TensorOp - Ampere half +template +struct DefaultWarpIteratorAFromSharedMemory< + cutlass::gemm::GemmShape<32, 32, 32>, + cutlass::gemm::GemmShape<16, 8, kInstrK>, + RegularWarpIterator, + Policy, + typename platform::enable_if<( + sizeof_bits::value == 16 && + Policy::Operator::Policy::OpDelta::kRow == 1)>::type> { + using OpDelta = typename Policy::Operator::Policy::OpDelta; + using WarpShape = cutlass::MatrixShape<32, 32>; + using InstructionShape = cutlass::gemm::GemmShape<16, 8, kInstrK>; + + using WarpIterator = cutlass::gemm::warp::WarpIteratorFromSmem< + cutlass::gemm::Operand::kA, + typename RegularWarpIterator::Element, + cutlass::MatrixShape>; +}; + +// TensorOp - Ampere f32 +template +struct DefaultWarpIteratorAFromSharedMemory< + WarpShape, + cutlass::gemm::GemmShape<16, 8, 8>, + RegularWarpIterator, + Policy, + typename platform::enable_if<( + sizeof_bits::value != 16 || + Policy::Operator::Policy::OpDelta::kRow != 1)>::type> { + using InstructionShape = cutlass::gemm::GemmShape<16, 8, 8>; + static constexpr auto kWarpSize = 32; + using OpDelta = typename Policy::Operator::Policy::OpDelta; + + using WarpIterator = + cutlass::gemm::warp::MmaTensorOpMultiplicandTileAccessIterator< + cutlass::MatrixShape, + cutlass::gemm::Operand::kA, + typename RegularWarpIterator::Element, + cutlass::layout::RowMajor, + cutlass::MatrixShape, + OpDelta::kRow, + kWarpSize>; +}; + +// TensorOp - Volta +template +struct DefaultWarpIteratorAFromSharedMemory< + WarpShape, + cutlass::gemm::GemmShape<16, 16, 4>, + RegularWarpIterator, + Policy> { + using InstructionShape = cutlass::gemm::GemmShape<16, 16, 4>; + static constexpr auto kWarpSize = 32; + using OpDelta = typename Policy::Operator::Policy::OpDelta; + + using WarpIterator = + cutlass::gemm::warp::MmaVoltaTensorOpMultiplicandTileIterator< + cutlass::MatrixShape<32, 32>, // MatrixShape, + cutlass::gemm::Operand::kA, + typename RegularWarpIterator::Element, + cutlass::layout::RowMajorVoltaTensorOpMultiplicandCrosswise<16, 32>, + cutlass::MatrixShape<16, 4>, + OpDelta::kRow, + kWarpSize>; +}; + +// Simt +template +struct DefaultWarpIteratorAFromSharedMemory< + WarpShape, + cutlass::gemm::GemmShape<1, 1, 1>, + RegularWarpIterator, + Policy> { + using InstructionShape = cutlass::gemm::GemmShape<1, 1, 1>; + static constexpr auto kWarpSize = 32; + + // We just use the same iterator, as we reproduced the same shared-memory + // schema. Just modify it to handle non-complete tiles. + using WarpIterator = RegularWarpIterator; +}; + +} // namespace threadblock +} // namespace gemm +} // namespace cutlass diff --git a/csrc/include/natten/cuda/fna/iterators/epilogue_predicated_tile_iterator.h b/csrc/include/natten/cuda/fna/iterators/epilogue_predicated_tile_iterator.h new file mode 100644 index 0000000..1b7b827 --- /dev/null +++ b/csrc/include/natten/cuda/fna/iterators/epilogue_predicated_tile_iterator.h @@ -0,0 +1,760 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * NOTE: this is only used in the backward pass kernel. + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Epilogue iterator that supports prefetching + + Mostly copied from "cutlass/epilogue/threadblock/predicated_tile_iterator.h" +*/ + +#pragma once + +#include "cutlass/arch/arch.h" +#include "cutlass/arch/memory.h" +#include "cutlass/array.h" +#include "cutlass/cutlass.h" +#include "cutlass/epilogue/threadblock/output_tile_thread_map.h" +#include "cutlass/epilogue/threadblock/predicated_tile_iterator_params.h" +#include "cutlass/layout/matrix.h" +#include "cutlass/layout/tensor.h" +#include "cutlass/matrix_shape.h" +#include "cutlass/numeric_types.h" +#include "cutlass/tensor_ref.h" +#include "cutlass/transform/pitch_linear_thread_map.h" + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { + +//////////////////////////////////////////////////////////////////////////////// + +namespace epilogue { +namespace threadblock { + +//////////////////////////////////////////////////////////////////////////////// + +/// Tile iterator used to load and store output tile from global memory in +/// epilogue. +/// +/// Satisfies: ReadableTileIterator | PredicatedTileIterator | +/// ForwardTileIterator +/// +template < + typename ThreadMap_, ///< Thread map (conept: OutputTileThreadMap) + typename Element_, ///< Element data type + bool ScatterD = false, ///< Scatter D operand or not + bool UseCUDAStore = false> +class PredicatedTileIteratorPrefetch { + public: + using ThreadMap = ThreadMap_; + using Shape = typename ThreadMap::Shape; + + using Element = Element_; + + using Layout = layout::RowMajor; + using TensorRef = TensorRef; + using ConstTensorRef = typename TensorRef::ConstTensorRef; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + using TensorCoord = MatrixCoord; + + static int const kElementsPerAccess = ThreadMap::kElementsPerAccess; + static int const kThreads = ThreadMap::kThreads; + static int const kIterations = ThreadMap::Count::kTile; + + static_assert( + ThreadMap::Iterations::kRow > 0, + "ThreadMap::Iterations::kRow must be > 0"); + static_assert( + ThreadMap::Iterations::kGroup > 0, + "ThreadMap::Iterations::kGroup must be > 0"); + static_assert( + ThreadMap::Iterations::kCluster > 0, + "ThreadMap::Iterations::kCluster must be > 0"); + static_assert( + ThreadMap::Iterations::kColumn > 0, + "ThreadMap::Iterations::kColumn must be > 0"); + + /// Fragment object + using Fragment = Array< + Element, + ThreadMap::Iterations::kColumn * ThreadMap::Iterations::kRow * + ThreadMap::Iterations::kGroup * ThreadMap::Iterations::kCluster * + ThreadMap::kElementsPerAccess>; + + /// Memory access size + using AccessType = AlignedArray; + + // + // Parameters struct + // + + /// Uses a non-template class + struct Params : PredicatedTileIteratorParams { + using Base = PredicatedTileIteratorParams; + + CUTLASS_HOST_DEVICE + Params() {} + + CUTLASS_HOST_DEVICE + Params(Layout const& layout) + : PredicatedTileIteratorParams( + layout.stride(0) * int(sizeof(AccessType)) / kElementsPerAccess, + make_OutputTileThreadMapDesc()) {} + + CUTLASS_HOST_DEVICE + Params(Base const& base) : Base(base) {} + }; + + /// Mask object + struct Mask { + static int const kCount = ThreadMap::Iterations::kColumn; + + /// Predicate state + bool predicates[kCount]; + + // + // Mask + // + CUTLASS_HOST_DEVICE + Mask() { + enable(); + } + + ///< Efficiently disables all accesses guarded by mask + CUTLASS_HOST_DEVICE void clear() { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kCount; ++i) { + predicates[i] = false; + } + } + + ///< CUTLASS_HOST_DEVICE enables all accesses guarded by mask + CUTLASS_DEVICE void enable() { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kCount; ++i) { + predicates[i] = true; + } + } + }; + + private: + // + // Data members + // + + /// Parameters structure containing reference and precomputed state. + PredicatedTileIteratorParams params_; + + /// Byte-level pointer + uint8_t* byte_pointer_; + + /// Array of boolean values to contain steady-state predicates + Mask mask_; + + /// Extent of the matrix tile in rows + Index extent_row_; + + /// Extent of the matrix tile in rows + Index extent_column_; + + /// A thread's starting row position (assuming steady-state predicates have + /// been computed) + Index thread_start_row_; + + /// A thread's starting column + Index thread_start_column_; + + /// Internal state counter + int state_[3]; + + /// Scatter indices + int const* indices_; + + // + // Static asserts about internal strides + // + + static_assert(sizeof(extent_row_) == 4, "Expected 32b extents"); + static_assert(sizeof(thread_start_row_) == 4, "Expected 32b extents"); + static_assert( + sizeof(PredicatedTileIteratorParams::stride) == 8, + "Expected 64b strides"); + + private: + // + // Methods + // + + public: + // + // Methods + // + + /// Constructor + CUTLASS_DEVICE + PredicatedTileIteratorPrefetch( + PredicatedTileIteratorParams const& params, + Element* pointer, + TensorCoord extent, + int thread_idx, + TensorCoord threadblock_offset = TensorCoord(), + int const* indices = nullptr) + : params_(params), indices_(indices) { + TensorCoord thread_offset = + ThreadMap::initial_offset(thread_idx) + threadblock_offset; + + extent_row_ = extent.row(); + extent_column_ = extent.column(); + + thread_start_row_ = thread_offset.row(); + thread_start_column_ = thread_offset.column(); + + // Initialize predicates + CUTLASS_PRAGMA_UNROLL + for (int c = 0; c < ThreadMap::Iterations::kColumn; ++c) { + mask_.predicates[c] = + ((thread_offset.column() + ThreadMap::Delta::kColumn * c) < + extent.column()); + } + + // Null pointer performs no accesses + if (!pointer) { + mask_.clear(); + } + + if (ScatterD && !indices) { + mask_.clear(); + } + + // Initialize pointer + byte_pointer_ = reinterpret_cast(pointer) + + LongIndex(thread_offset.row()) * LongIndex(params_.stride) + + LongIndex(thread_offset.column()) * sizeof(AccessType) / + kElementsPerAccess; + + if (ScatterD) { + byte_pointer_ = reinterpret_cast(pointer) + + LongIndex(thread_offset.column()) * sizeof(AccessType) / + kElementsPerAccess; + } + + // Initialize internal state counter + state_[0] = state_[1] = state_[2] = 0; + } + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + byte_pointer_ += pointer_offset * sizeof_bits::value / 8; + } + + CUTLASS_DEVICE + void prefetch_all() { + CUTLASS_PRAGMA_UNROLL + for (int iter = 0; iter < kIterations; ++iter) { + prefetch(); + ++(*this); + } + } + + CUTLASS_DEVICE + void prefetch() { + uint8_t* byte_pointer = byte_pointer_; + + CUTLASS_PRAGMA_UNROLL + for (int cluster = 0; cluster < ThreadMap::Iterations::kCluster; + ++cluster) { + CUTLASS_PRAGMA_UNROLL + for (int group = 0; group < ThreadMap::Iterations::kGroup; ++group) { + CUTLASS_PRAGMA_UNROLL + for (int row = 0; row < ThreadMap::Iterations::kRow; ++row) { + int row_offset = row * ThreadMap::Delta::kRow + + group * ThreadMap::Delta::kGroup + + cluster * ThreadMap::Delta::kCluster; + + AccessType* memory_pointer = + reinterpret_cast(byte_pointer); + + CUTLASS_PRAGMA_UNROLL + for (int column = 0; column < ThreadMap::Iterations::kColumn; + ++column) { + // on windows using unsigned long here gives the error + // error: asm operand type size(4) does not match + // type/size implied by constraint 'l' + uint64_t addr = (uint64_t)( + (void*)&memory_pointer + [column * ThreadMap::Delta::kColumn / kElementsPerAccess]); + asm volatile("prefetch.global.L1 [ %1 ];" : "=l"(addr) : "l"(addr)); + } + + if (row + 1 < ThreadMap::Iterations::kRow) { + if (!ScatterD) { + byte_pointer += params_.increment_row; + } + } + } + + if (group + 1 < ThreadMap::Iterations::kGroup) { + byte_pointer += params_.increment_group; + } + } + + if (cluster + 1 < ThreadMap::Iterations::kCluster) { + byte_pointer += params_.increment_cluster; + } + } + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load_with_byte_offset(Fragment& frag, int64_t byte_offset) const { + uint8_t* byte_pointer = byte_pointer_; + AccessType* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int cluster = 0; cluster < ThreadMap::Iterations::kCluster; + ++cluster) { + CUTLASS_PRAGMA_UNROLL + for (int group = 0; group < ThreadMap::Iterations::kGroup; ++group) { + CUTLASS_PRAGMA_UNROLL + for (int row = 0; row < ThreadMap::Iterations::kRow; ++row) { + int frag_row_idx = + (row + + ThreadMap::Iterations::kRow * + (group + ThreadMap::Iterations::kGroup * cluster)); + + int row_offset = row * ThreadMap::Delta::kRow + + group * ThreadMap::Delta::kGroup + + cluster * ThreadMap::Delta::kCluster; + + bool row_guard = ((row_offset + thread_start_row_) < extent_row_); + + AccessType* memory_pointer = + reinterpret_cast(byte_pointer + byte_offset); + + if (ScatterD && row_guard) { + assert(indices_); + + memory_pointer = reinterpret_cast( + byte_pointer + byte_offset + + LongIndex(indices_[row_offset + thread_start_row_]) * + LongIndex(params_.stride)); + } + + CUTLASS_PRAGMA_UNROLL + for (int column = 0; column < ThreadMap::Iterations::kColumn; + ++column) { + bool guard = row_guard && mask_.predicates[column]; + + cutlass::arch::global_load( + frag_ptr + [frag_row_idx * ThreadMap::Iterations::kColumn + column], + (void*)&memory_pointer + [column * ThreadMap::Delta::kColumn / kElementsPerAccess], + guard); + } + + if (row + 1 < ThreadMap::Iterations::kRow) { + if (!ScatterD) { + byte_pointer += params_.increment_row; + } + } + } + + if (group + 1 < ThreadMap::Iterations::kGroup) { + byte_pointer += params_.increment_group; + } + } + + if (cluster + 1 < ThreadMap::Iterations::kCluster) { + byte_pointer += params_.increment_cluster; + } + } + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load(Fragment& frag) const { + load_with_byte_offset(frag, 0); + } + + /// Stores a fragment to memory + CUTLASS_DEVICE + void store_with_byte_offset(Fragment const& frag, int64_t byte_offset) const { + uint8_t* byte_pointer = byte_pointer_; + AccessType const* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int cluster = 0; cluster < ThreadMap::Iterations::kCluster; + ++cluster) { + CUTLASS_PRAGMA_UNROLL + for (int group = 0; group < ThreadMap::Iterations::kGroup; ++group) { + CUTLASS_PRAGMA_UNROLL + for (int row = 0; row < ThreadMap::Iterations::kRow; ++row) { + int frag_row_idx = + (row + + ThreadMap::Iterations::kRow * + (group + ThreadMap::Iterations::kGroup * cluster)); + + int row_offset = row * ThreadMap::Delta::kRow + + group * ThreadMap::Delta::kGroup + + cluster * ThreadMap::Delta::kCluster; + + bool row_guard = ((row_offset + thread_start_row_) < extent_row_); + + AccessType* memory_pointer = + reinterpret_cast(byte_pointer + byte_offset); + + if (ScatterD && row_guard) { + assert(indices_); + + memory_pointer = reinterpret_cast( + byte_pointer + byte_offset + + LongIndex(indices_[row_offset + thread_start_row_]) * + LongIndex(params_.stride)); + } + + CUTLASS_PRAGMA_UNROLL + for (int column = 0; column < ThreadMap::Iterations::kColumn; + ++column) { + bool guard = row_guard && mask_.predicates[column]; + + if (UseCUDAStore) { + if (guard) { + memory_pointer + [column * ThreadMap::Delta::kColumn / kElementsPerAccess] = + frag_ptr + [frag_row_idx * ThreadMap::Iterations::kColumn + + column]; + } + } else { + cutlass::arch::global_store( + frag_ptr + [frag_row_idx * ThreadMap::Iterations::kColumn + column], + (void*)&memory_pointer + [column * ThreadMap::Delta::kColumn / kElementsPerAccess], + guard); + } + } + + if (row + 1 < ThreadMap::Iterations::kRow) { + if (!ScatterD) { + byte_pointer += params_.increment_row; + } + } + } + + if (group + 1 < ThreadMap::Iterations::kGroup) { + byte_pointer += params_.increment_group; + } + } + + if (cluster + 1 < ThreadMap::Iterations::kCluster) { + byte_pointer += params_.increment_cluster; + } + } + } + + /// Stores a fragment to memory + CUTLASS_DEVICE + void store(Fragment const& frag) const { + store_with_byte_offset(frag, 0); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void downsample_load_with_byte_offset( + Fragment& frag, + int64_t byte_offset, + int convolution_P, + int convolution_Q, + int add_P, + int add_Q, + int problem_N) const { + uint8_t* byte_pointer = byte_pointer_; + AccessType* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int cluster = 0; cluster < ThreadMap::Iterations::kCluster; + ++cluster) { + CUTLASS_PRAGMA_UNROLL + for (int group = 0; group < ThreadMap::Iterations::kGroup; ++group) { + CUTLASS_PRAGMA_UNROLL + for (int row = 0; row < ThreadMap::Iterations::kRow; ++row) { + int frag_row_idx = + (row + + ThreadMap::Iterations::kRow * + (group + ThreadMap::Iterations::kGroup * cluster)); + + int row_offset = row * ThreadMap::Delta::kRow + + group * ThreadMap::Delta::kGroup + + cluster * ThreadMap::Delta::kCluster; + + bool row_guard = ((row_offset + thread_start_row_) < extent_row_); + + int output_row = row_offset + thread_start_row_; + int output_N = output_row / (convolution_P * convolution_Q); + int output_PQ = output_row % (convolution_P * convolution_Q); + int output_P = output_PQ / convolution_Q; + int output_Q = output_PQ % convolution_Q; + + int input_row = output_N * 2 * convolution_P * 2 * convolution_Q + + (2 * output_P + add_P) * 2 * convolution_Q + 2 * output_Q + add_Q; + + int64_t byte_offset = + (input_row - output_row) * problem_N * sizeof(float); + + AccessType* memory_pointer = + reinterpret_cast(byte_pointer + byte_offset); + + CUTLASS_PRAGMA_UNROLL + for (int column = 0; column < ThreadMap::Iterations::kColumn; + ++column) { + bool guard = row_guard && mask_.predicates[column]; + + cutlass::arch::global_load( + frag_ptr + [frag_row_idx * ThreadMap::Iterations::kColumn + column], + (void*)&memory_pointer + [column * ThreadMap::Delta::kColumn / kElementsPerAccess], + guard); + } + + if (row + 1 < ThreadMap::Iterations::kRow) { + byte_pointer += params_.increment_row; + } + } + + if (group + 1 < ThreadMap::Iterations::kGroup) { + byte_pointer += params_.increment_group; + } + } + + if (cluster + 1 < ThreadMap::Iterations::kCluster) { + byte_pointer += params_.increment_cluster; + } + } + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void upsample_load_with_byte_offset( + Fragment& frag, + int64_t byte_offset, + int convolution_P, + int convolution_Q, + int add_P, + int add_Q, + int problem_N) const { + uint8_t* byte_pointer = byte_pointer_; + AccessType* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int cluster = 0; cluster < ThreadMap::Iterations::kCluster; + ++cluster) { + CUTLASS_PRAGMA_UNROLL + for (int group = 0; group < ThreadMap::Iterations::kGroup; ++group) { + CUTLASS_PRAGMA_UNROLL + for (int row = 0; row < ThreadMap::Iterations::kRow; ++row) { + int frag_row_idx = + (row + + ThreadMap::Iterations::kRow * + (group + ThreadMap::Iterations::kGroup * cluster)); + + int row_offset = row * ThreadMap::Delta::kRow + + group * ThreadMap::Delta::kGroup + + cluster * ThreadMap::Delta::kCluster; + + bool row_guard = ((row_offset + thread_start_row_) < extent_row_); + + int output_row = row_offset + thread_start_row_; + int output_N = output_row / (convolution_P * convolution_Q); + int output_PQ = output_row % (convolution_P * convolution_Q); + int output_P = output_PQ / convolution_Q; + int output_Q = output_PQ % convolution_Q; + int row_add_P = add_P; + int row_add_Q = add_Q; + if (output_P > convolution_P - 2) + row_add_P = 0; + if (output_Q > convolution_Q - 2) + row_add_Q = 0; + + int input_row = output_N * (convolution_P / 2) * (convolution_Q / 2) + + ((output_P + row_add_P) / 2) * (convolution_Q / 2) + + (output_Q + row_add_Q) / 2; + + int64_t byte_offset = + (input_row - output_row) * problem_N * sizeof(float); + + AccessType* memory_pointer = + reinterpret_cast(byte_pointer + byte_offset); + + CUTLASS_PRAGMA_UNROLL + for (int column = 0; column < ThreadMap::Iterations::kColumn; + ++column) { + bool guard = row_guard && mask_.predicates[column]; + + cutlass::arch::global_load( + frag_ptr + [frag_row_idx * ThreadMap::Iterations::kColumn + column], + (void*)&memory_pointer + [column * ThreadMap::Delta::kColumn / kElementsPerAccess], + guard); + } + + if (row + 1 < ThreadMap::Iterations::kRow) { + byte_pointer += params_.increment_row; + } + } + + if (group + 1 < ThreadMap::Iterations::kGroup) { + byte_pointer += params_.increment_group; + } + } + + if (cluster + 1 < ThreadMap::Iterations::kCluster) { + byte_pointer += params_.increment_cluster; + } + } + } + + CUTLASS_DEVICE + MatrixCoord thread_start() const { + return MatrixCoord(thread_start_row_, thread_start_column_); + } + + /// Need to get the thread start row from the tile iterator + CUTLASS_DEVICE + int32_t thread_start_row() const { + return thread_start_row_; + } + + /// Need to get the thread start row from the tile iterator + CUTLASS_DEVICE + int32_t thread_start_column() const { + return thread_start_column_; + } + + /// Extent of the matrix in rows + CUTLASS_DEVICE + Index extent_row() const { + return extent_row_; + } + + /// Extent of the matrix in columns + CUTLASS_DEVICE + Index extent_column() const { + return extent_column_; + } + + /// Advances to the next position to load or store + CUTLASS_HOST_DEVICE + PredicatedTileIteratorPrefetch& operator++() { + ++state_[0]; + + if (!ScatterD) { + byte_pointer_ += params_.advance_row; + } + + thread_start_row_ += ThreadMap::Shape::kRow; + + if (state_[0] == ThreadMap::Count::kRow) { + state_[0] = 0; + ++state_[1]; + byte_pointer_ += params_.advance_group; + + thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * + ThreadMap::Shape::kRow * ThreadMap::Count::kRow; + + if (state_[1] == ThreadMap::Count::kGroup) { + state_[1] = 0; + ++state_[2]; + byte_pointer_ += params_.advance_cluster; + + thread_start_row_ += ThreadMap::Count::kGroup * + ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * + ThreadMap::Shape::kRow; + + if (state_[2] == ThreadMap::Count::kCluster) { + state_[2] = 0; + byte_pointer_ += params_.advance_tile; + } + } + } + + return *this; + } + + ///< Efficiently disables all accesses guarded by mask + CUTLASS_DEVICE void clear_mask() { + mask_.clear(); + } + + ///< Efficiently enables all accesses guarded by mask + CUTLASS_DEVICE void enable_mask() { + mask_.enable(); + } + + ///< Sets the mask + CUTLASS_DEVICE void get_mask(Mask& mask) const { + mask = mask_; + } + + ///< Sets the mask + CUTLASS_DEVICE void set_mask(Mask const& mask) { + mask_ = mask; + } +}; + +template +struct MakePrefetchableIterator { + using Iterator = PredicatedTileIteratorPrefetch< + typename IT::ThreadMap, + typename IT::Element>; +}; + +/////////////////////////////////////////////////////////////////////////////// + +} // namespace threadblock +} // namespace epilogue +} // namespace cutlass + +//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/iterators/make_residual_last.h b/csrc/include/natten/cuda/fna/iterators/make_residual_last.h new file mode 100644 index 0000000..69abf4c --- /dev/null +++ b/csrc/include/natten/cuda/fna/iterators/make_residual_last.h @@ -0,0 +1,108 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Fused Neighborhood Attention kernels are heavily based on the + * memory-efficient attention kernels from the xFormers project by Meta + * Platforms, Inc. + * + * Copyright (c) Facebook, Inc. and its affiliates + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "predicated_tile_access_iterator_residual_last.h" +#include "predicated_tile_iterator_residual_last.h" + +namespace cutlass { +namespace transform { +namespace threadblock { + +template +struct MakeIteratorResidualLast; + +template < + int NADim, + typename Shape, + typename Element, + typename Layout, + int AdvanceRank, + typename ThreadMap, + int AccessSize> +struct MakeIteratorResidualLast< + NADim, + PredicatedTileIterator< + Shape, + Element, + Layout, + AdvanceRank, + ThreadMap, + AccessSize>> { + using Iterator = PredicatedTileIteratorResidualLast< + NADim, + Shape, + Element, + Layout, + AdvanceRank, + ThreadMap, + AccessSize>; +}; + +template < + int NADim, + typename Shape, + typename Element, + typename Layout, + int AdvanceRank, + typename ThreadMap, + typename AccessType> +struct MakeIteratorResidualLast< + NADim, + PredicatedTileAccessIterator< + Shape, + Element, + Layout, + AdvanceRank, + ThreadMap, + AccessType>> { + using Iterator = PredicatedTileAccessIteratorResidualLast< + NADim, + Shape, + Element, + Layout, + AdvanceRank, + ThreadMap, + AccessType>; +}; + +} // namespace threadblock +} // namespace transform +} // namespace cutlass diff --git a/csrc/include/natten/cuda/fna/iterators/predicated_tile_access_iterator.h b/csrc/include/natten/cuda/fna/iterators/predicated_tile_access_iterator.h new file mode 100644 index 0000000..795cc9a --- /dev/null +++ b/csrc/include/natten/cuda/fna/iterators/predicated_tile_access_iterator.h @@ -0,0 +1,1662 @@ +/* + * Copied from CUTLASS (https://github.com/NVIDIA/cutlass/) and edited. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Templates calculating the address and predicates to the load of tiles + from pitch-linear rank=2 tensors. + + This iterator uses masks to guard out-of-bounds accesses. The first tile + this iterator visits maybe partial, then the remaining tiles are complete. + So, we only need to compute the predicates twice, once before the first tile + and once for the remaining full tiles which can share the same predicates. + + A precomputed "Params" object minimizes the amount of state that must be + stored in registers, and integer addition is used to advance the pointer + through memory. +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace transform { +namespace threadblock { + +template +struct CustomPredicatedTileAccessIteratorParams { + using Dim = typename natten::cuda::fna::GetDim::type; + + using Index = int32_t; + using LongIndex = + typename std::conditional::type; + + // + // Data members + // + /// stride of pitch-linear layout (units of Element) + Dim stride_; + /// amount (in byte) to increment pointer to move to next access along + /// strided dimension + LongIndex inc_strided_; + /// amount (in byte) to increment pointer from last access to first access + /// of next tile + LongIndex inc_next_; + /// amount (in byte) to increment pointer from first access of current tile + /// to first access of next tile + LongIndex inc_advance_; + + // + // Methods + // + + CUTLASS_HOST_DEVICE + Status initialize( + Dim stride, + Dim extent_row, + PredicatedTileAccessIteratorDesc desc) { + stride_ = stride; + + if constexpr (NADim == 1) { + inc_strided_ = (LongIndex(stride_.x) * desc.threadmap_delta.strided()) * + desc.element_size_bits / 8; + + if (desc.advance_rank) { + // advance along strided dimension + inc_advance_ = desc.threadblock_shape.strided() * LongIndex(stride_.x) * + desc.element_size_bits / 8; + } else { + // advance along contiguous dimension + inc_advance_ = + desc.threadblock_shape.contiguous() * desc.element_size_bits / 8; + } + + inc_next_ = inc_advance_ - + LongIndex(desc.threadmap_iterations.strided() - 1) * + desc.threadmap_delta.strided() * LongIndex(stride_.x) * + desc.element_size_bits / 8; + // inc_strided_ = + // (natten::cuda::fna::map_index_to_coord(desc.threadmap_delta.strided(), + // extent_row) * stride_).sum() * + // desc.element_size_bits / 8; + //// inc_strided_ = (LongIndex(stride_) * desc.threadmap_delta.strided()) + ///* / desc.element_size_bits / 8; + + // if (desc.advance_rank) { + // // advance along strided dimension + // inc_advance_ = (natten::cuda::fna::map_index_to_coord( + // desc.threadblock_shape.strided(), extent_row) * stride_).sum() * + // desc.element_size_bits / 8; + // // inc_advance_ = + // // desc.threadblock_shape.strided() * LongIndex(stride_) * + // desc.element_size_bits / 8; + //} else { + // // advance along contiguous dimension + // inc_advance_ = desc.threadblock_shape.contiguous() * + // desc.element_size_bits / 8; + //} + + // inc_next_ = inc_advance_ - + // (natten::cuda::fna::map_index_to_coord((desc.threadmap_iterations.strided() + // - 1) * + // desc.threadmap_delta.strided(), + // extent_row) * stride_).sum() * + // desc.element_size_bits / 8; + //// inc_next_ = inc_advance_ - + ///LongIndex(desc.threadmap_iterations.strided() - 1) * / + ///desc.threadmap_delta.strided() * LongIndex(stride_) * / + ///desc.element_size_bits / 8; + } else { + // inc_strided_ = LongIndex(desc.threadmap_delta.strided()); + + // if (desc.advance_rank) { + // // advance along strided dimension + // inc_advance_ = LongIndex(desc.threadblock_shape.strided()); + // } else { + // // advance along contiguous dimension + // inc_advance_ = LongIndex(desc.threadblock_shape.contiguous()); + // } + + // inc_next_ = inc_advance_ - + // LongIndex(desc.threadmap_iterations.strided() - 1) * + // desc.threadmap_delta.strided(); + } + + return Status::kSuccess; + } + + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIteratorParams( + Dim stride, + Dim extent_row, + PredicatedTileAccessIteratorDesc desc) { + initialize(stride, extent_row, desc); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// CustomPredicatedTileAccessIteratorPredicates +/// +template < + int NADim, + typename Shape_, + typename Element_, + typename Layout_, + int AdvanceRank, + typename ThreadMap_, + typename AccessType_> +class CustomPredicatedTileAccessIteratorPredicates { + public: + static_assert(NADim >= 1 && NADim < 4); + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = Layout_; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + using AccessType = AccessType_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorCoord = typename Layout::TensorCoord; + + static int const kAccessesPerVector = + ThreadMap::kElementsPerAccess / AccessType::kElements; + + static_assert( + !(ThreadMap::kElementsPerAccess % AccessType::kElements), + "Vectors implied by the thread map must be divisible by the access type."); + + static int const kPredicatesPerByte = 4; + static int const kPredicatesPerWord = 4 * kPredicatesPerByte; + + static int const kPredicateCount = + ThreadMap::Iterations::kCount * kAccessesPerVector; + + /// Number of 32b words containing predicates + static int const kPredicateByteCount = + (kPredicateCount + kPredicatesPerByte - 1) / kPredicatesPerByte; + static int const kPredicateWordCount = (kPredicateByteCount + 3) / 4; + + static unsigned const kPredicateMask = (1u << kPredicatesPerByte) - 1u; + + static_assert(kPredicateWordCount <= 4, "Too many predicates."); + + /// Predicate vector stores mask to guard accesses + using Mask = Array; + + // private: + /// Guard predicates + uint32_t predicates_[kPredicateWordCount]; + + /// Size of tensor + Dim extent_row_dim; + TensorCoord extent_; + + /// Initial offset for each thread + TensorCoord thread_offset_; + + /// Offset to the first steady-state tile + TensorCoord residue_offset_; + + /// Iteration along vectors implied by the thread map + int iteration_vector_; + + /// Iteration in the contiguous dimension + int iteration_contiguous_; + + /// Iteration in the strided dimension + int iteration_strided_; + + public: + /// Computes predicates based on internally tracked per-thread offset. + CUTLASS_DEVICE + void compute_predicates_( + /// Extent of the matrix window + TensorCoord extent, + /// optionally, simplify predicate calculation during 'steady state' phase + bool is_steady_state = false) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kPredicateWordCount; ++i) { + predicates_[i] = 0u; + } + + CUTLASS_PRAGMA_UNROLL + for (int access_idx = 0; + access_idx < ThreadMap::Iterations::kCount * kAccessesPerVector; + ++access_idx) { + int s = access_idx / + (ThreadMap::Iterations::kContiguous * kAccessesPerVector); + + int access_residual = access_idx % + (ThreadMap::Iterations::kContiguous * kAccessesPerVector); + + int c = access_residual / kAccessesPerVector; + int v = access_residual % kAccessesPerVector; + + TensorCoord iteration_coord( + c * ThreadMap::Delta::kContiguous + v * AccessType::kElements, + s * ThreadMap::Delta::kStrided); + + TensorCoord coord = thread_offset_ + iteration_coord; + + bool guard; + + // Dim coord_row; + // if constexpr (kAdvanceRank == 0) { + // coord_row = natten::cuda::fna::map_index_to_coord(coord.strided(), + // extent_.strided()); + //} else { + // coord_row = natten::cuda::fna::map_index_to_coord(coord.contiguous(), + // natten::cuda::fna::MapTileSizeToNd::value); + //} + + // if (is_steady_state) { + // guard = coord.strided() < extent.strided(); + // } else { + ////if constexpr (kAdvanceRank == 0) { + // guard = (coord.strided() < extent.strided() && + // coord.contiguous() < extent.contiguous()); + ////} else { + //// guard = (coord.strided() < extent_col && + //// coord_row < extent_row); + ////} + //} + if (is_steady_state) { + if (kAdvanceRank == 0) { + guard = (coord.strided() < extent.strided()); + } else { + guard = (coord.contiguous() < extent.contiguous()); + } + } else { + guard = + (coord.strided() < extent.strided() && + coord.contiguous() < extent.contiguous()); + } + + int pred_idx = + v + kAccessesPerVector * (c + ThreadMap::Iterations::kContiguous * s); + + int word_idx = pred_idx / kPredicatesPerWord; + int residual = pred_idx % kPredicatesPerWord; + int byte_idx = residual / kPredicatesPerByte; + int bit_idx = residual % kPredicatesPerByte; + + predicates_[word_idx] |= (unsigned(guard) << (byte_idx * 8 + bit_idx)); + } + } + + CUTLASS_HOST_DEVICE + void set_predicates(int thread_id, TensorCoord const& threadblock_offset) { + TensorCoord residue_extent; + // int32_t residue_extent_row = 0; + // int32_t residue_extent_col = 0; + // if constexpr (kAdvanceRank == 0) { + // // Column-major right handside operand (only instance is K in QK^T). + // // extent_[0] == K (dim per head) == extent_.contiguous() + // // extent_.contiguous() == extent_[0] == extent_.contiguous() + // // + // // Row-major left handside operand (only instance is Q in QK^T) + // // extent_[0] == K (dim per head) == extent_.contiguous() + // // extent_.contiguous() == extent_[0] == extent_.contiguous() + // typename TensorCoord::Index residue_size = (extent_.contiguous() - + // threadblock_offset.contiguous()) % Shape::kContiguous; if + // (!residue_size) { + // residue_size = Shape::kContiguous; + // } + // residue_offset_ = make_Coord(residue_size, 0); + // + // residue_extent.strided() = extent_.strided(); + // residue_extent.contiguous() = min(extent_.contiguous(), + // threadblock_offset.contiguous() + residue_size); + //} else { + // // Row-major right-handside operand (only instance is V in PV) + // // extent_[1] == M == extent_.strided() + // // extent_.contiguous() == extent_[0] == extent_.contiguous() + // // extent_.strided() == extent_[1] == extent_.strided() + // // + // typename TensorCoord::Index residue_size = (extent_.strided() - + // threadblock_offset.strided()) % Shape::kStrided; if (!residue_size) { + // residue_size = Shape::kStrided; + // } + // residue_offset_ = make_Coord(0, residue_size); + + // residue_extent.strided() = min(threadblock_offset.strided() + + // residue_size, extent_.strided()); residue_extent.contiguous() = + // extent_.contiguous(); + //} + if (kAdvanceRank) { + typename TensorCoord::Index residue_size = + (extent_[kAdvanceRank] - threadblock_offset.strided()) % + Shape::kStrided; + if (!residue_size) { + residue_size = Shape::kStrided; + } + + residue_offset_ = make_Coord(0, residue_size); + residue_extent = make_Coord( + extent_.contiguous(), + min(threadblock_offset.strided() + residue_size, extent_.strided())); + } else { + typename TensorCoord::Index residue_size = + (extent_[kAdvanceRank] - threadblock_offset.contiguous()) % + Shape::kContiguous; + if (!residue_size) { + residue_size = Shape::kContiguous; + } + + residue_offset_ = make_Coord(residue_size, 0); + + residue_extent = make_Coord( + min(extent_.contiguous(), + threadblock_offset.contiguous() + residue_size), + extent_.strided()); + } + + // Per-thread offset in logical coordinates of tensor + thread_offset_ = threadblock_offset + ThreadMap::initial_offset(thread_id); + + compute_predicates_(residue_extent, false); + + set_iteration_index(0); + } + + /// Default constructor + CustomPredicatedTileAccessIteratorPredicates() = default; + + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIteratorPredicates( + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col) + : extent_row_dim(extent_row), extent_(extent_col, extent_row.prod32()) {} + + /// Overrides the internal iteration index + CUTLASS_HOST_DEVICE + void set_iteration_index(int index) { + iteration_vector_ = index % kAccessesPerVector; + int residual_access = index / kAccessesPerVector; + + iteration_contiguous_ = + residual_access % ThreadMap::Iterations::kContiguous; + iteration_strided_ = residual_access / ThreadMap::Iterations::kContiguous; + } + + /// Increment and return an instance to self. + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIteratorPredicates& operator++() { + return *this; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kPredicateWordCount; ++i) { + predicates_[i] = enable ? 0u : predicates_[i]; + } + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kPredicateWordCount; ++i) { + predicates_[i] = 0xffffffff; + } + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kPredicateWordCount; ++i) { + predicates_[i] = mask[i]; + } + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < kPredicateWordCount; ++i) { + mask[i] = predicates_[i]; + } + } + + /// Returns whether access is valid or not + CUTLASS_HOST_DEVICE + bool valid() const { + int pred_idx = iteration_vector_ + + kAccessesPerVector * + (iteration_contiguous_ + + iteration_strided_ * ThreadMap::Iterations::kContiguous); + + int word_idx = pred_idx / kPredicatesPerWord; + int residual = pred_idx % kPredicatesPerWord; + int byte_idx = residual / kPredicatesPerByte; + int bit_idx = residual % kPredicatesPerByte; + + bool pred = (predicates_[word_idx] & (1u << (byte_idx * 8 + bit_idx))) != 0; + return pred; + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// CustomPredicatedTileAccessIterator +/// +template < + int NADim, + typename Shape, + typename Element, + typename Layout, + int AdvanceRank, + typename ThreadMap, + typename AccessType> +class CustomPredicatedTileAccessIterator; + +//////////////////////////////////////////////////////////////////////////////// + +/// CustomPredicatedTileAccessIterator for possibly multiple axes (NA1D, 2D, 3D) +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + typename AccessType_> +class CustomPredicatedTileAccessIterator< + NADim, + Shape_, + Element_, + layout::PitchLinear, + AdvanceRank, + ThreadMap_, + AccessType_> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::PitchLinear; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + using AccessType = AccessType_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingPredicates = CustomPredicatedTileAccessIteratorPredicates< + NADim, + Shape, + Element, + Layout, + AdvanceRank, + ThreadMap, + AccessType>; + + static int const kAccessesPerVector = + ThreadMap::kElementsPerAccess / AccessType::kElements; + + static_assert( + !(ThreadMap::kElementsPerAccess % AccessType::kElements), + "Vectors implied by the thread map must be divisible by the access type."); + + using Mask = typename UnderlyingPredicates::Mask; + + /// Uses a non-template class + struct Params : CustomPredicatedTileAccessIteratorParams { + using Base = CustomPredicatedTileAccessIteratorParams; + + /// Default constructor + Params() = default; + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) + : Base( + stride, + extent_row, + MakePredicatedTileAccessIteratorDesc< + Shape, + Element, + Layout, + kAdvanceRank, + ThreadMap>()()) {} + + CUTLASS_HOST_DEVICE + Params(Base const& base) : Base(base) {} + }; + + private: + /// Internal pointer type permits fast address arithmetic + using BytePointer = char*; + + private: + // + // Data members + // + + UnderlyingPredicates the_predicates; + + /// Parameters object with precomputed internal state + Params params_; + + /// Internal pointer to first access of tile + BytePointer pointer_; + TensorCoord coord_offset_; + + /// Used for out-of-order visitation + bool is_residue_tile_; + + private: + /// Computes predicates based on internally tracked per-thread offset. + CUTLASS_DEVICE + void compute_predicates_( + /// Extent of the matrix window + TensorCoord extent, + /// optionally, simplify predicate calculation during 'steady state' phase + bool is_steady_state = false) { + the_predicates.compute_predicates_(extent, is_steady_state); + } + + public: + /// Default constructor + CustomPredicatedTileAccessIterator() = default; + + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + /// ID of each participating thread + int thread_id, + /// Initial offset of threadblock + TensorCoord const& threadblock_offset) + : params_(params), + pointer_(reinterpret_cast( + const_cast(pointer))), + the_predicates(extent_row, extent_col), + is_residue_tile_(true) { + the_predicates.set_predicates(thread_id, threadblock_offset); + + // update internal pointers + coord_offset_ = the_predicates.thread_offset_; + // add_pointer_offset(the_predicates.thread_offset_.strided(), + // the_predicates.thread_offset_.contiguous()); + } + + /// Construct a CustomPredicatedTileAccessIterator with zero threadblock + /// offset + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + ///< ID of each participating thread + int thread_id) + : CustomPredicatedTileAccessIterator( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Overrides the internal iteration index + CUTLASS_HOST_DEVICE + void set_iteration_index(int index) { + the_predicates.set_iteration_index(index); + } + + CUTLASS_HOST_DEVICE + void add_pointer_offset(int32_t row_offset, int32_t col_offset) { + coord_offset_.strided() += row_offset; + coord_offset_.contiguous() += col_offset; + } + + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex linear_offset) { + printf("FATAL!"); + // if constexpr (kAdvanceRank) { + // auto col_offset = linear_offset % Shape::kStrided; + // auto row_offset = linear_offset / Shape::kStrided; + // add_pointer_offset(row_offset, (int32_t)col_offset); + // } else { + // auto col_offset = linear_offset % Shape::kContiguous; + // auto row_offset = linear_offset / Shape::kContiguous; + // add_pointer_offset(row_offset, (int32_t)col_offset); + // } + } + + /// Advances an iterator along logical dimensions of matrix in units of whole + /// tiles + CUTLASS_DEVICE + void add_tile_offset(TensorCoord const& tile_offset) { + if (is_residue_tile_) { + the_predicates.thread_offset_ += the_predicates.residue_offset_; + + the_predicates.compute_predicates_(the_predicates.extent_, true); + + // add_pointer_offset(the_predicates.residue_offset_.strided(), + // the_predicates.residue_offset_.contiguous()); + + coord_offset_.strided() = the_predicates.thread_offset_.strided() + + Shape::kStrided * (tile_offset.strided() - kAdvanceRank); + coord_offset_.contiguous() = the_predicates.thread_offset_.contiguous() + + Shape::kContiguous * (tile_offset.contiguous() - (1 - kAdvanceRank)); + + // if (kAdvanceRank) { + // add_pointer_offset( + // params_.inc_advance_ * (tile_offset.strided() - 1) + + // Shape::kContiguous * tile_offset.contiguous()); + // // pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided() + // - 1); + // // pointer_ += Shape::kContiguous * tile_offset.contiguous() * + // sizeof_bits::value / 8; + // } else { + // // Advance along contiguous dimension + // add_pointer_offset( + // params_.inc_advance_ * (tile_offset.contiguous() - 1) + + // Shape::kStrided * tile_offset.strided()); + // // pointer_ += params_.inc_advance_ * + // LongIndex(tile_offset.contiguous() - 1); + // // pointer_ += Shape::kStrided * tile_offset.strided() * + // sizeof_bits::value / 8; + // } + } else { + add_pointer_offset( + Shape::kStrided * tile_offset.strided(), + Shape::kContiguous * tile_offset.contiguous()); + // if (kAdvanceRank) { + // add_pointer_offset( + // params_.inc_advance_ * tile_offset.strided() + + // Shape::kContiguous * tile_offset.contiguous()); + // // pointer_ += params_.inc_advance_ * + // LongIndex(tile_offset.strided()); + // // pointer_ += Shape::kContiguous * tile_offset.contiguous(); + // } else { + // // Advance along contiguous dimension + // add_pointer_offset( + // params_.inc_advance_ * tile_offset.contiguous() + + // Shape::kStrided * tile_offset.strided()); + // // pointer_ += params_.inc_advance_ * + // LongIndex(tile_offset.contiguous()); + // // pointer_ += Shape::kStrided * tile_offset.strided(); + // } + } + + is_residue_tile_ = false; + } + + CUTLASS_HOST_DEVICE + LongIndex get_pointer_offset() const { + LongIndex coord_contig = coord_offset_.contiguous() + + the_predicates.iteration_contiguous_ * ThreadMap::Delta::kContiguous; + LongIndex coord_strided = + (natten::cuda::fna::map_index_to_coord( + coord_offset_.strided() + + the_predicates.iteration_strided_ * ThreadMap::Delta::kStrided, + the_predicates.extent_row_dim) * + params_.stride_) + .sum(); + return ((coord_strided + coord_contig) * sizeof_bits::value) / 8; + } + + /// Returns a pointer + CUTLASS_HOST_DEVICE + AccessType* get() const { + if (!valid()) { + return nullptr; + } + return reinterpret_cast(pointer_ + get_pointer_offset()) + + the_predicates.iteration_vector_; + } + + /// Increment and return an instance to self. + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator& operator++() { + the_predicates.operator++(); + + ++the_predicates.iteration_vector_; + if (the_predicates.iteration_vector_ < kAccessesPerVector) { + return *this; + } + + the_predicates.iteration_vector_ = 0; + ++the_predicates.iteration_contiguous_; + + if (the_predicates.iteration_contiguous_ < + ThreadMap::Iterations::kContiguous) { + return *this; + } + + // Enter here only if (iteration_contiguous_ == + // ThreadMap::Iteration::kContiguous) + the_predicates.iteration_contiguous_ = 0; + ++the_predicates.iteration_strided_; + + if (the_predicates.iteration_strided_ < ThreadMap::Iterations::kStrided) { + // add_pointer_offset(params_.inc_strided_, 0); + // pointer_ += params_.inc_strided_; + + return *this; + } + + // Enter here only if (iteration_stride_ == ThreadMap::Iteration::kStrided) + // which means we enter the next tile. + the_predicates.iteration_strided_ = 0; + + // // advance to next tile + // add_pointer_offset(params_.inc_next_, 0); + // // pointer_ += params_.inc_next_; + + // //if constexpr (kAdvanceRank) { + // add_pointer_offset(-1 * params_.inc_advance_); + // //} else { + // // // along the contiguous axis. + // // add_pointer_offset(0, -1 * params_.inc_advance_); + // //} + // // now return to start tile - if the iterator is subsequently advanced, + // this + // // subtraction as well as the subsequent integer addition are both elided + // by + // // the compiler. + // // pointer_ -= params_.inc_advance_; + + return *this; + } + + /// Increment and return an instance to self. + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator operator++(int) { + CustomPredicatedTileAccessIterator self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + the_predicates.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + the_predicates.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + the_predicates.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + the_predicates.get_mask(mask); + } + + /// Returns whether access is valid or not + CUTLASS_HOST_DEVICE + bool valid() const { + return the_predicates.valid(); + } +}; + +// Specialization for NA1D, where we only have one stride, +// and therefore the typical pitch-linear layout, and won't have +// to manually convert offsets on every get(). +template < + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + typename AccessType_> +class CustomPredicatedTileAccessIterator< + 1, + Shape_, + Element_, + layout::PitchLinear, + AdvanceRank, + ThreadMap_, + AccessType_> { + public: + static constexpr int NADim = 1; + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::PitchLinear; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + using AccessType = AccessType_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingPredicates = CustomPredicatedTileAccessIteratorPredicates< + NADim, + Shape, + Element, + Layout, + AdvanceRank, + ThreadMap, + AccessType>; + + static int const kAccessesPerVector = + ThreadMap::kElementsPerAccess / AccessType::kElements; + + static_assert( + !(ThreadMap::kElementsPerAccess % AccessType::kElements), + "Vectors implied by the thread map must be divisible by the access type."); + + using Mask = typename UnderlyingPredicates::Mask; + + /// Uses a non-template class + struct Params : CustomPredicatedTileAccessIteratorParams { + using Base = CustomPredicatedTileAccessIteratorParams; + + /// Default constructor + Params() = default; + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) + : Base( + stride, + extent_row, + MakePredicatedTileAccessIteratorDesc< + Shape, + Element, + Layout, + kAdvanceRank, + ThreadMap>()()) {} + + CUTLASS_HOST_DEVICE + Params(Base const& base) : Base(base) {} + }; + + private: + /// Internal pointer type permits fast address arithmetic + using BytePointer = char*; + + private: + // + // Data members + // + + UnderlyingPredicates the_predicates; + + /// Parameters object with precomputed internal state + Params params_; + + /// Internal pointer to first access of tile + BytePointer pointer_; + + /// Used for out-of-order visitation + bool is_residue_tile_; + + private: + /// Computes predicates based on internally tracked per-thread offset. + CUTLASS_DEVICE + void compute_predicates_( + /// Extent of the matrix window + Dim extent_row, + int32_t extent_col, + /// optionally, simplify predicate calculation during 'steady state' phase + bool is_steady_state = false) { + the_predicates.compute_predicates_(extent_row, extent_col, is_steady_state); + } + + public: + /// Default constructor + CustomPredicatedTileAccessIterator() = default; + + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + /// ID of each participating thread + int thread_id, + /// Initial offset of threadblock + TensorCoord const& threadblock_offset) + : params_(params), + pointer_(reinterpret_cast( + const_cast(pointer))), + the_predicates(extent_row, extent_col), + is_residue_tile_(true) { + the_predicates.set_predicates(thread_id, threadblock_offset); + + // update internal pointers + auto offset = (natten::cuda::fna::map_index_to_coord( + the_predicates.thread_offset_.strided(), + the_predicates.extent_row_dim) * + params_.stride_) + .sum() + + the_predicates.thread_offset_.contiguous(); + + add_pointer_offset(offset); + } + + /// Construct a CustomPredicatedTileAccessIterator with zero threadblock + /// offset + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + ///< ID of each participating thread + int thread_id) + : CustomPredicatedTileAccessIterator( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Overrides the internal iteration index + CUTLASS_HOST_DEVICE + void set_iteration_index(int index) { + the_predicates.set_iteration_index(index); + } + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + pointer_ += sizeof_bits::value * pointer_offset / 8; + } + + /// Advances an iterator along logical dimensions of matrix in units of whole + /// tiles + CUTLASS_DEVICE + void add_tile_offset(TensorCoord const& tile_offset) { + if (is_residue_tile_) { + the_predicates.thread_offset_ += the_predicates.residue_offset_; + + the_predicates.compute_predicates_(the_predicates.extent_, true); + + auto offset = (natten::cuda::fna::map_index_to_coord( + the_predicates.residue_offset_.strided(), + the_predicates.extent_row_dim) * + params_.stride_) + .sum() + + the_predicates.residue_offset_.contiguous(); + + add_pointer_offset(offset); + + if (kAdvanceRank) { + pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided() - 1); + pointer_ += Shape::kContiguous * tile_offset.contiguous() * + sizeof_bits::value / 8; + } else { + pointer_ += + params_.inc_advance_ * LongIndex(tile_offset.contiguous() - 1); + pointer_ += Shape::kStrided * tile_offset.strided() * + sizeof_bits::value / 8; + } + } else { + if (kAdvanceRank) { + pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided()); + pointer_ += Shape::kContiguous * tile_offset.contiguous(); + } else { + pointer_ += params_.inc_advance_ * LongIndex(tile_offset.contiguous()); + pointer_ += Shape::kStrided * tile_offset.strided(); + } + } + + is_residue_tile_ = false; + } + + /// Returns a pointer + CUTLASS_HOST_DEVICE + AccessType* get() const { + return reinterpret_cast( + pointer_ + + the_predicates.iteration_contiguous_ * + (ThreadMap::Delta::kContiguous * + sizeof_bits::value) / + 8) + + the_predicates.iteration_vector_; + } + + /// Increment and return an instance to self. + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator& operator++() { + the_predicates.operator++(); + + ++the_predicates.iteration_vector_; + if (the_predicates.iteration_vector_ < kAccessesPerVector) { + return *this; + } + + the_predicates.iteration_vector_ = 0; + ++the_predicates.iteration_contiguous_; + + if (the_predicates.iteration_contiguous_ < + ThreadMap::Iterations::kContiguous) { + return *this; + } + + // Enter here only if (iteration_contiguous_ == + // ThreadMap::Iteration::kContiguous) + the_predicates.iteration_contiguous_ = 0; + ++the_predicates.iteration_strided_; + + if (the_predicates.iteration_strided_ < ThreadMap::Iterations::kStrided) { + pointer_ += params_.inc_strided_; + + return *this; + } + + // Enter here only if (iteration_stride_ == ThreadMap::Iteration::kStrided) + // which means we enter the next tile. + the_predicates.iteration_strided_ = 0; + + // advance to next tile + pointer_ += params_.inc_next_; + + // now return to start tile - if the iterator is subsequently advanced, this + // subtraction as well as the subsequent integer addition are both elided by + // the compiler. + pointer_ -= params_.inc_advance_; + + return *this; + } + + /// Increment and return an instance to self. + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator operator++(int) { + CustomPredicatedTileAccessIterator self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + the_predicates.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + the_predicates.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + the_predicates.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + the_predicates.get_mask(mask); + } + + /// Returns whether access is valid or not + CUTLASS_HOST_DEVICE + bool valid() const { + return the_predicates.valid(); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// Specialization of CustomPredicatedTileAccessIterator for column-major data. +/// +/// Satisfies: ForwardTileIteratorConcept | +/// ReadableContiguousTileIteratorConcept | +/// WriteableContiguousTileIteratorConcept | +/// MaskedTileIteratorConcept +/// +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + typename AccessType_> +class CustomPredicatedTileAccessIterator< + NADim, + Shape_, + Element_, + layout::ColumnMajor, + AdvanceRank, + ThreadMap_, + AccessType_> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::ColumnMajor; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + using AccessType = AccessType_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingIterator = CustomPredicatedTileAccessIterator< + NADim, + layout::PitchLinearShape, + Element, + layout::PitchLinear, + (kAdvanceRank == 0 ? 0 : 1), + ThreadMap, + AccessType>; + + /// Predicate vector stores mask to guard accesses + using Mask = typename UnderlyingIterator::Mask; + + static int const kAccessesPerVector = UnderlyingIterator::kAccessesPerVector; + + /// Parameters object is precomputed state and is host-constructible + class Params { + private: + friend CustomPredicatedTileAccessIterator; + + /// Parameters object + typename UnderlyingIterator::Params params_; + + public: + /// Default constructor + Params() = default; + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) : params_(stride, extent_row){}; + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(typename UnderlyingIterator::Params::Base const& base) + : params_(base) {} + }; + + private: + // + // Data members + // + + /// Underlying pitch-linear tile iterator + UnderlyingIterator iterator_; + + public: + /// Default constructor + CustomPredicatedTileAccessIterator() = default; + + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator( + ///< Precomputed parameters object + Params const& params, + ///< Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + ///< ID of each participating thread + int thread_id, + ///< Initial offset of threadblock + TensorCoord const& threadblock_offset) + : iterator_( + params.params_, + pointer, + extent_row, + extent_col, + thread_id, + layout::PitchLinearCoord( + threadblock_offset.row(), + threadblock_offset.column())) {} + + /// Construct a CustomPredicatedTileAccessIterator with zero threadblock + /// offset + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id ///< ID of each participating thread + ) + : CustomPredicatedTileAccessIterator( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Overrides the internal iteration index + CUTLASS_HOST_DEVICE + void set_iteration_index(int index) { + iterator_.set_iteration_index(index); + } + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + iterator_.add_pointer_offset(pointer_offset); + } + + /// Advances an iterator along logical dimensions of matrix in units of whole + /// tiles + CUTLASS_HOST_DEVICE + void add_tile_offset(TensorCoord const& tile_offset) { + iterator_.add_tile_offset({tile_offset.row(), tile_offset.column()}); + } + + /// Returns a pointer + CUTLASS_HOST_DEVICE + AccessType* get() const { + return reinterpret_cast(iterator_.get()); + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator& operator++() { + ++iterator_; + return *this; + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator operator++(int) { + CustomPredicatedTileAccessIterator self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + iterator_.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + iterator_.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + iterator_.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + iterator_.get_mask(mask); + } + + /// Returns whether access is valid or not + CUTLASS_HOST_DEVICE + bool valid() { + return iterator_.valid(); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// Specialization of CustomPredicatedTileAccessIterator for row-major data. +/// +/// Satisfies: ForwardTileIteratorConcept | +/// ReadableContiguousTileIteratorConcept | +/// WriteableContiguousTileIteratorConcept | +/// MaskedTileIteratorConcept +/// +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + typename AccessType_> +class CustomPredicatedTileAccessIterator< + NADim, + Shape_, + Element_, + layout::RowMajor, + AdvanceRank, + ThreadMap_, + AccessType_> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::RowMajor; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + using AccessType = AccessType_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingIterator = CustomPredicatedTileAccessIterator< + NADim, + layout::PitchLinearShape, + Element, + layout::PitchLinear, + (kAdvanceRank == 0 ? 1 : 0), + ThreadMap, + AccessType>; + + static int const kAccessesPerVector = UnderlyingIterator::kAccessesPerVector; + + /// Predicate vector stores mask to guard accesses + using Mask = typename UnderlyingIterator::Mask; + + /// Parameters object is precomputed state and is host-constructible + class Params { + private: + friend CustomPredicatedTileAccessIterator; + + /// Parameters object + typename UnderlyingIterator::Params params_; + + public: + /// Default constructor + Params() = default; + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) : params_(stride, extent_row){}; + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(typename UnderlyingIterator::Params::Base const& base) + : params_(base) {} + }; + + private: + // + // Data members + // + + /// Underlying pitch-linear tile iterator + UnderlyingIterator iterator_; + + public: + /// Default constructor + CustomPredicatedTileAccessIterator() = default; + + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator( + ///< Precomputed parameters object + Params const& params, + ///< Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + ///< ID of each participating thread + int thread_id, + ///< Initial offset of threadblock + TensorCoord const& threadblock_offset) + : iterator_( + params.params_, + pointer, + extent_row, + extent_col, + thread_id, + layout::PitchLinearCoord( + threadblock_offset.column(), + threadblock_offset.row())) {} + + /// Construct a CustomPredicatedTileAccessIterator with zero threadblock + /// offset + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id ///< ID of each participating thread + ) + : CustomPredicatedTileAccessIterator( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Overrides the internal iteration index + CUTLASS_HOST_DEVICE + void set_iteration_index(int index) { + iterator_.set_iteration_index(index); + } + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + iterator_.add_pointer_offset(pointer_offset); + } + + /// Advances an iterator along logical dimensions of matrix in units of whole + /// tiles + CUTLASS_HOST_DEVICE + void add_tile_offset(TensorCoord const& tile_offset) { + iterator_.add_tile_offset({tile_offset.column(), tile_offset.row()}); + } + + /// Returns a pointer + CUTLASS_HOST_DEVICE + AccessType* get() const { + return reinterpret_cast(iterator_.get()); + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator& operator++() { + ++iterator_; + return *this; + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileAccessIterator operator++(int) { + CustomPredicatedTileAccessIterator self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + iterator_.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + iterator_.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + iterator_.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + iterator_.get_mask(mask); + } + + /// Returns whether access is valid or not + CUTLASS_HOST_DEVICE + bool valid() { + return iterator_.valid(); + } +}; + +} // namespace threadblock +} // namespace transform +} // namespace cutlass + +//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/iterators/predicated_tile_access_iterator_residual_last.h b/csrc/include/natten/cuda/fna/iterators/predicated_tile_access_iterator_residual_last.h new file mode 100644 index 0000000..07f59aa --- /dev/null +++ b/csrc/include/natten/cuda/fna/iterators/predicated_tile_access_iterator_residual_last.h @@ -0,0 +1,976 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) and + * edited. + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Templates calculating the address and predicates to the load of tiles + from pitch-linear rank=2 tensors. + + This iterator uses masks to guard out-of-bounds accesses. The first tile + this iterator visits maybe partial, then the remaining tiles are complete. + So, we only need to compute the predicates twice, once before the first tile + and once for the remaining full tiles which can share the same predicates. + + A precomputed "Params" object minimizes the amount of state that must be + stored in registers, and integer addition is used to advance the pointer + through memory. +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace transform { +namespace threadblock { + +//////////////////////////////////////////////////////////////////////////////// + +/// PredicatedTileAccessIteratorResidualLast +/// +template < + int NADim, + typename Shape, + typename Element, + typename Layout, + int AdvanceRank, + typename ThreadMap, + typename AccessType> +class PredicatedTileAccessIteratorResidualLast; + +//////////////////////////////////////////////////////////////////////////////// + +/// PredicatedTileAccessIteratorResidualLast for possibly multiple axes (NA1D, +/// 2D, 3D) +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + typename AccessType_> +class PredicatedTileAccessIteratorResidualLast< + NADim, + Shape_, + Element_, + layout::PitchLinear, + AdvanceRank, + ThreadMap_, + AccessType_> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::PitchLinear; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + using AccessType = AccessType_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingPredicates = CustomPredicatedTileAccessIteratorPredicates< + NADim, + Shape, + Element, + Layout, + AdvanceRank, + ThreadMap, + AccessType>; + + static int const kAccessesPerVector = + ThreadMap::kElementsPerAccess / AccessType::kElements; + + static_assert( + !(ThreadMap::kElementsPerAccess % AccessType::kElements), + "Vectors implied by the thread map must be divisible by the access type."); + + using Mask = typename UnderlyingPredicates::Mask; + + /// Uses a non-template class + struct Params : CustomPredicatedTileAccessIteratorParams { + using Base = CustomPredicatedTileAccessIteratorParams; + + // Default ctor + CUTLASS_HOST_DEVICE + Params() {} + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) + : Base( + stride, + extent_row, + MakePredicatedTileAccessIteratorDesc< + Shape, + Element, + Layout, + kAdvanceRank, + ThreadMap>()()) {} + + CUTLASS_HOST_DEVICE + Params(Base const& base) : Base(base) {} + }; + + private: + /// Internal pointer type permits fast address arithmetic + using BytePointer = char*; + + private: + // + // Data members + // + + UnderlyingPredicates the_predicates; + Mask residual_tile_mask; + + /// Parameters object with precomputed internal state + Params params_; + + /// Internal pointer to first access of tile + BytePointer pointer_; + TensorCoord coord_offset_; + + public: + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + /// ID of each participating thread + int thread_id, + /// Initial offset of threadblock + TensorCoord const& threadblock_offset) + : params_(params), + pointer_(reinterpret_cast( + const_cast(pointer))), + the_predicates(extent_row, extent_col) { + the_predicates.set_predicates(thread_id, threadblock_offset); + the_predicates.get_mask(residual_tile_mask); + + // Working around a weird compiler bug happening on P100 for the backward. + // I've seen together: the_predicates.predicates_[0] = 14 (instead of 15) + // residual_tile_mask[0] = 15 (correct) + // + // Adding prints when the value is calculated (in `compute_predicates_`) + // sometimes removes the bug. The consequence is that we skip some + // element of a tensor, leading to wrong results + // Setting `compute_predicates_`'s second argument (`is_steady_state`) to + // true also seems to get rid of the bug - at the cost of twice as many + // comparisons. +#if !defined(__CUDA_ARCH__) || (__CUDA_ARCH__ >= 700) + constexpr bool kWorkAroundCompilerBug = false; +#else + constexpr bool kWorkAroundCompilerBug = true; +#endif + the_predicates.compute_predicates_( + the_predicates.extent_, true && !kWorkAroundCompilerBug); + + // update internal pointers + coord_offset_ = the_predicates.thread_offset_; + // add_pointer_offset(the_predicates.thread_offset_.strided(), + // the_predicates.thread_offset_.contiguous()); + } + + /// Construct a PredicatedTileAccessIteratorResidualLast with zero threadblock + /// offset + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + ///< ID of each participating thread + int thread_id) + : PredicatedTileAccessIteratorResidualLast( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Overrides the internal iteration index + CUTLASS_HOST_DEVICE + void set_iteration_index(int index) { + the_predicates.set_iteration_index(index); + } + + CUTLASS_HOST_DEVICE + void set_residual_tile(bool is_residual_tile) { + if (is_residual_tile) { + the_predicates.set_mask(residual_tile_mask); + } + } + + CUTLASS_HOST_DEVICE + void add_pointer_offset(int32_t row_offset, int32_t col_offset) { + coord_offset_.strided() += row_offset; + coord_offset_.contiguous() += col_offset; + } + + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex linear_offset) { + printf("FATAL!"); + // if constexpr (kAdvanceRank) { + // auto col_offset = linear_offset % Shape::kStrided; + // auto row_offset = linear_offset / Shape::kStrided; + // add_pointer_offset((int32_t)row_offset, (int32_t)col_offset); + // } else { + // auto col_offset = linear_offset % Shape::kContiguous; + // auto row_offset = linear_offset / Shape::kContiguous; + // add_pointer_offset((int32_t)row_offset, (int32_t)col_offset); + // } + } + + /// Advances an iterator along logical dimensions of matrix in units of whole + /// tiles + CUTLASS_DEVICE + void add_tile_offset(TensorCoord const& tile_offset) { + add_pointer_offset( + Shape::kStrided * tile_offset.strided(), + Shape::kContiguous * tile_offset.contiguous()); + // if (kAdvanceRank) { + // add_pointer_offset( + // params_.inc_advance_ * (tile_offset.strided()) + + // Shape::kContiguous * tile_offset.contiguous()); + // // pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided()); + // // pointer_ += Shape::kContiguous * tile_offset.contiguous(); + // } else { + // // Advance along contiguous dimension + // add_pointer_offset( + // params_.inc_advance_ * (tile_offset.contiguous()) + + // Shape::kStrided * tile_offset.strided()); + // // pointer_ += params_.inc_advance_ * + // LongIndex(tile_offset.contiguous()); + // // pointer_ += Shape::kStrided * tile_offset.strided(); + // } + } + + CUTLASS_HOST_DEVICE + LongIndex get_pointer_offset() const { + LongIndex coord_contig = coord_offset_.contiguous() + + the_predicates.iteration_contiguous_ * ThreadMap::Delta::kContiguous; + LongIndex coord_strided = + (natten::cuda::fna::map_index_to_coord( + coord_offset_.strided() + + the_predicates.iteration_strided_ * ThreadMap::Delta::kStrided, + the_predicates.extent_row_dim) * + params_.stride_) + .sum(); + return ((coord_strided + coord_contig) * sizeof_bits::value) / 8; + } + + /// Returns a pointer + CUTLASS_HOST_DEVICE + AccessType* get() const { + if (!valid()) { + return nullptr; + } + return reinterpret_cast(pointer_ + get_pointer_offset()) + + the_predicates.iteration_vector_; + } + + /// Increment and return an instance to self. + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast& operator++() { + the_predicates.operator++(); + + ++the_predicates.iteration_vector_; + if (the_predicates.iteration_vector_ < kAccessesPerVector) { + return *this; + } + + the_predicates.iteration_vector_ = 0; + ++the_predicates.iteration_contiguous_; + + if (the_predicates.iteration_contiguous_ < + ThreadMap::Iterations::kContiguous) { + return *this; + } + + // Enter here only if (iteration_contiguous_ == + // ThreadMap::Iteration::kContiguous) + the_predicates.iteration_contiguous_ = 0; + ++the_predicates.iteration_strided_; + + if (the_predicates.iteration_strided_ < ThreadMap::Iterations::kStrided) { + // add_pointer_offset(params_.inc_strided_); + // pointer_ += params_.inc_strided_; + + return *this; + } + + // Enter here only if (iteration_stride_ == ThreadMap::Iteration::kStrided) + // which means we enter the next tile. + the_predicates.iteration_strided_ = 0; + + //// advance to next tile + // add_pointer_offset(params_.inc_next_); + //// pointer_ += params_.inc_next_; + + // add_pointer_offset(-1 * params_.inc_advance_); + ////if constexpr (kAdvanceRank) { + //// add_pointer_offset(-1 * params_.inc_advance_, 0); + ////} else { + //// // along the contiguous axis. + //// add_pointer_offset(0, -1 * params_.inc_advance_); + ////} + //// now return to start tile - if the iterator is subsequently advanced, + ///this / subtraction as well as the subsequent integer addition are both + ///elided by / the compiler. / pointer_ -= params_.inc_advance_; + + return *this; + } + + /// Increment and return an instance to self. + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast operator++(int) { + PredicatedTileAccessIteratorResidualLast self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + the_predicates.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + the_predicates.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + the_predicates.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + the_predicates.get_mask(mask); + } + + /// Returns whether access is valid or not + CUTLASS_HOST_DEVICE + bool valid() const { + return the_predicates.valid(); + } +}; + +// Specialization for NA1D, where we only have one stride, +// and therefore the typical pitch-linear layout, and won't have +// to manually convert offsets on every get(). +template < + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + typename AccessType_> +class PredicatedTileAccessIteratorResidualLast< + 1, + Shape_, + Element_, + layout::PitchLinear, + AdvanceRank, + ThreadMap_, + AccessType_> { + public: + static constexpr int NADim = 1; + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::PitchLinear; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + using AccessType = AccessType_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingPredicates = CustomPredicatedTileAccessIteratorPredicates< + NADim, + Shape, + Element, + Layout, + AdvanceRank, + ThreadMap, + AccessType>; + + static int const kAccessesPerVector = + ThreadMap::kElementsPerAccess / AccessType::kElements; + + static_assert( + !(ThreadMap::kElementsPerAccess % AccessType::kElements), + "Vectors implied by the thread map must be divisible by the access type."); + + using Mask = typename UnderlyingPredicates::Mask; + + /// Uses a non-template class + struct Params : CustomPredicatedTileAccessIteratorParams { + using Base = CustomPredicatedTileAccessIteratorParams; + + // Default ctor + CUTLASS_HOST_DEVICE + Params() {} + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) + : Base( + stride, + extent_row, + MakePredicatedTileAccessIteratorDesc< + Shape, + Element, + Layout, + kAdvanceRank, + ThreadMap>()()) {} + + CUTLASS_HOST_DEVICE + Params(Base const& base) : Base(base) {} + }; + + private: + /// Internal pointer type permits fast address arithmetic + using BytePointer = char*; + + private: + // + // Data members + // + + UnderlyingPredicates the_predicates; + Mask residual_tile_mask; + + /// Parameters object with precomputed internal state + Params params_; + + /// Internal pointer to first access of tile + BytePointer pointer_; + + public: + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + /// ID of each participating thread + int thread_id, + /// Initial offset of threadblock + TensorCoord const& threadblock_offset) + : params_(params), + pointer_(reinterpret_cast( + const_cast(pointer))), + the_predicates(extent_row, extent_col) { + the_predicates.set_predicates(thread_id, threadblock_offset); + the_predicates.get_mask(residual_tile_mask); + + // Working around a weird compiler bug happening on P100 for the backward. + // I've seen together: the_predicates.predicates_[0] = 14 (instead of 15) + // residual_tile_mask[0] = 15 (correct) + // + // Adding prints when the value is calculated (in `compute_predicates_`) + // sometimes removes the bug. The consequence is that we skip some + // element of a tensor, leading to wrong results + // Setting `compute_predicates_`'s second argument (`is_steady_state`) to + // true also seems to get rid of the bug - at the cost of twice as many + // comparisons. +#if !defined(__CUDA_ARCH__) || (__CUDA_ARCH__ >= 700) + constexpr bool kWorkAroundCompilerBug = false; +#else + constexpr bool kWorkAroundCompilerBug = true; +#endif + the_predicates.compute_predicates_( + the_predicates.extent_, true && !kWorkAroundCompilerBug); + + // update internal pointers + auto offset = (natten::cuda::fna::map_index_to_coord( + the_predicates.thread_offset_.strided(), extent_row) * + params_.stride_) + .sum() + + the_predicates.thread_offset_.contiguous(); + + add_pointer_offset(offset); + } + + /// Construct a PredicatedTileAccessIteratorResidualLast with zero threadblock + /// offset + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + ///< ID of each participating thread + int thread_id) + : PredicatedTileAccessIteratorResidualLast( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Overrides the internal iteration index + CUTLASS_HOST_DEVICE + void set_iteration_index(int index) { + the_predicates.set_iteration_index(index); + } + + CUTLASS_HOST_DEVICE + void set_residual_tile(bool is_residual_tile) { + if (is_residual_tile) { + the_predicates.set_mask(residual_tile_mask); + } + } + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + pointer_ += sizeof_bits::value * pointer_offset / 8; + } + + /// Advances an iterator along logical dimensions of matrix in units of whole + /// tiles + CUTLASS_DEVICE + void add_tile_offset(TensorCoord const& tile_offset) { + if (kAdvanceRank) { + pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided()); + pointer_ += Shape::kContiguous * tile_offset.contiguous(); + } else { + pointer_ += params_.inc_advance_ * LongIndex(tile_offset.contiguous()); + pointer_ += Shape::kStrided * tile_offset.strided(); + } + } + + /// Returns a pointer + CUTLASS_HOST_DEVICE + AccessType* get() const { + return reinterpret_cast( + pointer_ + + the_predicates.iteration_contiguous_ * + (ThreadMap::Delta::kContiguous * + sizeof_bits::value) / + 8) + + the_predicates.iteration_vector_; + } + + /// Increment and return an instance to self. + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast& operator++() { + the_predicates.operator++(); + + ++the_predicates.iteration_vector_; + if (the_predicates.iteration_vector_ < kAccessesPerVector) { + return *this; + } + + the_predicates.iteration_vector_ = 0; + ++the_predicates.iteration_contiguous_; + + if (the_predicates.iteration_contiguous_ < + ThreadMap::Iterations::kContiguous) { + return *this; + } + + // Enter here only if (iteration_contiguous_ == + // ThreadMap::Iteration::kContiguous) + the_predicates.iteration_contiguous_ = 0; + ++the_predicates.iteration_strided_; + + if (the_predicates.iteration_strided_ < ThreadMap::Iterations::kStrided) { + pointer_ += params_.inc_strided_; + + return *this; + } + + // Enter here only if (iteration_stride_ == ThreadMap::Iteration::kStrided) + // which means we enter the next tile. + the_predicates.iteration_strided_ = 0; + + // advance to next tile + pointer_ += params_.inc_next_; + + // now return to start tile - if the iterator is subsequently advanced, + // this subtraction as well as the subsequent integer addition are both + // elided by the compiler. + pointer_ -= params_.inc_advance_; + + return *this; + } + + /// Increment and return an instance to self. + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast operator++(int) { + PredicatedTileAccessIteratorResidualLast self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + the_predicates.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + the_predicates.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + the_predicates.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + the_predicates.get_mask(mask); + } + + /// Returns whether access is valid or not + CUTLASS_HOST_DEVICE + bool valid() const { + return the_predicates.valid(); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// Specialization of PredicatedTileAccessIteratorResidualLast for row-major +/// data. +/// +/// Satisfies: ForwardTileIteratorConcept | +/// ReadableContiguousTileIteratorConcept | +/// WriteableContiguousTileIteratorConcept | +/// MaskedTileIteratorConcept +/// +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + typename AccessType_> +class PredicatedTileAccessIteratorResidualLast< + NADim, + Shape_, + Element_, + layout::RowMajor, + AdvanceRank, + ThreadMap_, + AccessType_> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::RowMajor; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + using AccessType = AccessType_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingIterator = PredicatedTileAccessIteratorResidualLast< + NADim, + layout::PitchLinearShape, + Element, + layout::PitchLinear, + (kAdvanceRank == 0 ? 1 : 0), + ThreadMap, + AccessType>; + + static int const kAccessesPerVector = UnderlyingIterator::kAccessesPerVector; + + /// Predicate vector stores mask to guard accesses + using Mask = typename UnderlyingIterator::Mask; + + /// Parameters object is precomputed state and is host-constructible + class Params { + private: + friend PredicatedTileAccessIteratorResidualLast; + + /// Parameters object + typename UnderlyingIterator::Params params_; + + public: + /// Default ctor + CUTLASS_HOST_DEVICE + Params() {} + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) : params_(stride, extent_row){}; + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(typename UnderlyingIterator::Params::Base const& base) + : params_(base) {} + }; + + private: + // + // Data members + // + + /// Underlying pitch-linear tile iterator + UnderlyingIterator iterator_; + + public: + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast( + ///< Precomputed parameters object + Params const& params, + ///< Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + ///< ID of each participating thread + int thread_id, + ///< Initial offset of threadblock + TensorCoord const& threadblock_offset) + : iterator_( + params.params_, + pointer, + extent_row, + extent_col, + thread_id, + layout::PitchLinearCoord( + threadblock_offset.column(), + threadblock_offset.row())) {} + + /// Construct a PredicatedTileAccessIteratorResidualLast with zero threadblock + /// offset + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id ///< ID of each participating thread + ) + : PredicatedTileAccessIteratorResidualLast( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Overrides the internal iteration index + CUTLASS_HOST_DEVICE + void set_iteration_index(int index) { + iterator_.set_iteration_index(index); + } + + CUTLASS_HOST_DEVICE + void set_residual_tile(bool enable) { + iterator_.set_residual_tile(enable); + } + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + iterator_.add_pointer_offset(pointer_offset); + } + + /// Advances an iterator along logical dimensions of matrix in units of whole + /// tiles + CUTLASS_HOST_DEVICE + void add_tile_offset(TensorCoord const& tile_offset) { + iterator_.add_tile_offset({tile_offset.column(), tile_offset.row()}); + } + + /// Returns a pointer + CUTLASS_HOST_DEVICE + AccessType* get() const { + return reinterpret_cast(iterator_.get()); + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast& operator++() { + ++iterator_; + return *this; + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + PredicatedTileAccessIteratorResidualLast operator++(int) { + PredicatedTileAccessIteratorResidualLast self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + iterator_.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + iterator_.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + iterator_.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + iterator_.get_mask(mask); + } + + /// Returns whether access is valid or not + CUTLASS_HOST_DEVICE + bool valid() { + return iterator_.valid(); + } +}; + +} // namespace threadblock +} // namespace transform +} // namespace cutlass + +//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/iterators/predicated_tile_iterator.h b/csrc/include/natten/cuda/fna/iterators/predicated_tile_iterator.h new file mode 100644 index 0000000..a22a49b --- /dev/null +++ b/csrc/include/natten/cuda/fna/iterators/predicated_tile_iterator.h @@ -0,0 +1,831 @@ +/* + * Copied from CUTLASS (https://github.com/NVIDIA/cutlass/) and edited. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Templates implementing loading of tiles from pitch-linear rank=2 + tensors. + + This iterator uses masks to guard out-of-bounds accesses. The first tile + this iterator visits maybe partial, then the remaining tiles are complete. + So, we only need to compute the predicates twice, once before the first tile + and once for the remaining full tiles which can share the same predicates. + + A precomputed "Params" object minimizes the amount of state that must be + stored in registers, and integer addition is used to advance the pointer + through memory. +*/ + +#pragma once + +#include + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace transform { +namespace threadblock { + +template < + int NADim, + typename Shape, + typename Element, + typename Layout, + int AdvanceRank, + typename ThreadMap, + int AccessSize = ThreadMap::kElementsPerAccess> +class CustomPredicatedTileIterator; + +//////////////////////////////////////////////////////////////////////////////// + +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + int AccessSize> +class CustomPredicatedTileIterator< + NADim, + Shape_, + Element_, + layout::PitchLinear, + AdvanceRank, + ThreadMap_, + AccessSize> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::PitchLinear; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + /// Type used for internal memory accesses + using AccessType = AlignedArray< + Element, + AccessSize, + (AccessSize * sizeof_bits::value / 8)>; + + /// Underlying iterator to compute the addresses + using TileAccessIterator = CustomPredicatedTileAccessIterator< + NADim, + Shape, + Element, + Layout, + kAdvanceRank, + ThreadMap, + AccessType>; + + static int const kAccessesPerVector = TileAccessIterator::kAccessesPerVector; + + /// Fragment object to be loaded or stored + using Fragment = cutlass::Array< + Element, + ThreadMap::Iterations::kCount * ThreadMap::kElementsPerAccess>; + + /// Predicate vector stores mask to guard accesses + using Mask = typename TileAccessIterator::Mask; + + /// Parameters object is precomputed state and is host-constructible + class Params { + public: + using Base = typename TileAccessIterator::Params::Base; + + friend CustomPredicatedTileIterator; + + private: + /// Parameters object + typename TileAccessIterator::Params params_; + + public: + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) : params_(stride, extent_row) {} + + /// Default constructor + Params() = default; + + CUTLASS_HOST_DEVICE + Params(Base const& base) : params_(base) {} + }; + + private: + /// Internal pointer type permits fast address arithmetic + using BytePointer = char*; + + private: + // + // Data members + // + + /// Data member to the tile access iterator + TileAccessIterator address_iterator_; + + public: + /// Default constructor + CustomPredicatedTileIterator() = default; + + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + /// ID of each participating thread + int thread_id, + /// Initial offset of threadblock + TensorCoord const& threadblock_offset) + : address_iterator_( + params.params_, + pointer, + extent_row, + extent_col, + thread_id, + threadblock_offset) {} + + /// Construct a CustomPredicatedTileIterator with zero threadblock offset + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id ///< ID of each participating thread + ) + : CustomPredicatedTileIterator( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + address_iterator_.add_pointer_offset(pointer_offset); + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator& operator++() { + if (kAdvanceRank) + address_iterator_.add_tile_offset({0, 1}); + else + address_iterator_.add_tile_offset({1, 0}); + + return *this; + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator operator++(int) { + CustomPredicatedTileIterator self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + address_iterator_.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + address_iterator_.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + address_iterator_.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + address_iterator_.get_mask(mask); + } + + CUTLASS_DEVICE + void load_with_pointer_offset(Fragment& frag, Index pointer_offset) { + load_with_byte_offset( + frag, pointer_offset * sizeof_bits::value / 8); + } + + CUTLASS_DEVICE + void load_with_byte_offset(Fragment& frag, LongIndex byte_offset) { + AccessType* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int s = 0; s < ThreadMap::Iterations::kStrided; ++s) { + CUTLASS_PRAGMA_UNROLL + for (int c = 0; c < ThreadMap::Iterations::kContiguous; ++c) { + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < kAccessesPerVector; ++v) { + int idx = v + + kAccessesPerVector * (c + s * ThreadMap::Iterations::kContiguous); + + address_iterator_.set_iteration_index(idx); + char const* byte_ptr = + reinterpret_cast(address_iterator_.get()) + + byte_offset; + + AccessType const* access_ptr = + reinterpret_cast(byte_ptr); + + cutlass::arch::global_load( + frag_ptr[idx], access_ptr, address_iterator_.valid()); + + ++address_iterator_; + } + } + } + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load(Fragment& frag) { + load_with_byte_offset(frag, 0); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_pointer_offset(Fragment const& frag, Index pointer_offset) { + store_with_byte_offset( + frag, pointer_offset * sizeof_bits::value / 8); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_byte_offset(Fragment const& frag, LongIndex byte_offset) { + address_iterator_.set_iteration_index(0); + AccessType const* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int s = 0; s < ThreadMap::Iterations::kStrided; ++s) { + CUTLASS_PRAGMA_UNROLL + for (int c = 0; c < ThreadMap::Iterations::kContiguous; ++c) { + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < kAccessesPerVector; ++v) { + int idx = v + + kAccessesPerVector * (c + s * ThreadMap::Iterations::kContiguous); + + char* byte_ptr = + reinterpret_cast(address_iterator_.get()) + byte_offset; + AccessType* access_ptr = reinterpret_cast(byte_ptr); + + if (address_iterator_.valid()) { + *access_ptr = frag_ptr[idx]; + } + ++address_iterator_; + } + } + } + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store(Fragment const& frag) { + store_with_byte_offset(frag, 0); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// Specialization of CustomPredicatedTileIterator for column-major data. +/// +/// Satisfies: ForwardTileIteratorConcept | +/// ReadableContiguousTileIteratorConcept | +/// WriteableContiguousTileIteratorConcept | +/// MaskedTileIteratorConcept +/// +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + int AccessSize> +class CustomPredicatedTileIterator< + NADim, + Shape_, + Element_, + layout::ColumnMajor, + AdvanceRank, + ThreadMap_, + AccessSize> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::ColumnMajor; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingIterator = CustomPredicatedTileIterator< + NADim, + layout::PitchLinearShape, + Element, + layout::PitchLinear, + (kAdvanceRank == 0 ? 0 : 1), + ThreadMap, + AccessSize>; + + using AccessType = typename UnderlyingIterator::AccessType; + + /// Fragment object to be loaded or stored + using Fragment = cutlass::Array< + Element, + ThreadMap::Iterations::kCount * ThreadMap::kElementsPerAccess>; + + /// Predicate vector stores mask to guard accesses + using Mask = typename UnderlyingIterator::Mask; + + /// Parameters object is precomputed state and is host-constructible + class Params { + private: + friend CustomPredicatedTileIterator; + + /// Parameters object + typename UnderlyingIterator::Params params_; + + public: + /// Default constructor + Params() = default; + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) : params_(stride, extent_row) {} + + CUTLASS_HOST_DEVICE + Params(typename UnderlyingIterator::Params::Base const& base) + : params_(base) {} + }; + + private: + // + // Data members + // + + /// Underlying pitch-linear tile iterator + UnderlyingIterator iterator_; + + public: + /// Default constructor + CustomPredicatedTileIterator() = default; + + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id, ///< ID of each participating thread + TensorCoord const& threadblock_offset ///< Initial offset of threadblock + ) + : iterator_( + params.params_, + pointer, + extent_row, + extent_col, + thread_id, + layout::PitchLinearCoord( + threadblock_offset.row(), + threadblock_offset.column())) {} + + /// Construct a CustomPredicatedTileIterator with zero threadblock offset + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id ///< ID of each participating thread + ) + : CustomPredicatedTileIterator( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + iterator_.add_pointer_offset(pointer_offset); + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator& operator++() { + ++iterator_; + return *this; + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator operator++(int) { + CustomPredicatedTileIterator self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + iterator_.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + iterator_.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + iterator_.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + iterator_.get_mask(mask); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load_with_pointer_offset(Fragment& frag, Index pointer_offset) { + iterator_.load_with_pointer_offset(frag, pointer_offset); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load_with_byte_offset(Fragment& frag, LongIndex byte_offset) { + iterator_.load_with_byte_offset(frag, byte_offset); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load(Fragment& frag) { + load_with_pointer_offset(frag, 0); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_pointer_offset(Fragment const& frag, Index pointer_offset) { + iterator_.store_with_pointer_offset(frag, pointer_offset); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_byte_offset(Fragment const& frag, LongIndex byte_offset) { + iterator_.store_with_byte_offset(frag, byte_offset); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store(Fragment const& frag) { + store_with_pointer_offset(frag, 0); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// Specialization of CustomPredicatedTileIterator for row-major data. +/// +/// Satisfies: ForwardTileIteratorConcept | +/// ReadableContiguousTileIteratorConcept | +/// WriteableContiguousTileIteratorConcept | +/// MaskedTileIteratorConcept +/// +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + int AccessSize> +class CustomPredicatedTileIterator< + NADim, + Shape_, + Element_, + layout::RowMajor, + AdvanceRank, + ThreadMap_, + AccessSize> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::RowMajor; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingIterator = CustomPredicatedTileIterator< + NADim, + layout::PitchLinearShape, + Element, + layout::PitchLinear, + (kAdvanceRank == 0 ? 1 : 0), + ThreadMap, + AccessSize>; + + using AccessType = typename UnderlyingIterator::AccessType; + + /// Fragment object to be loaded or stored + using Fragment = cutlass::Array< + Element, + ThreadMap::Iterations::kCount * ThreadMap::kElementsPerAccess>; + + /// Predicate vector stores mask to guard accesses + using Mask = typename UnderlyingIterator::Mask; + + /// Parameters object is precomputed state and is host-constructible + class Params { + private: + friend CustomPredicatedTileIterator; + + /// Parameters object + typename UnderlyingIterator::Params params_; + + public: + /// Default constructor + Params() = default; + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) : params_(stride, extent_row) {} + + CUTLASS_HOST_DEVICE + Params(typename UnderlyingIterator::Params::Base const& base) + : params_(base) {} + }; + + private: + // + // Data members + // + + /// Underlying pitch-linear tile iterator + UnderlyingIterator iterator_; + + public: + /// Default constructor + CustomPredicatedTileIterator() = default; + + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id, ///< ID of each participating thread + TensorCoord const& threadblock_offset ///< Initial offset of threadblock + ) + : iterator_( + params.params_, + pointer, + extent_row, + extent_col, + thread_id, + layout::PitchLinearCoord( + threadblock_offset.column(), + threadblock_offset.row())) {} + + /// Construct a CustomPredicatedTileIterator with zero threadblock offset + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id ///< ID of each participating thread + ) + : CustomPredicatedTileIterator( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + iterator_.add_pointer_offset(pointer_offset); + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator& operator++() { + ++iterator_; + return *this; + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + CustomPredicatedTileIterator operator++(int) { + CustomPredicatedTileIterator self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + iterator_.clear_mask(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + iterator_.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + iterator_.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + iterator_.get_mask(mask); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load_with_pointer_offset(Fragment& frag, Index pointer_offset) { + iterator_.load_with_pointer_offset(frag, pointer_offset); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load_with_byte_offset(Fragment& frag, LongIndex byte_offset) { + iterator_.load_with_byte_offset(frag, byte_offset); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load(Fragment& frag) { + load_with_pointer_offset(frag, 0); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_pointer_offset(Fragment const& frag, Index pointer_offset) { + iterator_.store_with_pointer_offset(frag, pointer_offset); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_byte_offset(Fragment const& frag, LongIndex byte_offset) { + iterator_.store_with_byte_offset(frag, byte_offset); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store(Fragment const& frag) { + store_with_pointer_offset(frag, 0); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace threadblock +} // namespace transform +} // namespace cutlass + +//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/iterators/predicated_tile_iterator_residual_last.h b/csrc/include/natten/cuda/fna/iterators/predicated_tile_iterator_residual_last.h new file mode 100644 index 0000000..b2a2f54 --- /dev/null +++ b/csrc/include/natten/cuda/fna/iterators/predicated_tile_iterator_residual_last.h @@ -0,0 +1,617 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) and + * edited. + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Templates implementing loading of tiles from pitch-linear rank=2 + tensors. + + This iterator uses masks to guard out-of-bounds accesses. The first tile + this iterator visits maybe partial, then the remaining tiles are complete. + So, we only need to compute the predicates twice, once before the first tile + and once for the remaining full tiles which can share the same predicates. + + A precomputed "Params" object minimizes the amount of state that must be + stored in registers, and integer addition is used to advance the pointer + through memory. +*/ + +#pragma once + +#include + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// + +namespace cutlass { +namespace transform { +namespace threadblock { + +//////////////////////////////////////////////////////////////////////////////// + +template < + int NADim, + typename Shape, + typename Element, + typename Layout, + int AdvanceRank, + typename ThreadMap, + int AccessSize = ThreadMap::kElementsPerAccess> +class PredicatedTileIteratorResidualLast; + +//////////////////////////////////////////////////////////////////////////////// + +/// Specialization of PredicatedTileIteratorResidualLast for pitch-linear data. +/// +/// Satisfies: ForwardTileIteratorConcept | +/// ReadableContiguousTileIteratorConcept | +/// WriteableContiguousTileIteratorConcept | +/// MaskedTileIteratorConcept +/// +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + int AccessSize> +class PredicatedTileIteratorResidualLast< + NADim, + Shape_, + Element_, + layout::PitchLinear, + AdvanceRank, + ThreadMap_, + AccessSize> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::PitchLinear; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + /// Type used for internal memory accesses + using AccessType = AlignedArray< + Element, + AccessSize, + (AccessSize * sizeof_bits::value / 8)>; + + /// Underlying iterator to compute the addresses + using TileAccessIterator = PredicatedTileAccessIteratorResidualLast< + NADim, + Shape, + Element, + Layout, + kAdvanceRank, + ThreadMap, + AccessType>; + + static int const kAccessesPerVector = TileAccessIterator::kAccessesPerVector; + + /// Fragment object to be loaded or stored + using Fragment = cutlass::Array< + Element, + ThreadMap::Iterations::kCount * ThreadMap::kElementsPerAccess>; + + /// Predicate vector stores mask to guard accesses + using Mask = typename TileAccessIterator::Mask; + + /// Parameters object is precomputed state and is host-constructible + class Params { + public: + using Base = typename TileAccessIterator::Params::Base; + + friend PredicatedTileIteratorResidualLast; + + private: + /// Parameters object + typename TileAccessIterator::Params params_; + + public: + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) : params_(stride, extent_row) {} + + CUTLASS_HOST_DEVICE + Params() {} + + CUTLASS_HOST_DEVICE + Params(Base const& base) : params_(base) {} + }; + + private: + /// Internal pointer type permits fast address arithmetic + using BytePointer = char*; + + private: + // + // Data members + // + + /// Data member to the tile access iterator + TileAccessIterator address_iterator_; + + public: + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + PredicatedTileIteratorResidualLast( + /// Precomputed parameters object + Params const& params, + /// Pointer to start of tensor + Pointer pointer, + /// Extent of tensor (rows) + Dim extent_row, + /// Extent of tensor (columns) + int32_t extent_col, + /// ID of each participating thread + int thread_id, + /// Initial offset of threadblock + TensorCoord const& threadblock_offset) + : address_iterator_( + params.params_, + pointer, + extent_row, + extent_col, + thread_id, + threadblock_offset) {} + + /// Construct a PredicatedTileIteratorResidualLast with zero threadblock + /// offset + CUTLASS_HOST_DEVICE + PredicatedTileIteratorResidualLast( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id ///< ID of each participating thread + ) + : PredicatedTileIteratorResidualLast( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + address_iterator_.add_pointer_offset(pointer_offset); + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + PredicatedTileIteratorResidualLast& operator++() { + if (kAdvanceRank) + address_iterator_.add_tile_offset({0, 1}); + else + address_iterator_.add_tile_offset({1, 0}); + + return *this; + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + PredicatedTileIteratorResidualLast operator++(int) { + PredicatedTileIteratorResidualLast self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + address_iterator_.clear_mask(enable); + } + + CUTLASS_HOST_DEVICE + void set_residual_tile(bool enable) { + address_iterator_.set_residual_tile(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + address_iterator_.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + address_iterator_.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + address_iterator_.get_mask(mask); + } + + CUTLASS_DEVICE + void load_with_pointer_offset(Fragment& frag, Index pointer_offset) { + load_with_byte_offset( + frag, pointer_offset * sizeof_bits::value / 8); + } + + CUTLASS_DEVICE + void load_with_byte_offset(Fragment& frag, LongIndex byte_offset) { + AccessType* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int s = 0; s < ThreadMap::Iterations::kStrided; ++s) { + CUTLASS_PRAGMA_UNROLL + for (int c = 0; c < ThreadMap::Iterations::kContiguous; ++c) { + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < kAccessesPerVector; ++v) { + int idx = v + + kAccessesPerVector * (c + s * ThreadMap::Iterations::kContiguous); + + address_iterator_.set_iteration_index(idx); + char const* byte_ptr = + reinterpret_cast(address_iterator_.get()) + + byte_offset; + + AccessType const* access_ptr = + reinterpret_cast(byte_ptr); + + cutlass::arch::global_load( + frag_ptr[idx], access_ptr, address_iterator_.valid()); + + ++address_iterator_; + } + } + } + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load(Fragment& frag) { + load_with_byte_offset(frag, 0); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_pointer_offset(Fragment const& frag, Index pointer_offset) { + store_with_byte_offset( + frag, pointer_offset * sizeof_bits::value / 8); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_byte_offset(Fragment const& frag, LongIndex byte_offset) { + address_iterator_.set_iteration_index(0); + AccessType const* frag_ptr = reinterpret_cast(&frag); + + CUTLASS_PRAGMA_UNROLL + for (int s = 0; s < ThreadMap::Iterations::kStrided; ++s) { + CUTLASS_PRAGMA_UNROLL + for (int c = 0; c < ThreadMap::Iterations::kContiguous; ++c) { + CUTLASS_PRAGMA_UNROLL + for (int v = 0; v < kAccessesPerVector; ++v) { + int idx = v + + kAccessesPerVector * (c + s * ThreadMap::Iterations::kContiguous); + + char* byte_ptr = + reinterpret_cast(address_iterator_.get()) + byte_offset; + AccessType* access_ptr = reinterpret_cast(byte_ptr); + + if (address_iterator_.valid()) { + *access_ptr = frag_ptr[idx]; + } + ++address_iterator_; + } + } + } + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store(Fragment const& frag) { + store_with_byte_offset(frag, 0); + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +/// Specialization of PredicatedTileIteratorResidualLast for row-major data. +/// +/// Satisfies: ForwardTileIteratorConcept | +/// ReadableContiguousTileIteratorConcept | +/// WriteableContiguousTileIteratorConcept | +/// MaskedTileIteratorConcept +/// +template < + int NADim, + typename Shape_, + typename Element_, + int AdvanceRank, + typename ThreadMap_, + int AccessSize> +class PredicatedTileIteratorResidualLast< + NADim, + Shape_, + Element_, + layout::RowMajor, + AdvanceRank, + ThreadMap_, + AccessSize> { + public: + static_assert(NADim >= 1 && NADim < 4); + static_assert( + AdvanceRank == 0 || AdvanceRank == 1, + "Specialization for pitch-linear iterator may along advance along the " + "contiguous(rank=0) or strided(rank=1) dimension."); + + using Dim = typename natten::cuda::fna::GetDim::type; + + using Shape = Shape_; + using Element = Element_; + using Layout = layout::RowMajor; + static int const kAdvanceRank = AdvanceRank; + using ThreadMap = ThreadMap_; + + using Index = typename Layout::Index; + using LongIndex = typename Layout::LongIndex; + + using TensorRef = TensorRef; + using TensorView = TensorView; + using TensorCoord = typename Layout::TensorCoord; + + using Pointer = Element*; + using NonConstPointer = typename platform::remove_const::type*; + + using UnderlyingIterator = PredicatedTileIteratorResidualLast< + NADim, + layout::PitchLinearShape, + Element, + layout::PitchLinear, + (kAdvanceRank == 0 ? 1 : 0), + ThreadMap, + AccessSize>; + + using AccessType = typename UnderlyingIterator::AccessType; + + /// Fragment object to be loaded or stored + using Fragment = cutlass::Array< + Element, + ThreadMap::Iterations::kCount * ThreadMap::kElementsPerAccess>; + + /// Predicate vector stores mask to guard accesses + using Mask = typename UnderlyingIterator::Mask; + + /// Parameters object is precomputed state and is host-constructible + class Params { + private: + friend PredicatedTileIteratorResidualLast; + + /// Parameters object + typename UnderlyingIterator::Params params_; + + public: + CUTLASS_HOST_DEVICE + Params() {} + + /// Construct the Params object given a pitch-linear tensor's layout + CUTLASS_HOST_DEVICE + Params(Dim stride, Dim extent_row) : params_(stride, extent_row) {} + + CUTLASS_HOST_DEVICE + Params(typename UnderlyingIterator::Params::Base const& base) + : params_(base) {} + }; + + private: + // + // Data members + // + + /// Underlying pitch-linear tile iterator + UnderlyingIterator iterator_; + + public: + /// Constructs a TileIterator from its precomputed state, threadblock offset, + /// and thread ID + CUTLASS_HOST_DEVICE + PredicatedTileIteratorResidualLast( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id, ///< ID of each participating thread + TensorCoord const& threadblock_offset ///< Initial offset of threadblock + ) + : iterator_( + params.params_, + pointer, + extent_row, + extent_col, + thread_id, + layout::PitchLinearCoord( + threadblock_offset.column(), + threadblock_offset.row())) {} + + /// Construct a PredicatedTileIteratorResidualLast with zero threadblock + /// offset + CUTLASS_HOST_DEVICE + PredicatedTileIteratorResidualLast( + Params const& params, ///< Precomputed parameters object + Pointer pointer, ///< Pointer to start of tensor + Dim extent_row, ///< Extent of tensor (rows) + int32_t extent_col, ///< Extent of tensor (columns) + int thread_id ///< ID of each participating thread + ) + : PredicatedTileIteratorResidualLast( + params, + pointer, + extent_row, + extent_col, + thread_id, + make_Coord(0, 0)) {} + + /// Adds a pointer offset in units of Element + CUTLASS_HOST_DEVICE + void add_pointer_offset(LongIndex pointer_offset) { + iterator_.add_pointer_offset(pointer_offset); + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + PredicatedTileIteratorResidualLast& operator++() { + ++iterator_; + return *this; + } + + /// Advances to the next tile in memory. + /// + /// The first time this method is called, predicates are updated, and the + /// iterator's internal pointer is reverted to the first "steady state" tile. + /// Subsequent calls are lightweight and must only update the internal + /// pointer. + CUTLASS_HOST_DEVICE + PredicatedTileIteratorResidualLast operator++(int) { + PredicatedTileIteratorResidualLast self(*this); + operator++(); + return self; + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void clear_mask(bool enable = true) { + iterator_.clear_mask(enable); + } + + CUTLASS_HOST_DEVICE + void set_residual_tile(bool enable) { + iterator_.set_residual_tile(enable); + } + + /// Clears the predicate set efficiently + CUTLASS_HOST_DEVICE + void enable_mask() { + iterator_.enable_mask(); + } + + /// Sets the predicate mask, overriding value stored in predicate iterator + CUTLASS_HOST_DEVICE + void set_mask(Mask const& mask) { + iterator_.set_mask(mask); + } + + /// Gets the mask + CUTLASS_HOST_DEVICE + void get_mask(Mask& mask) { + iterator_.get_mask(mask); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load_with_pointer_offset(Fragment& frag, Index pointer_offset) { + iterator_.load_with_pointer_offset(frag, pointer_offset); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load_with_byte_offset(Fragment& frag, LongIndex byte_offset) { + iterator_.load_with_byte_offset(frag, byte_offset); + } + + /// Loads a fragment from memory + CUTLASS_DEVICE + void load(Fragment& frag) { + load_with_pointer_offset(frag, 0); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_pointer_offset(Fragment const& frag, Index pointer_offset) { + iterator_.store_with_pointer_offset(frag, pointer_offset); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store_with_byte_offset(Fragment const& frag, LongIndex byte_offset) { + iterator_.store_with_byte_offset(frag, byte_offset); + } + + /// Store a fragment to memory + CUTLASS_DEVICE + void store(Fragment const& frag) { + store_with_pointer_offset(frag, 0); + } +}; + +} // namespace threadblock +} // namespace transform +} // namespace cutlass + +//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/iterators/transpose_warp_iterator.h b/csrc/include/natten/cuda/fna/iterators/transpose_warp_iterator.h new file mode 100644 index 0000000..8a69b7e --- /dev/null +++ b/csrc/include/natten/cuda/fna/iterators/transpose_warp_iterator.h @@ -0,0 +1,60 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "warp_iterator_from_smem.h" + +template +struct TransposeWarpIterator { + using Iterator = char; + static bool constexpr kSupportsTranspose = false; +}; + +template < + /// Operand identity + cutlass::gemm::Operand Operand, + /// Data type of A elements + typename Element, + typename InstructionShape, + bool kTranspose> +struct TransposeWarpIterator< + cutlass::gemm::warp:: + WarpIteratorFromSmem> { + using Iterator = cutlass::gemm::warp:: + WarpIteratorFromSmem; + static bool constexpr kSupportsTranspose = true; +}; diff --git a/csrc/include/natten/cuda/fna/iterators/warp_iterator_from_smem.h b/csrc/include/natten/cuda/fna/iterators/warp_iterator_from_smem.h new file mode 100644 index 0000000..f36aefb --- /dev/null +++ b/csrc/include/natten/cuda/fna/iterators/warp_iterator_from_smem.h @@ -0,0 +1,290 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/). + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + */ +/*************************************************************************************************** + * Copyright (c) 2017 - 2023 NVIDIA CORPORATION & AFFILIATES. All rights + *reserved. SPDX-License-Identifier: BSD-3-Clause + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + *this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + *POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************************************/ +/*! \file + \brief Inspired from + "cutlass/gemm/warp/mma_tensor_op_tile_access_iterator.h" Loads tiles of GEMM + operands from a RowMajor shared-memory layout into registers to use by A100 + TensorCores. + + The difference with "mma_tensor_op_tile_access_iterator.h" is that: + (1) We use "ldmatrix" to load tiles, rather than manual loads (slightly + faster) (2) We support to transpose the operand (eg read `A.transpose()` when + the shared memory holds `A`) + + This is only implemented for the specific shapes. +*/ +#pragma once + +#include + +//////////////////////////////////////////////////////////////////////////////// +namespace cutlass { +namespace gemm { +namespace warp { + +template < + /// Operand identity + Operand Operand_, + /// Data type of A elements + typename Element_, + typename InstructionShape_, + bool kTranspose = false> +class WarpIteratorFromSmem { + public: + /// Shape of tile to load (concept: MatrixShape) + using Shape = cutlass::MatrixShape<32, 32>; + + /// Operand tag + static Operand const kOperand = Operand_; + static_assert( + kOperand == Operand::kA, + "No support for OperandB at the moment"); + + /// Basic check + static_assert( + kOperand == Operand::kA || kOperand == Operand::kB, + "WarpIteratorFromSmem may only be instantiated for A or B operands to warp-level Mma."); + + /// Element type + using Element = Element_; + static_assert(sizeof_bits::value == 16, "Only supported for half"); + + /// Layout of source tile + using Layout = cutlass::layout::RowMajor; + + /// Shape of one matrix product operation (concept: MatrixShape) + using InstructionShape = InstructionShape_; + static_assert(InstructionShape::kRow == 16, "Only supports 16x8x8 / 16x8x16"); + static_assert( + InstructionShape::kColumn == 8 || InstructionShape::kColumn == 16, + "Only supports 16x8x8 / 16x8x16"); + + /// Delta between *MMA operations (in units of *MMA operations, concept: + /// MatrixShape) + static int const kOpDelta = 1; + + /// Number of participating threads + static int const kThreads = 32; + + /// TensorRef type for loading element from a tensor + using TensorRef = TensorRef; + + /// Index type + using Index = typename TensorRef::Index; + + /// Long Index type + using LongIndex = typename TensorRef::LongIndex; + + /// Coordinate for an element in the tensor + using TensorCoord = typename TensorRef::TensorCoord; + + /// Number of elements accessed per Shared Memory load + static int const kElementsPerAccess = + (sizeof_bits::value >= 32 ? 1 + : 32 / sizeof_bits::value); + + using InstructionCount = MatrixShape< + Shape::kRow / InstructionShape::kRow, + Shape::kColumn / InstructionShape::kColumn>; + + static int const kIterations = (kOperand == Operand::kA) + ? InstructionCount::kColumn + : InstructionCount::kRow; + + public: + // + // Derived quantities + // + + /// Fragment object holding a thread's part of a tile + using Fragment = Array< + Element, + (kOperand == Operand::kA) + ? (Shape::kRow* InstructionShape::kColumn / kThreads) + : (Shape::kColumn* InstructionShape::kRow / kThreads)>; + + /// Memory access type + // using AccessType = AlignedArray; + using AccessType = Array; + + static int constexpr kWarpShapeDivisibleInner = + (kOperand == Operand::kA ? InstructionShape::kColumn + : InstructionShape::kRow); + static int constexpr kAccessesInner = + (kWarpShapeDivisibleInner / kElementsPerAccess) / 4; + // Number of 32bits tiles to load per `ldmatrix` + static int const kTilesPerInstruction = InstructionShape::kRow / 8; + static_assert(kTilesPerInstruction == 2, "Only supports 16x8x16 and 16x8x8"); + + private: + /// Underlying tensor reference + TensorRef ref_; + + /// Origin + MatrixCoord origin_; + + /// Iterations in a tile + int iterations_; + + public: + /// Constructor from TensorRef + CUTLASS_HOST_DEVICE + WarpIteratorFromSmem(TensorRef const& ref, int lane_id) + : WarpIteratorFromSmem(ref, {Shape::kRow, Shape::kColumn}, lane_id) {} + CUTLASS_HOST_DEVICE + WarpIteratorFromSmem(TensorRef const& ref, TensorCoord extent, int lane_id) + : ref_(ref), iterations_(0) { + // See also: + // https://docs.nvidia.com/cuda/archive/11.7.1/parallel-thread-execution/index.html#warp-level-matrix-fragment-mma-1688 + // 16x8x8: kAccessesInner = 1 (1 ldmatrix.x4) + // 16x8x16: kAccessesInner = 2 (2 ldmatrix.x4) + int ldsm_vec_num = (lane_id >> 3); + if (kOperand == Operand::kA) { + origin_ = MatrixCoord(lane_id % 8, 0); + static_assert( + InstructionCount::kRow * kTilesPerInstruction == 4, + "can't use ldmatrix.x4"); + int access_m_idx = ldsm_vec_num % kTilesPerInstruction; + int inner_idx = (ldsm_vec_num / kTilesPerInstruction) % kAccessesInner; + int inst_m_idx = ldsm_vec_num / (kTilesPerInstruction * kAccessesInner); + MatrixCoord offset( + access_m_idx * 8 + inst_m_idx * InstructionShape::kRow, + inner_idx * 4 * kElementsPerAccess); + if (kTranspose) { + offset = MatrixCoord(offset.column(), offset.row()); + } + origin_ += offset; + } else { + // XXX: This is not tested or used + origin_ = MatrixCoord(0, lane_id % 8); + static_assert(InstructionCount::kColumn * kAccessesInner == 4, ""); + CUTLASS_PRAGMA_UNROLL + for (int inst_n_idx = 0; inst_n_idx < InstructionCount::kColumn; + ++inst_n_idx) { + CUTLASS_PRAGMA_UNROLL + for (int inner_idx = 0; inner_idx < kAccessesInner; ++inner_idx) { + int access_idx = inner_idx + kAccessesInner * inst_n_idx; + + MatrixCoord offset( + inner_idx * 4 * kElementsPerAccess, inst_n_idx * 8); + + if (access_idx == ldsm_vec_num) { + if (kTranspose) { + offset = MatrixCoord(offset.column(), offset.row()); + } + origin_ += offset; + } + } + } + } + + ref_.add_coord_offset(origin_); + } + + /// Advances an iterator along logical dimensions of matrix in units of whole + /// tiles + CUTLASS_HOST_DEVICE + WarpIteratorFromSmem& add_tile_offset(TensorCoord const& tile_offset) { + TensorCoord coord_offset( + tile_offset.row() * Shape::kRow, tile_offset.column() * Shape::kColumn); + if (kTranspose) { + coord_offset = TensorCoord{coord_offset.column(), coord_offset.row()}; + } + origin_ += coord_offset; + + ref_.add_coord_offset(coord_offset); + + return *this; + } + + /// Advances the iterator along the advance dimension + CUTLASS_DEVICE + void advance() { + if (kOperand == Operand::kA) { + add_tile_offset({0, 1}); + } else { + add_tile_offset({1, 0}); + } + + iterations_ = 0; + } + + /// increase iterations in a tile + CUTLASS_HOST_DEVICE + WarpIteratorFromSmem& operator++() { + iterations_++; + + if (iterations_ >= kIterations) + advance(); + + return *this; + } + + /// Loads a fragment from memory at the location pointed to by the iterator. + CUTLASS_DEVICE + void load(Fragment& frag) const { + AccessType* access_ptr = reinterpret_cast(&frag); + using LoadLayout = typename platform:: + conditional::type; + + CUTLASS_PRAGMA_UNROLL + for (int access_m_idx = 0; access_m_idx < + (InstructionCount::kRow * kTilesPerInstruction * kAccessesInner) / 4; + ++access_m_idx) { + MatrixCoord offset; + if (kOperand == Operand::kA) { + offset = MatrixCoord( + access_m_idx * 16, iterations_ * InstructionShape::kColumn); + } else { + offset = MatrixCoord(iterations_ * InstructionShape::kRow, 0); + } + if (kTranspose) { + offset = MatrixCoord(offset.column(), offset.row()); + } + cutlass::arch::ldsm( + access_ptr[access_m_idx], ref_.data() + ref_.offset(offset)); + } + } +}; + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace warp +} // namespace gemm +} // namespace cutlass +//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/fna/kernel_forward.h b/csrc/include/natten/cuda/fna/kernel_forward.h new file mode 100644 index 0000000..8c8fbdb --- /dev/null +++ b/csrc/include/natten/cuda/fna/kernel_forward.h @@ -0,0 +1,1168 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Fused Neighborhood Attention kernels are heavily based on the + * memory-efficient attention kernels from the xFormers project by Meta + * Platforms, Inc. + * + * Copyright (c) Facebook, Inc. and its affiliates + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#define CACHE_NEIGHBORHOOD_COORDINATES + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +namespace natten { +namespace cuda { +namespace fna { + +namespace { +template +constexpr int getWarpsPerSmFw() { + return ( + Arch::kMinComputeCapability >= 80 && + !cutlass::platform::is_same::value + ? 16 + : 12); +} +static CUTLASS_DEVICE float atomicMaxFloat(float* addr, float value) { + // source: https://stackoverflow.com/a/51549250 + return (value >= 0) + ? __int_as_float(atomicMax((int*)addr, __float_as_int(value))) + : __uint_as_float(atomicMin((unsigned int*)addr, __float_as_uint(value))); +} + +} // namespace + +template < + // NA spatial dimension; can be 1 (NA1d), 2 (NA2d), or 3 (NA3d). + int NADim_, + typename CausalMask, + // The datatype of Q/K/V + typename scalar_t_, + // Architecture we are targeting (eg `cutlass::arch::Sm80`) + typename ArchTag, + // If Q/K/V are correctly aligned in memory and we can run a fast kernel + bool isAligned_, + int kQueriesPerBlock_, + int kKeysPerBlock_, + // upperbound on `max(value.shape[-1], query.shape[-1])` + int kMaxK_ = (int)cutlass::platform::numeric_limits::max(), + bool kSupportsRPB_ = false> +struct FusedNeighborhoodAttentionKernel { + static constexpr int NADim = NADim_; + static_assert(NADim >= 1 && NADim < 4, "Only 1D-3D NA are implemented."); + using Dim = typename GetDim::type; + using NAMask = NeighborhoodAttentionMask; + + static constexpr int kKeysPerBlock = kKeysPerBlock_; + static constexpr int kQueriesPerBlock = kQueriesPerBlock_; + static constexpr int kMaxK = kMaxK_; + + // static constexpr Dim QueryTileShape = MapTileSizeToNd::value; static constexpr Dim KeyTileShape = + // MapTileSizeToNd::value; + static constexpr bool kHasCausalDims = CausalMask::AnyCausalDims; + static constexpr bool kSupportsRPB = kSupportsRPB_; + static_assert( + !kSupportsRPB || !kHasCausalDims, + "Causal NA does not support RPB yet."); + + using scalar_t = scalar_t_; + using accum_t = float; + using lse_scalar_t = float; + using output_t = scalar_t; + // Accumulator between 2 iterations + // Using `accum_t` improves perf on f16 at the cost of + // numerical errors + using output_accum_t = accum_t; + static constexpr bool kIsAligned = isAligned_; + static constexpr bool kSingleValueIteration = kMaxK <= kKeysPerBlock; + static constexpr int32_t kAlignLSE = 32; // block size of backward + static constexpr bool kIsHalf = cutlass::sizeof_bits::value == 16; + static constexpr bool kPreloadV = + ArchTag::kMinComputeCapability >= 80 && kIsHalf; + static constexpr bool kKeepOutputInRF = kSingleValueIteration; + static constexpr bool kNeedsOutputAccumulatorBuffer = !kKeepOutputInRF && + !cutlass::platform::is_same::value; + + static_assert(kQueriesPerBlock % 32 == 0, ""); + static_assert(kKeysPerBlock % 32 == 0, ""); + static constexpr int kNumWarpsPerBlock = + kQueriesPerBlock * kKeysPerBlock / (32 * 32); + static constexpr int kWarpSize = 32; + + // Launch bounds + static constexpr int kNumThreads = kWarpSize * kNumWarpsPerBlock; + static constexpr int kMinBlocksPerSm = + getWarpsPerSmFw() / kNumWarpsPerBlock; + + struct Params { + // Input tensors + scalar_t* query_ptr = nullptr; // [..., num_heads, head_dim] + scalar_t* key_ptr = nullptr; // [..., num_heads, head_dim] + scalar_t* value_ptr = nullptr; // [..., num_heads, head_dim_value] + + scalar_t* rpb_ptr = nullptr; // [num_heads, *(kernel_size * 2 - 1)] + + // Output tensors + output_t* output_ptr = + nullptr; // [num_queries_post_partitioning, num_heads, head_dim_value] + // [num_queries_post_partitioning, num_heads, head_dim_value] + output_accum_t* output_accum_ptr = nullptr; + // [num_heads, num_queries_post_partitioning] - can be null + lse_scalar_t* logsumexp_ptr = nullptr; + + // Sliding window. ignored if == 0 + Dim kernel_size; + Dim cta_shape_x; + + // Scale + accum_t scale = 0.0; + + // Dimensions/strides + int32_t head_dim = 0; + int32_t head_dim_value = 0; + Dim num_queries; + Dim num_queries_post_partitioning; + + Dim query_tile_shape; + Dim key_tile_shape; + + Dim q_strideM; + Dim k_strideM; + Dim v_strideM; + Dim o_strideM; + + Dim rpb_stride; + + int32_t num_heads = 0; + int32_t num_batches = 0; + + Dim dilation; + + // Moves pointers to what we should process + // Returns "false" if there is no work to do + CUTLASS_DEVICE bool advance_to_block() { + num_queries_post_partitioning = ceil_div_dim(num_queries, dilation); + + auto batch_id = blockIdx.z; + auto bidxy = blockIdx.y; + auto dilation_size = dilation.prod32(); + auto dilation_dim_idx = (int32_t)bidxy % dilation_size; + auto dilation_idx = map_index_to_coord(dilation_dim_idx, dilation); + auto head_id = bidxy / dilation_size; + + auto q_strideH = head_dim; + auto k_strideH = head_dim; + auto v_strideH = head_dim_value; + auto o_strideH = head_dim_value; + + auto q_heads_dims = num_heads * q_strideH; + auto k_heads_dims = num_heads * k_strideH; + auto v_heads_dims = num_heads * v_strideH; + auto o_heads_dims = num_heads * o_strideH; + + auto q_stride_dilation = compute_stride(num_queries, q_heads_dims); + auto k_stride_dilation = compute_stride(num_queries, k_heads_dims); + auto v_stride_dilation = compute_stride(num_queries, v_heads_dims); + auto o_stride_dilation = compute_stride(num_queries, o_heads_dims); + + q_strideM = q_stride_dilation * dilation; + k_strideM = k_stride_dilation * dilation; + v_strideM = v_stride_dilation * dilation; + o_strideM = o_stride_dilation * dilation; + + auto q_strideB = num_queries.prod() * q_heads_dims; + auto k_strideB = num_queries.prod() * k_heads_dims; + auto v_strideB = num_queries.prod() * v_heads_dims; + auto o_strideB = num_queries.prod() * o_heads_dims; + + maybe_mask_qk_tiles( + num_queries_post_partitioning, num_queries, dilation, dilation_idx); + + cta_shape_x = + ceil_div_dim(num_queries_post_partitioning, query_tile_shape); + + const auto first_query = + map_index_to_coord((int32_t)blockIdx.x, cta_shape_x) * + query_tile_shape; + + // TODO: + // auto lse_dim = gemm_kernel_utils::ceil_div((int32_t)queries_end, + // kAlignLSE) * kAlignLSE; + + // Advance to current batch + query_ptr += batch_id * q_strideB; + key_ptr += batch_id * k_strideB; + value_ptr += batch_id * v_strideB; + output_ptr += batch_id * o_strideB; + if (output_accum_ptr != nullptr) { + output_accum_ptr += batch_id * o_strideB; + } + + // Advance to the current batch / head / first_query + query_ptr += (first_query * q_strideM).sum() + + (dilation_idx * q_stride_dilation).sum() + head_id * q_strideH; + key_ptr += (dilation_idx * k_stride_dilation).sum() + head_id * k_strideH; + value_ptr += + (dilation_idx * v_stride_dilation).sum() + head_id * v_strideH; + output_ptr += (first_query * o_strideM).sum() + + (dilation_idx * o_stride_dilation).sum() + head_id * o_strideH; + + if constexpr (kSupportsRPB) { + if (rpb_ptr != nullptr) { + auto head_rpb_shape = (kernel_size * 2) - 1; + rpb_ptr += head_id * head_rpb_shape.prod(); + rpb_stride = compute_stride(head_rpb_shape, 1); + } + } + + if (output_accum_ptr != nullptr) { + output_accum_ptr += (first_query * o_strideM).sum() + + (dilation_idx * o_stride_dilation).sum() + head_id * o_strideH; + } else { + // Accumulate directly in the destination buffer (eg for f32) + output_accum_ptr = (accum_t*)output_ptr; + } + + if (logsumexp_ptr != nullptr) { + // TODO::: LSE + // // lse[batch_id, head_id, first_query] + // logsumexp_ptr += + // batch_id * lse_dim * num_heads + head_id * lse_dim + first_query; + } + + num_batches = 0; // no longer used after + // dilation = 0; + + // Make sure the compiler knows these variables are the same on all + // the threads of the warp. + // Only worth doing if they could have been modified above. + query_ptr = gemm_kernel_utils::warp_uniform(query_ptr); + key_ptr = gemm_kernel_utils::warp_uniform(key_ptr); + value_ptr = gemm_kernel_utils::warp_uniform(value_ptr); + output_ptr = gemm_kernel_utils::warp_uniform(output_ptr); + output_accum_ptr = gemm_kernel_utils::warp_uniform(output_accum_ptr); + logsumexp_ptr = gemm_kernel_utils::warp_uniform(logsumexp_ptr); + num_heads = gemm_kernel_utils::warp_uniform(num_heads); + return true; + } + + __host__ dim3 getBlocksGrid() const { + return dim3( + ceil_div_dim(ceil_div_dim(num_queries, dilation), query_tile_shape) + .prod32(), + num_heads * dilation.prod32(), + num_batches); + } + + __host__ dim3 getThreadsGrid() const { + return dim3(kWarpSize, kNumWarpsPerBlock, 1); + } + }; + + struct MM0 { + /* + In this first matmul, we compute a block of `Q @ K.T`. + While the calculation result is still hot in registers, we update + `mi`, `m_prime`, `s_prime` in shared-memory, and then store this value + into a shared-memory ("AccumulatorSharedStorage") that is used later as + operand A for the second matmul (see MM1) + */ + using GemmType = gemm_kernel_utils::DefaultGemmType; + + using OpClass = typename GemmType::OpClass; + using DefaultConfig = + typename cutlass::gemm::device::DefaultGemmConfiguration< + OpClass, + ArchTag, + scalar_t, + scalar_t, + scalar_t, // ElementC + accum_t // ElementAccumulator + >; + static constexpr int kAlignmentA = + kIsAligned ? DefaultConfig::kAlignmentA : GemmType::kMinimumAlignment; + static constexpr int kAlignmentB = + kIsAligned ? DefaultConfig::kAlignmentB : GemmType::kMinimumAlignment; + using ThreadblockShape = cutlass::gemm:: + GemmShape; + using WarpShape = cutlass::gemm::GemmShape<32, 32, GemmType::WarpK>; + using DefaultMma = typename cutlass::gemm::threadblock::FindDefaultMma< + NADim, + scalar_t, // ElementA, + cutlass::layout::RowMajor, // LayoutA, + kAlignmentA, + scalar_t, // ElementB, + cutlass::layout::ColumnMajor, // LayoutB, + kAlignmentB, + accum_t, + cutlass::layout::RowMajor, // LayoutC, + OpClass, + ArchTag, // ArchTag + ThreadblockShape, // ThreadblockShape + WarpShape, // WarpShape + typename GemmType::InstructionShape, // InstructionShape + ArchTag::kMinComputeCapability >= 80 && kIsHalf + ? 4 + : DefaultConfig::kStages, + typename GemmType::Operator // Operator + >::DefaultMma; + using MmaCore = typename DefaultMma::MmaCore; + using IteratorA = typename DefaultMma::IteratorA; + using IteratorB = typename DefaultMma::IteratorB; + using DefaultThreadblockMma = typename DefaultMma::ThreadblockMma; + using Mma = typename cutlass::platform::conditional< + kSingleValueIteration, + typename MakeCustomMma::Mma, + DefaultThreadblockMma>::type; + using AccumLambdaIterator = typename DefaultMmaAccumLambdaIterator< + typename Mma::Operator::IteratorC, + accum_t, + kWarpSize>::Iterator; + static_assert( + MmaCore::WarpCount::kM * MmaCore::WarpCount::kN * + MmaCore::WarpCount::kK == + kNumWarpsPerBlock, + ""); + + // Epilogue to store to shared-memory in a format that we can use later for + // the second matmul + using B2bGemm = typename cutlass::gemm::threadblock::B2bGemm< + typename Mma::Operator::IteratorC, + typename Mma::Operator, + scalar_t, + WarpShape, + ThreadblockShape>; + using AccumulatorSharedStorage = typename B2bGemm::AccumulatorSharedStorage; + }; + + struct MM1 { + /** + Second matmul: perform `attn @ V` where `attn` is the attention (not + normalized) and stored in shared memory + */ + using GemmType = gemm_kernel_utils::DefaultGemmType; + + using OpClass = typename GemmType::OpClass; + using DefaultConfig = + typename cutlass::gemm::device::DefaultGemmConfiguration< + OpClass, + ArchTag, + scalar_t, + scalar_t, + output_accum_t, // ElementC + accum_t // ElementAccumulator + >; + static constexpr int kAlignmentA = DefaultConfig::kAlignmentA; // from smem + static constexpr int kAlignmentB = + kIsAligned ? DefaultConfig::kAlignmentB : GemmType::kMinimumAlignment; + using ThreadblockShape = cutlass::gemm:: + GemmShape; + using WarpShape = cutlass::gemm::GemmShape<32, 32, GemmType::WarpK>; + using InstructionShape = typename GemmType::InstructionShape; + + using LayoutB = cutlass::layout::RowMajor; + using DefaultGemm = cutlass::gemm::kernel::DefaultGemm< + scalar_t, // ElementA, + cutlass::layout::RowMajor, // LayoutA, + kAlignmentA, + scalar_t, // ElementB, + LayoutB, // LayoutB, + kAlignmentB, + output_accum_t, + cutlass::layout::RowMajor, // LayoutC, + accum_t, + OpClass, + ArchTag, + ThreadblockShape, + WarpShape, + typename GemmType::InstructionShape, + typename DefaultConfig::EpilogueOutputOp, + void, // ThreadblockSwizzle - not used + ArchTag::kMinComputeCapability >= 80 && kIsHalf + ? 4 + : DefaultConfig::kStages, + false, // SplitKSerial + typename GemmType::Operator>; + + using WarpIteratorA = typename cutlass::gemm::threadblock:: + DefaultWarpIteratorAFromSharedMemory< + typename DefaultGemm::Mma::Policy::Operator::Shape, // WarpShape + typename DefaultGemm::Mma::Policy::Operator::InstructionShape, + typename DefaultGemm::Mma::Policy::Operator::IteratorA, + typename DefaultGemm::Mma::Policy>::WarpIterator; + using DefaultMmaFromSmem = + typename cutlass::gemm::threadblock::DefaultMmaFromSharedMemory< + NADim, + typename DefaultGemm::Mma, + MM0::AccumulatorSharedStorage::Shape::kN, // kMaxK + WarpIteratorA, + false>; // kScaleOperandA + using Mma = typename DefaultMmaFromSmem::Mma; + using IteratorB = typename Mma::IteratorB; + using WarpCount = typename Mma::WarpCount; + static_assert( + WarpCount::kM * WarpCount::kN * WarpCount::kK == kNumWarpsPerBlock, + ""); + + using DefaultEpilogue = typename DefaultGemm::Epilogue; + using OutputTileIterator = + typename cutlass::epilogue::threadblock::CustomPredicatedTileIterator< + NADim, + kQueriesPerBlock, + typename DefaultEpilogue::OutputTileIterator::ThreadMap, + output_t>; + using OutputTileIteratorAccum = + typename cutlass::epilogue::threadblock::CustomPredicatedTileIterator< + NADim, + kQueriesPerBlock, + typename DefaultEpilogue::OutputTileIterator::ThreadMap, + output_accum_t>; + }; + + static constexpr int64_t kAlignmentQ = MM0::kAlignmentA; + static constexpr int64_t kAlignmentK = MM0::kAlignmentB; + static constexpr int64_t kAlignmentV = 1; + + // Shared storage - depends on kernel params + struct ScalingCoefs { + cutlass::Array m_prime; + cutlass::Array s_prime; + cutlass::Array mi; + cutlass::Array out_rescale; + cutlass::Array + addition_storage; + }; + + struct SharedStorageEpilogueAtEnd : ScalingCoefs { + struct SharedStorageAfterMM0 { + // Everything here might be overwritten during MM0 + union { + typename MM0::AccumulatorSharedStorage si; + }; + typename MM1::Mma::SharedStorage mm1; + }; + + union { + typename MM0::Mma::SharedStorage mm0; + SharedStorageAfterMM0 after_mm0; + typename MM1::DefaultEpilogue::SharedStorage epilogue; + }; + + CUTLASS_DEVICE typename MM1::DefaultEpilogue::SharedStorage& + epilogue_shared_storage() { + return epilogue; + } + }; + + struct SharedStorageEpilogueInLoop : ScalingCoefs { + struct SharedStorageAfterMM0 { + // Everything here might be overwritten during MM0 + union { + typename MM0::AccumulatorSharedStorage si; + }; + typename MM1::Mma::SharedStorage mm1; + typename MM1::DefaultEpilogue::SharedStorage epilogue; + }; + + union { + typename MM0::Mma::SharedStorage mm0; + SharedStorageAfterMM0 after_mm0; + }; + + CUTLASS_DEVICE typename MM1::DefaultEpilogue::SharedStorage& + epilogue_shared_storage() { + return after_mm0.epilogue; + } + }; + + using SharedStorage = typename cutlass::platform::conditional< + kSingleValueIteration || kKeepOutputInRF, + SharedStorageEpilogueAtEnd, + SharedStorageEpilogueInLoop>::type; + + static bool __host__ check_supported(Params const& p) { + CHECK_ALIGNED_PTR(p.query_ptr, kAlignmentQ); + CHECK_ALIGNED_PTR(p.key_ptr, kAlignmentK); + CHECK_ALIGNED_PTR(p.value_ptr, kAlignmentV); + NATTEN_CHECK( + p.head_dim % kAlignmentQ == 0, + "query is not correctly aligned (strideM)"); + NATTEN_CHECK( + p.head_dim % kAlignmentK == 0, + "key is not correctly aligned (strideM)"); + NATTEN_CHECK( + p.head_dim_value % kAlignmentV == 0, + "value is not correctly aligned (strideM)"); + return true; + } + + static void CUTLASS_DEVICE attention_kernel(Params& p) { + // In this block, we will only ever: + // - read query[first_query:last_query, :] + // - write to output[first_query:last_query, :] + + extern __shared__ char smem_buffer[]; + SharedStorage& shared_storage = *((SharedStorage*)smem_buffer); + auto& m_prime = shared_storage.m_prime; + auto& s_prime = shared_storage.s_prime; + auto& mi = shared_storage.mi; + auto& out_rescale = shared_storage.out_rescale; + auto first_query = map_index_to_coord((int32_t)blockIdx.x, p.cta_shape_x) * + p.query_tile_shape; + auto problem_size_0_m = fast_min( + p.query_tile_shape, p.num_queries_post_partitioning - first_query); + auto last_query = first_query + problem_size_0_m - 1; + auto problem_size_0_m_int = problem_size_0_m.prod32(); + + static_assert(kQueriesPerBlock < kNumWarpsPerBlock * kWarpSize, ""); + if (thread_id() < kQueriesPerBlock) { + s_prime[thread_id()] = accum_t(0); + out_rescale[thread_id()] = accum_t(1.0); + m_prime[thread_id()] = + -cutlass::platform::numeric_limits::infinity(); + mi[thread_id()] = -cutlass::platform::numeric_limits::infinity(); + } + typename MM1::Mma::FragmentC accum_o; + accum_o.clear(); + + auto createOutputIter = [&](int col) -> typename MM1::OutputTileIterator { + using OutputTileIterator = typename MM1::OutputTileIterator; + return OutputTileIterator( + typename OutputTileIterator::Params{p.o_strideM, problem_size_0_m}, + p.output_ptr, + problem_size_0_m, + p.head_dim_value, + thread_id(), + {0, col}); + }; + + auto createOutputAccumIter = [&](int col) -> + typename MM1::OutputTileIteratorAccum { + using OutputTileIteratorAccum = typename MM1::OutputTileIteratorAccum; + return OutputTileIteratorAccum( + typename OutputTileIteratorAccum::Params{ + p.o_strideM, problem_size_0_m}, + p.output_accum_ptr, + problem_size_0_m, + p.head_dim_value, + thread_id(), + {0, col}); + }; + + int32_t const& problem_size_0_k_int = p.head_dim; + int32_t const& problem_size_1_n_int = p.head_dim_value; + auto gemm_k_iterations = + (problem_size_0_k_int + MM0::Mma::Shape::kK - 1) / MM0::Mma::Shape::kK; + const int64_t nBlockN = kSingleValueIteration + ? 1 + : gemm_kernel_utils::ceil_div( + (int64_t)problem_size_1_n_int, + int64_t(MM1::ThreadblockShape::kN)); + + auto na_mask = NAMask(p.kernel_size, p.num_queries_post_partitioning); + + auto first_key = na_mask.get_window_start(first_query); + auto last_key = na_mask.get_window_end( + last_query, na_mask.get_window_start(last_query)); + + auto my_warp_id = gemm_kernel_utils::warp_uniform(warp_id()); + auto my_lane_id = lane_id(); + + typename MM0::Mma::Operator::IteratorC::TensorCoord iteratorC_tile_offset = + {/*(tb_tile_offset.m() * MM0::Mma::WarpCount::kM) +*/ + (my_warp_id % MM0::Mma::WarpCount::kM), + /*(tb_tile_offset.n() * MM0::Mma::WarpCount::kN) +*/ + (my_warp_id / MM0::Mma::WarpCount::kM)}; + + auto lane_offset = MM0::AccumLambdaIterator::get_lane_offset( + my_lane_id, my_warp_id, iteratorC_tile_offset); + + int warp_idx_mn_0 = my_warp_id % + (MM0::Mma::Base::WarpCount::kM * MM0::Mma::Base::WarpCount::kN); + auto output_tile_coords = cutlass::MatrixCoord{ + warp_idx_mn_0 % MM0::Mma::Base::WarpCount::kM, + warp_idx_mn_0 / MM0::Mma::Base::WarpCount::kM}; + +#ifdef CACHE_NEIGHBORHOOD_COORDINATES + // NA mask info + static constexpr auto kNumRows = MM0::AccumLambdaIterator::kRowIters; + Dim first_cols[kNumRows]; + // Dim last_cols[kNumRows]; + Dim key_bounds[kNumRows]; + Dim rpb_starts[kNumRows]; + MM0::AccumLambdaIterator::iterateRows( + lane_offset, + [&](int accum_m) { + auto row_idx = + map_index_to_coord((int32_t)accum_m, problem_size_0_m) + + first_query; + first_cols[accum_m] = na_mask.get_window_start(row_idx); + // last_cols[accum_m] = na_mask.get_window_end(row_idx, + // first_cols[accum_m]); + key_bounds[accum_m] = + na_mask.get_window_end(row_idx, first_cols[accum_m]) - + first_cols[accum_m]; + if constexpr (kSupportsRPB) { + rpb_starts[accum_m] = na_mask.get_rpb_start(row_idx); + } + }, + [&](int accum_m, int accum_n, int idx) {}, + [&](int accum_m) {}); +#endif + + // Iterate through keys + for (auto iter_key_start = first_key; + is_coord_within_upper_bound(iter_key_start, last_key); + increment_tile(iter_key_start, p.key_tile_shape, last_key)) { + const auto problem_size_0_n = + fast_min(p.key_tile_shape, last_key - iter_key_start); + auto const& problem_size_1_k = problem_size_0_n; + auto problem_size_0_n_int = problem_size_0_n.prod32(); + auto& gemm_1_num_iterations = problem_size_0_n_int; + + auto& last_kv_col = gemm_1_num_iterations; + bool is_first_kv_iter = iter_key_start == first_key; + bool is_last_kv_iter = + is_tile_last(iter_key_start, p.key_tile_shape, last_key); + + auto prologueV = [&](int blockN) { + typename MM1::Mma::IteratorB iterator_V( + typename MM1::IteratorB::Params{p.v_strideM, problem_size_1_k}, + p.value_ptr + (iter_key_start * p.v_strideM).sum(), + problem_size_1_k, + problem_size_1_n_int, + thread_id(), + cutlass::MatrixCoord{0, blockN * MM1::Mma::Shape::kN}); + MM1::Mma::prologue( + shared_storage.after_mm0.mm1, + iterator_V, + thread_id(), + gemm_1_num_iterations); + }; + + __syncthreads(); // Need to have shared memory initialized, and `m_prime` + // updated from end of prev iter + // + // MATMUL: Q.K_t + // + // Computes the block-matrix product of: + // (a) query[first_query:last_query, :] + // with + // (b) key[iter_key_start:iter_key_start + kKeysPerBlock] + // and stores that into `shared_storage.si` + // + + // Construct iterators to A and B operands + typename MM0::IteratorA iterator_A( + typename MM0::IteratorA::Params(p.q_strideM, problem_size_0_m), + p.query_ptr, + problem_size_0_m, + problem_size_0_k_int, + thread_id()); + + typename MM0::IteratorB iterator_B( + typename MM0::IteratorB::Params(p.k_strideM, problem_size_0_n), + p.key_ptr + (iter_key_start * p.k_strideM).sum(), + problem_size_0_n, + problem_size_0_k_int, + thread_id()); + + // Construct thread-scoped matrix multiply + typename MM0::Mma mma( + shared_storage.mm0, thread_id(), my_warp_id, my_lane_id); + + typename MM0::Mma::FragmentC accum; + + accum.clear(); + + // Compute threadblock-scoped matrix multiply-add + mma(gemm_k_iterations, accum, iterator_A, iterator_B, accum); + __syncthreads(); + + if (kPreloadV) { + prologueV(0); + } else { + MM1::Mma::drain_cp_asyncs(); + } + + // Neighborhood Attention masking + // if (p.kernel_size.prod32() > 0) { +#ifndef CACHE_NEIGHBORHOOD_COORDINATES + // Dim first_col, last_col, row_idx; + Dim first_col, key_bound, row_idx; + Dim rpb_start; +#endif + MM0::AccumLambdaIterator::iterateRows( + lane_offset, + [&](int accum_m) { +#ifndef CACHE_NEIGHBORHOOD_COORDINATES + row_idx = map_index_to_coord((int32_t)accum_m, problem_size_0_m) + + first_query; + first_col = na_mask.get_window_start(row_idx); + // last_col = na_mask.get_window_end(row_idx, first_col); + key_bound = na_mask.get_window_end(row_idx, first_col) - first_col; + if constexpr (kSupportsRPB) { + rpb_start = na_mask.get_rpb_start(row_idx); + } +#endif + }, + [&](int accum_m, int accum_n, int idx) { + auto col = map_index_to_coord((int32_t)accum_n, problem_size_0_n) + + iter_key_start; + if constexpr (!kSupportsRPB) { +#ifndef CACHE_NEIGHBORHOOD_COORDINATES + if (!is_coord_within_bounds_nn(col - first_col, key_bound)) { + // if (!is_coord_within_bounds(col, first_col, last_col)) { +#else + // if (!is_coord_within_bounds(col, first_cols[accum_m], + // last_cols[accum_m])) { + if (!is_coord_within_bounds_nn( + col - first_cols[accum_m], key_bounds[accum_m])) { +#endif + accum[idx] = + -cutlass::platform::numeric_limits::infinity(); + } + } else { + // NOTE: Flipped the condition for kernels with RPB so we can + // avoid checking whether the rpb offset goes out of bounds. +#ifndef CACHE_NEIGHBORHOOD_COORDINATES + col = col - first_col; + auto rpb_idx = rpb_start + col; + if (is_coord_within_bounds_nn(col, key_bound)) { +#else + col = col - first_cols[accum_m]; + auto rpb_idx = rpb_starts[accum_m] + col; + if (is_coord_within_bounds_nn(col, key_bounds[accum_m])) { +#endif + accum[idx] = p.scale * accum[idx] + (accum_t)(p.rpb_ptr[(rpb_idx * p.rpb_stride).sum()]); + } else { + accum[idx] = + -cutlass::platform::numeric_limits::infinity(); + } + } + }, + [&](int accum_m) {}); + //} + + // Update `mi` from accum stored in registers + // Also does accum[i] <- exp(accum[i] - mi) + iterative_softmax( + accum_o, + accum, + mi, + m_prime, + s_prime, + out_rescale, + shared_storage.addition_storage, + my_lane_id, + thread_id(), + my_warp_id, + last_kv_col, + is_first_kv_iter, + iteratorC_tile_offset, + kSupportsRPB ? 1.0 : p.scale); + + // Output results to shared-memory + + MM0::B2bGemm::accumToSmem( + shared_storage.after_mm0.si, accum, my_lane_id, output_tile_coords); + + __syncthreads(); + + // + // MATMUL: Attn . V + // Run the matmul `attn @ V` for a block of attn and V. + // `attn` is read from shared memory (in `shared_storage_si`) + // `V` is read from global memory (with iterator_B) + // + + for (int blockN = 0; blockN < nBlockN; ++blockN) { + int gemm_k_iterations = + (gemm_1_num_iterations + MM1::Mma::Shape::kK - 1) / + MM1::Mma::Shape::kK; + + // Compute threadblock-scoped matrix multiply-add and store it in accum + // (in registers) + if (!kPreloadV) { + __syncthreads(); // we share shmem between mma and epilogue + } + + typename MM1::Mma::IteratorB iterator_V( + typename MM1::IteratorB::Params{p.v_strideM, problem_size_1_k}, + p.value_ptr + (iter_key_start * p.v_strideM).sum(), + problem_size_1_k, + problem_size_1_n_int, + thread_id(), + cutlass::MatrixCoord{0, blockN * MM1::Mma::Shape::kN}); + typename MM1::Mma mma_pv( + // operand A: Pij_dropped in shared memory + shared_storage.after_mm0.si.accum_ref(), + // operand B: shared memory staging area for Vj, which is loaded + // from global memory + shared_storage.after_mm0.mm1.operand_B_ref(), + (int)thread_id(), + (int)my_warp_id, + (int)my_lane_id); + mma_pv.set_prologue_done(kPreloadV); + if (!kKeepOutputInRF) { + accum_o.clear(); + } + mma_pv(gemm_k_iterations, accum_o, iterator_V, accum_o); + __syncthreads(); + + if (kPreloadV && !kSingleValueIteration && blockN + 1 < nBlockN) { + prologueV(blockN + 1); + } + + if (!kKeepOutputInRF) { + MM1::Mma::drain_cp_asyncs(); + DISPATCH_BOOL( + is_first_kv_iter, kIsFirst, ([&] { + DISPATCH_BOOL( + is_last_kv_iter, kIsLast, ([&] { + using DefaultEpilogue = typename MM1::DefaultEpilogue; + using DefaultOp = + typename MM1::DefaultConfig::EpilogueOutputOp; + using ElementCompute = typename DefaultOp::ElementCompute; + using EpilogueOutputOp = typename cutlass::epilogue:: + thread::MemoryEfficientAttentionNormalize< + typename cutlass::platform::conditional< + kIsLast, + output_t, + output_accum_t>::type, + output_accum_t, + DefaultOp::kCount, + typename DefaultOp::ElementAccumulator, + ElementCompute, + kIsFirst, + kIsLast, + cutlass::Array>; + using Epilogue = typename cutlass::epilogue::threadblock:: + EpiloguePipelined< + typename DefaultEpilogue::Shape, + typename MM1::Mma::Operator, + DefaultEpilogue::kPartitionsK, + typename cutlass::platform::conditional< + kIsLast, + typename MM1::OutputTileIterator, + typename MM1::OutputTileIteratorAccum>::type, + typename DefaultEpilogue:: + AccumulatorFragmentIterator, + typename DefaultEpilogue::WarpTileIterator, + typename DefaultEpilogue::SharedLoadIterator, + EpilogueOutputOp, + typename DefaultEpilogue::Padding, + DefaultEpilogue::kFragmentsPerIteration, + true, // IterationsUnroll + typename MM1::OutputTileIteratorAccum // Read + // iterator + >; + + int col = blockN * MM1::Mma::Shape::kN; + auto source_iter = createOutputAccumIter(col); + auto dest_iter = gemm_kernel_utils::call_conditional< + kIsLast, + decltype(createOutputIter), + decltype(createOutputAccumIter)>:: + apply(createOutputIter, createOutputAccumIter, col); + EpilogueOutputOp rescale(s_prime, out_rescale); + Epilogue epilogue( + shared_storage.epilogue_shared_storage(), + thread_id(), + my_warp_id, + my_lane_id); + epilogue(rescale, dest_iter, accum_o, source_iter); + })); + })); + if (!kSingleValueIteration) { + __syncthreads(); + } + } + } + __syncthreads(); // we modify `m_prime` after + } + + if (kKeepOutputInRF) { + constexpr bool kIsFirst = true; + constexpr bool kIsLast = true; + using DefaultEpilogue = typename MM1::DefaultEpilogue; + using DefaultOp = typename MM1::DefaultConfig::EpilogueOutputOp; + using ElementCompute = typename DefaultOp::ElementCompute; + using EpilogueOutputOp = + typename cutlass::epilogue::thread::MemoryEfficientAttentionNormalize< + output_t, // output + output_accum_t, // source + DefaultOp::kCount, + typename DefaultOp::ElementAccumulator, // accum + output_accum_t, // compute + kIsFirst, + kIsLast, + cutlass::Array>; + using Epilogue = + typename cutlass::epilogue::threadblock::EpiloguePipelined< + typename DefaultEpilogue::Shape, + typename MM1::Mma::Operator, + DefaultEpilogue::kPartitionsK, + typename MM1::OutputTileIterator, // destination + typename DefaultEpilogue::AccumulatorFragmentIterator, + typename DefaultEpilogue::WarpTileIterator, + typename DefaultEpilogue::SharedLoadIterator, + EpilogueOutputOp, + typename DefaultEpilogue::Padding, + DefaultEpilogue::kFragmentsPerIteration, + true, // IterationsUnroll + typename MM1::OutputTileIteratorAccum // source tile + >; + auto dest_iter = createOutputIter(0); + EpilogueOutputOp rescale(s_prime, out_rescale); + Epilogue epilogue( + shared_storage.epilogue_shared_storage(), + thread_id(), + warp_id(), + lane_id()); + MM1::Mma::drain_cp_asyncs(); + epilogue(rescale, dest_iter, accum_o); + } + + // TODO: + // 7. Calculate logsumexp + // // To make the backward easier, we pad logsumexp with `inf` + // // this avoids a few bound checks, and is not more expensive during fwd + // static_assert(kQueriesPerBlock < kNumWarpsPerBlock * kWarpSize, ""); + // if (p.logsumexp_ptr && thread_id() < kQueriesPerBlock) { + // auto lse_dim = gemm_kernel_utils::ceil_div((int32_t)p.queries_end, + // kAlignLSE) * kAlignLSE; constexpr float kLog2e = 1.4426950408889634074; + // // log_2(e) = M_LOG2E if (thread_id() < p.queries_end) { + // p.logsumexp_ptr[thread_id()] = accum_t(mi[thread_id()] / kLog2e) + + // cutlass::fast_log(accum_t(s_prime[thread_id()])); + // } else if (thread_id() < lse_dim) { + // p.logsumexp_ptr[thread_id()] = + // cutlass::platform::numeric_limits::infinity(); + // } + // } + } + + template + CUTLASS_DEVICE static void iterative_softmax( + typename WarpIteratorC::Fragment& frag_o, // output so far + typename WarpIteratorC::Fragment& frag, + cutlass::Array& mi, + cutlass::Array& m_prime, + cutlass::Array& s_prime, + cutlass::Array& out_rescale, + cutlass::Array& + addition_storage, + int8_t lane_id, + int8_t thread_id, + int8_t warp_id, + int max_col, + bool is_first, + typename WarpIteratorC::TensorCoord const& tile_offset, + float scaling) { + /* Iterates on the accumulator and corresponding position on result matrix + + (1) Update `mi[r]` to the max value of the row `r` + (2) In a second iteration do the following: + (a) accum <- exp(accum - mi) + (b) m_prime <- exp(m_prime - mi) + (c) s_prime <- s_prime * m_prime + sum(accum) + + All of this is done on registers, before we store all of this + on shared memory for the next matmul with Value. + */ + using Fragment = typename WarpIteratorC::Fragment; + using LambdaIterator = typename DefaultMmaAccumLambdaIterator< + WarpIteratorC, + accum_t, + kWarpSize>::Iterator; + // Convert to `accum_t` (rather than double) + constexpr float kLog2e = 1.4426950408889634074; // log_2(e) = M_LOG2E + + static_assert(kQueriesPerBlock % kNumWarpsPerBlock == 0, ""); + static constexpr int kLinesPerWarp = kQueriesPerBlock / kNumWarpsPerBlock; + + frag = cutlass::multiplies()(scaling * kLog2e, frag); + + auto lane_offset = + LambdaIterator::get_lane_offset(lane_id, warp_id, tile_offset); + + // First update `mi` to the max per-row + { + accum_t max; + LambdaIterator::iterateRows( + lane_offset, + [&](int accum_m) { + max = -cutlass::platform::numeric_limits::infinity(); + }, + [&](int accum_m, int accum_n, int idx) { + if (accum_n < max_col) { + max = cutlass::fast_max(max, frag[idx]); + } + }, + [&](int accum_m) { + // Having 4x atomicMax seems faster than reduce within warp + // first... + atomicMaxFloat(&mi[accum_m], max); + }); + } + + // Make sure we all share the update values for `mi` + __syncthreads(); + + // Doing this `exp` is quite expensive. Let's + // split it across the warps + bool restore_mi_to_minus_inf = false; + if (lane_id < kLinesPerWarp) { + int id = warp_id * kLinesPerWarp + lane_id; + auto m_prime_id = m_prime[id]; + auto mi_id = mi[id]; + bool changed = m_prime_id < mi_id; // `false` if both are -inf + if (changed) { + auto m_prime_exp = exp2f(m_prime_id - mi_id); + out_rescale[id] = m_prime_exp; + s_prime[id] *= m_prime_exp; + } else { + out_rescale[id] = 1.0f; + } + } + __syncthreads(); // Update output fragments + if (kKeepOutputInRF && !is_first) { + accum_t line_rescale; + LambdaIterator::iterateRows( + lane_offset, + [&](int accum_m) { line_rescale = out_rescale[accum_m]; }, + [&](int accum_m, int accum_n, int idx) { + frag_o[idx] = frag_o[idx] * line_rescale; + }, + [&](int accum_m) {}); + } + // Update accum_m, accum_n, ... + { + accum_t mi_row, total_row; + LambdaIterator::iterateRows( + lane_offset, + [&](int accum_m) { mi_row = mi[accum_m]; }, + [&](int accum_m, int accum_n, int idx) { + frag[idx] = + (accum_n < max_col) ? exp2f(frag[idx] - mi_row) : accum_t(0.0); + }, + [&](int accum_m) {}); + LambdaIterator::iterateRows( + lane_offset, + [&](int accum_m) { total_row = 0.0; }, + [&](int accum_m, int accum_n, int idx) { total_row += frag[idx]; }, + [&](int accum_m) { + if (LambdaIterator::reduceSameRow( + lane_id, total_row, [](accum_t a, accum_t b) { + return a + b; + })) { + // NOTE: we could atomically add `total_row` to `s_prime`, but + // it's faster (and deterministic) to avoid atomics here + addition_storage + [accum_m + kQueriesPerBlock * tile_offset.column()] = + total_row; + } + }); + } + __syncthreads(); + if (lane_id < kLinesPerWarp) { + int id = warp_id * kLinesPerWarp + lane_id; + accum_t total_row = s_prime[id]; + if (restore_mi_to_minus_inf) { + // Restore `mi`, see above when we set `restore_mi_to_minus_inf=true` + mi[id] = -cutlass::platform::numeric_limits::infinity(); + } else { + m_prime[id] = mi[id]; + } + CUTLASS_PRAGMA_UNROLL + for (int i = 0; i < MM0::MmaCore::WarpCount::kN; ++i) { + total_row += addition_storage[id + kQueriesPerBlock * i]; + } + s_prime[id] = total_row; + } + } + + static CUTLASS_DEVICE int8_t lane_id() { + return threadIdx.x; + } + static CUTLASS_DEVICE int8_t warp_id() { + return threadIdx.y; + } + static CUTLASS_DEVICE int16_t thread_id() { + return threadIdx.x + threadIdx.y * blockDim.x; + } +}; + +} // namespace fna +} // namespace cuda +} // namespace natten diff --git a/csrc/include/natten/cuda/fna/na_utils.cuh b/csrc/include/natten/cuda/fna/na_utils.cuh new file mode 100644 index 0000000..78df6e2 --- /dev/null +++ b/csrc/include/natten/cuda/fna/na_utils.cuh @@ -0,0 +1,1158 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + *all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **************************************************************************************************/ +/*! \file + \brief Fused NA (FNA) utils. + Holds data structures and helper functions that are templated by + spatial rank (1d, 2d, 3d), and provide (almost) generic interfaces + for the kernel. +*/ +#pragma once + +#include +#include + +#include + +namespace natten { +namespace cuda { +namespace fna { + +struct NA1dDim { + int32_t x; + + // Default ctor + CUTLASS_HOST_DEVICE constexpr NA1dDim(int32_t x_) : x(x_) {} + + CUTLASS_HOST_DEVICE NA1dDim() : x(0) {} + + CUTLASS_HOST_DEVICE void operator=(const NA1dDim& other) { + x = other.x; + } + + // Operators + CUTLASS_HOST_DEVICE NA1dDim operator+(NA1dDim other) const { + return NA1dDim(x + other.x); + } + + CUTLASS_HOST_DEVICE NA1dDim operator*(NA1dDim other) const { + return NA1dDim(x * other.x); + } + + CUTLASS_HOST_DEVICE NA1dDim operator-(NA1dDim other) const { + return NA1dDim(x - other.x); + } + + CUTLASS_HOST_DEVICE NA1dDim operator/(NA1dDim other) const { + return NA1dDim(x / other.x); + } + + CUTLASS_HOST_DEVICE NA1dDim operator+(int32_t other) const { + return NA1dDim(x + other); + } + + CUTLASS_HOST_DEVICE NA1dDim operator*(int32_t other) const { + return NA1dDim(x * other); + } + + CUTLASS_HOST_DEVICE NA1dDim operator-(int32_t other) const { + return NA1dDim(x - other); + } + + CUTLASS_HOST_DEVICE NA1dDim operator/(int32_t other) const { + return NA1dDim(x / other); + } + + // Cmp + // CUTLASS_HOST_DEVICE bool operator<=(NA1dDim other) const { + // return x <= other.x; + // } + + // CUTLASS_HOST_DEVICE bool operator<(NA1dDim other) const { + // return x < other.x; + // } + + // CUTLASS_HOST_DEVICE bool operator>(NA1dDim other) const { + // return x > other.x; + // } + + // CUTLASS_HOST_DEVICE bool operator>=(NA1dDim other) const { + // return x >= other.x; + // } + + CUTLASS_HOST_DEVICE bool operator==(NA1dDim other) const { + return x == other.x; + } + + // This method is used to determine whether or not the current + // coordinate exceeds the spatial extent. This is used in + // the NA mask (`get_window_start`). + // It should NOT overload the >= operator. + CUTLASS_HOST_DEVICE NA1dDim is_overflowing(NA1dDim extent) const { + return NA1dDim(x >= extent.x); + } + + // CUTLASS_HOST_DEVICE bool operator<=(int32_t other) const { + // return x <= other; + //} + + // CUTLASS_HOST_DEVICE bool operator<(int32_t other) const { + // return x < other; + //} + + // CUTLASS_HOST_DEVICE bool operator>(int32_t other) const { + // return x > other; + //} + + // CUTLASS_HOST_DEVICE bool operator>=(int32_t other) const { + // return x >= other; + //} + + // CUTLASS_HOST_DEVICE bool operator==(int32_t other) const { + // return x == other; + //} + + // Reduce + CUTLASS_HOST_DEVICE int64_t sum() const { + return (int64_t)x; + } + + CUTLASS_HOST_DEVICE int64_t prod() const { + return (int64_t)x; + } + + CUTLASS_HOST_DEVICE int32_t prod32() const { + return x; + } +}; + +struct NA2dDim { + int32_t x; + int32_t y; + + // Default ctor + CUTLASS_HOST_DEVICE constexpr NA2dDim(int32_t x_, int32_t y_) + : x(x_), y(y_) {} + + CUTLASS_HOST_DEVICE NA2dDim() : x(0), y(0) {} + + CUTLASS_HOST_DEVICE void operator=(const NA2dDim& other) { + x = other.x; + y = other.y; + } + + // CUTLASS_HOST_DEVICE NA2dDim(int32_t n): x(n), y(n) {} + + // Operators + CUTLASS_HOST_DEVICE NA2dDim operator+(NA2dDim other) const { + return NA2dDim(x + other.x, y + other.y); + } + + CUTLASS_HOST_DEVICE NA2dDim operator*(NA2dDim other) const { + return NA2dDim(x * other.x, y * other.y); + } + + CUTLASS_HOST_DEVICE NA2dDim operator-(NA2dDim other) const { + return NA2dDim(x - other.x, y - other.y); + } + + CUTLASS_HOST_DEVICE NA2dDim operator/(NA2dDim other) const { + return NA2dDim(x / other.x, y / other.y); + } + + CUTLASS_HOST_DEVICE NA2dDim operator+(int32_t other) const { + return NA2dDim(x + other, y + other); + } + + CUTLASS_HOST_DEVICE NA2dDim operator*(int32_t other) const { + return NA2dDim(x * other, y * other); + } + + CUTLASS_HOST_DEVICE NA2dDim operator-(int32_t other) const { + return NA2dDim(x - other, y - other); + } + + CUTLASS_HOST_DEVICE NA2dDim operator/(int32_t other) const { + return NA2dDim(x / other, y / other); + } + + // Cmp + // CUTLASS_HOST_DEVICE bool operator<=(NA2dDim other) const { + // return x <= other.x && y <= other.y; + //} + + // CUTLASS_HOST_DEVICE bool operator<(NA2dDim other) const { + // return x < other.x && y < other.y; + //} + + // CUTLASS_HOST_DEVICE bool operator>(NA2dDim other) const { + // return x > other.x && y > other.y; + //} + + // CUTLASS_HOST_DEVICE bool operator>=(NA2dDim other) const { + // return x >= other.x && y >= other.y; + //} + + CUTLASS_HOST_DEVICE bool operator==(NA2dDim other) const { + return x == other.x && y == other.y; + } + + // This method is used to determine whether or not the current + // coordinate exceeds the spatial extent. This is used in + // the NA mask (`get_window_start`). + // It should NOT overload the >= operator. + CUTLASS_HOST_DEVICE NA2dDim is_overflowing(NA2dDim extent) const { + return NA2dDim(x >= extent.x, y >= extent.y); + } + + // CUTLASS_HOST_DEVICE bool operator<=(int32_t other) const { + // return x <= other && y <= other; + //} + + // CUTLASS_HOST_DEVICE bool operator<(int32_t other) const { + // return x < other && y < other; + //} + + // CUTLASS_HOST_DEVICE bool operator>(int32_t other) const { + // return x > other && y > other; + //} + + // CUTLASS_HOST_DEVICE bool operator>=(int32_t other) const { + // return x >= other && y >= other; + //} + + // CUTLASS_HOST_DEVICE bool operator==(int32_t other) const { + // return x == other && y == other; + //} + + // Reduce + CUTLASS_HOST_DEVICE int64_t sum() const { + return (int64_t)(x + y); + } + + CUTLASS_HOST_DEVICE int64_t prod() const { + return (int64_t)(x * y); + } + + CUTLASS_HOST_DEVICE int32_t prod32() const { + return x * y; + } +}; + +struct NA3dDim { + int32_t x; + int32_t y; + int32_t z; + + // Default ctor + CUTLASS_HOST_DEVICE constexpr NA3dDim(int32_t x_, int32_t y_, int32_t z_) + : x(x_), y(y_), z(z_) {} + + CUTLASS_HOST_DEVICE NA3dDim() : x(0), y(0), z(0) {} + + CUTLASS_HOST_DEVICE void operator=(const NA3dDim& other) { + x = other.x; + y = other.y; + z = other.z; + } + + // CUTLASS_HOST_DEVICE NA3dDim(int32_t n): x(n), y(n), z(n) {} + + // Operators + CUTLASS_HOST_DEVICE NA3dDim operator+(NA3dDim other) const { + return NA3dDim(x + other.x, y + other.y, z + other.z); + } + + CUTLASS_HOST_DEVICE NA3dDim operator*(NA3dDim other) const { + return NA3dDim(x * other.x, y * other.y, z * other.z); + } + + CUTLASS_HOST_DEVICE NA3dDim operator-(NA3dDim other) const { + return NA3dDim(x - other.x, y - other.y, z - other.z); + } + + CUTLASS_HOST_DEVICE NA3dDim operator/(NA3dDim other) const { + return NA3dDim(x / other.x, y / other.y, z / other.z); + } + + CUTLASS_HOST_DEVICE NA3dDim operator+(int32_t other) const { + return NA3dDim(x + other, y + other, z + other); + } + + CUTLASS_HOST_DEVICE NA3dDim operator*(int32_t other) const { + return NA3dDim(x * other, y * other, z * other); + } + + CUTLASS_HOST_DEVICE NA3dDim operator-(int32_t other) const { + return NA3dDim(x - other, y - other, z - other); + } + + CUTLASS_HOST_DEVICE NA3dDim operator/(int32_t other) const { + return NA3dDim(x / other, y / other, z / other); + } + + // Cmp + // CUTLASS_HOST_DEVICE bool operator<=(NA3dDim other) const { + // return x <= other.x && y <= other.y && z <= other.z; + //} + + // CUTLASS_HOST_DEVICE bool operator<(NA3dDim other) const { + // return x < other.x && y < other.y && z < other.z; + //} + + // CUTLASS_HOST_DEVICE bool operator>(NA3dDim other) const { + // return x > other.x && y > other.y && z > other.z; + //} + + // CUTLASS_HOST_DEVICE bool operator>=(NA3dDim other) const { + // return x >= other.x && y >= other.y && z >= other.z; + //} + + CUTLASS_HOST_DEVICE bool operator==(NA3dDim other) const { + return x == other.x && y == other.y && z == other.z; + } + + // This method is used to determine whether or not the current + // coordinate exceeds the spatial extent. This is used in + // the NA mask (`get_window_start`). + // It should NOT overload the >= operator. + CUTLASS_HOST_DEVICE NA3dDim is_overflowing(NA3dDim extent) const { + return NA3dDim(x >= extent.x, y >= extent.y, z >= extent.z); + } + + // CUTLASS_HOST_DEVICE bool operator<=(int32_t other) const { + // return x <= other && y <= other && z <= other; + //} + + // CUTLASS_HOST_DEVICE bool operator<(int32_t other) const { + // return x < other && y < other && z < other; + //} + + // CUTLASS_HOST_DEVICE bool operator>(int32_t other) const { + // return x > other && y > other && z > other; + //} + + // CUTLASS_HOST_DEVICE bool operator>=(int32_t other) const { + // return x >= other && y >= other && z >= other; + //} + + // CUTLASS_HOST_DEVICE bool operator==(int32_t other) const { + // return x == other && y == other && z == other; + //} + + // Reduce + CUTLASS_HOST_DEVICE int64_t sum() const { + return (int64_t)(x + y + z); + } + + CUTLASS_HOST_DEVICE int64_t prod() const { + return (int64_t)(x * y * z); + } + + CUTLASS_HOST_DEVICE int32_t prod32() const { + return x * y * z; + } +}; + +template +struct GetDim; + +template <> +struct GetDim<1> { + using type = NA1dDim; +}; + +template <> +struct GetDim<2> { + using type = NA2dDim; +}; + +template <> +struct GetDim<3> { + using type = NA3dDim; +}; + +// data structure conversions +template +Dim tuple_to_na_dim(TupleType v); + +template <> +inline NA1dDim tuple_to_na_dim(std::tuple v) { + return NA1dDim(std::get<0>(v)); +} + +template <> +inline NA2dDim tuple_to_na_dim(std::tuple v) { + return NA2dDim(std::get<0>(v), std::get<1>(v)); +} + +template <> +inline NA3dDim tuple_to_na_dim(std::tuple v) { + return NA3dDim(std::get<0>(v), std::get<1>(v), std::get<2>(v)); +} + +//// Factories +// template +// struct MakeDim; +// +// template +// struct MakeDim { +// static constexpr NA1dDim value = {Value}; +//}; +// +// template +// struct MakeDim { +// static constexpr NA2dDim value = {Value, Value}; +//}; +// +// template +// struct MakeDim { +// static constexpr NA3dDim value = {Value, Value, Value}; +//}; + +//// Tile mappings +// template +// struct MapTileSizeToNd; +// +//// Identity mapping for all 1D problems. +// template +// struct MapTileSizeToNd { +// static constexpr NA1dDim value = TileSize; +//}; +// +//// 2D problems +// template <> +// struct MapTileSizeToNd<32, 2> { +// static constexpr NA2dDim value = {2, 16}; +//}; +// +// template <> +// struct MapTileSizeToNd<64, 2> { +// static constexpr NA2dDim value = {4, 16}; +//}; +// +// template <> +// struct MapTileSizeToNd<128, 2> { +// static constexpr NA2dDim value = {8, 16}; +//}; +// +//// 3D problems +// template <> +// struct MapTileSizeToNd<32, 3> { +// static constexpr NA3dDim value = {2, 2, 8}; +//}; +// +// template <> +// struct MapTileSizeToNd<64, 3> { +// static constexpr NA3dDim value = {4, 4, 4}; +//}; +// +// template <> +// struct MapTileSizeToNd<128, 3> { +// static constexpr NA3dDim value = {4, 4, 8}; +//}; + +// template +// struct Divmod; +// +// template <> +// struct Divmod<1> { +// using Dim = typename GetDim<1>::type; +// +// cutlass::FastDivmod x; +// +// CUTLASS_HOST_DEVICE constexpr Divmod(Dim divisor): x((int)divisor.x) {} +// +// CUTLASS_HOST_DEVICE void operator()(Dim "ient, Dim &remainder, Dim +// dividend) const { +// x(quotient.x, remainder.x, dividend.x); +// } +// }; +// +// template <> +// struct Divmod<2> { +// using Dim = typename GetDim<2>::type; +// +// cutlass::FastDivmod x; +// cutlass::FastDivmod y; +// +// CUTLASS_HOST_DEVICE constexpr Divmod(Dim divisor): x((int)divisor.x), +// y((int)divisor.y) {} +// +// CUTLASS_HOST_DEVICE void operator()(Dim "ient, Dim &remainder, Dim +// dividend) const { +// x(quotient.x, remainder.x, dividend.x); +// y(quotient.y, remainder.y, dividend.y); +// } +// }; +// +// template <> +// struct Divmod<3> { +// using Dim = typename GetDim<3>::type; +// +// cutlass::FastDivmod x; +// cutlass::FastDivmod y; +// cutlass::FastDivmod z; +// +// CUTLASS_HOST_DEVICE constexpr Divmod(Dim divisor): x((int)divisor.x), +// y((int)divisor.y) {} +// +// CUTLASS_HOST_DEVICE void operator()(Dim "ient, Dim &remainder, Dim +// dividend) const { +// x(quotient.x, remainder.x, dividend.x); +// y(quotient.y, remainder.y, dividend.y); +// } +// }; + +// template +// struct CoordMapper; +// +// template <> +// struct CoordMapper <1> { +// using Dim = typename GetDim<1>::type; +// +// CUTLASS_HOST_DEVICE CoordMapper(Dim block_shape) {} +// +// CUTLASS_HOST_DEVICE Dim operator()(int32_t block_index) { +// return Dim(block_index); +// } +//}; +// +// template <> +// struct CoordMapper <2> { +// using Dim = typename GetDim<2>::type; +// +// cutlass::FastDivmod divmod_y; +// +// CUTLASS_HOST_DEVICE CoordMapper(Dim block_shape): +// divmod_y((int)block_shape.y) {} +// +// CUTLASS_HOST_DEVICE Dim operator()(int32_t block_index) { +// int index_x, index_y; +// divmod_y(index_x, index_y, block_index); +// return Dim(index_x, index_y); +// } +//}; +// +// template <> +// struct CoordMapper <3> { +// using Dim = typename GetDim<3>::type; +// +// cutlass::FastDivmod divmod_y; +// cutlass::FastDivmod divmod_z; +// +// CUTLASS_HOST_DEVICE CoordMapper(Dim block_shape): +// divmod_y((int)block_shape.y), divmod_z((int)block_shape.z) {} +// +// CUTLASS_HOST_DEVICE Dim operator()(int32_t block_index) { +// int index_x, index_y, index_z, index_xy; +// divmod_z(index_xy, index_z, block_index); +// divmod_z(index_x, index_y, index_xy); +// return Dim(index_x, index_y, index_z); +// } +//}; + +template +CUTLASS_DEVICE Dim map_index_to_coord(int32_t block_index, Dim block_shape); + +template <> +CUTLASS_DEVICE NA1dDim +map_index_to_coord(int32_t block_index, NA1dDim block_shape) { + // 1d is just linear indexing. + return NA1dDim(block_index); +}; + +template <> +CUTLASS_DEVICE NA2dDim +map_index_to_coord(int32_t block_index, NA2dDim block_shape) { + auto index_x = block_index / block_shape.y; + return NA2dDim(index_x, block_index - index_x * block_shape.y); +} + +template <> +CUTLASS_DEVICE NA3dDim +map_index_to_coord(int32_t block_index, NA3dDim block_shape) { + auto index_z = block_index % block_shape.z; + auto index_xy = block_index / block_shape.z; + auto index_y = index_xy % block_shape.y; + auto index_x = index_xy / block_shape.y; + return NA3dDim(index_x, index_y, index_z); +} + +template +CUTLASS_DEVICE int32_t map_coord_to_index(Dim coord, Dim block_shape); + +template <> +CUTLASS_DEVICE int32_t map_coord_to_index(NA1dDim coord, NA1dDim block_shape) { + // 1d is just linear indexing. + return coord.x; +} + +template <> +CUTLASS_DEVICE int32_t map_coord_to_index(NA2dDim coord, NA2dDim block_shape) { + return coord.x * block_shape.y + coord.y; +} + +template <> +CUTLASS_DEVICE int32_t map_coord_to_index(NA3dDim coord, NA3dDim block_shape) { + return coord.x * block_shape.y * block_shape.z + coord.y * block_shape.z + + coord.z; +} + +template +CUTLASS_DEVICE Dim fast_min(Dim lhs, Dim rhs); + +template <> +CUTLASS_DEVICE NA1dDim fast_min(NA1dDim lhs, NA1dDim rhs) { + return NA1dDim(cutlass::fast_min(lhs.x, rhs.x)); +} + +template <> +CUTLASS_DEVICE NA2dDim fast_min(NA2dDim lhs, NA2dDim rhs) { + return NA2dDim( + cutlass::fast_min(lhs.x, rhs.x), cutlass::fast_min(lhs.y, rhs.y)); +} + +template <> +CUTLASS_DEVICE NA3dDim fast_min(NA3dDim lhs, NA3dDim rhs) { + return NA3dDim( + cutlass::fast_min(lhs.x, rhs.x), + cutlass::fast_min(lhs.y, rhs.y), + cutlass::fast_min(lhs.z, rhs.z)); +} + +template +CUTLASS_DEVICE Dim fast_max(Dim lhs, Dim rhs); + +template <> +CUTLASS_DEVICE NA1dDim fast_max(NA1dDim lhs, NA1dDim rhs) { + return NA1dDim(cutlass::fast_max(lhs.x, rhs.x)); +} + +template <> +CUTLASS_DEVICE NA2dDim fast_max(NA2dDim lhs, NA2dDim rhs) { + return NA2dDim( + cutlass::fast_max(lhs.x, rhs.x), cutlass::fast_max(lhs.y, rhs.y)); +} + +template <> +CUTLASS_DEVICE NA3dDim fast_max(NA3dDim lhs, NA3dDim rhs) { + return NA3dDim( + cutlass::fast_max(lhs.x, rhs.x), + cutlass::fast_max(lhs.y, rhs.y), + cutlass::fast_max(lhs.z, rhs.z)); +} + +template +CUTLASS_HOST_DEVICE Dim ceil_div_dim(Dim lhs, Dim rhs) {} + +template <> +CUTLASS_HOST_DEVICE NA1dDim ceil_div_dim(NA1dDim lhs, NA1dDim rhs) { + return NA1dDim(gemm_kernel_utils::ceil_div(lhs.x, rhs.x)); +} + +template <> +CUTLASS_HOST_DEVICE NA2dDim ceil_div_dim(NA2dDim lhs, NA2dDim rhs) { + return NA2dDim( + gemm_kernel_utils::ceil_div(lhs.x, rhs.x), + gemm_kernel_utils::ceil_div(lhs.y, rhs.y)); +} + +template <> +CUTLASS_HOST_DEVICE NA3dDim ceil_div_dim(NA3dDim lhs, NA3dDim rhs) { + return NA3dDim( + gemm_kernel_utils::ceil_div(lhs.x, rhs.x), + gemm_kernel_utils::ceil_div(lhs.y, rhs.y), + gemm_kernel_utils::ceil_div(lhs.z, rhs.z)); +} + +template +CUTLASS_DEVICE void maybe_mask_qk_tiles( + Dim& q_shape, + Dim orig_shape, + Dim dilation, + Dim dilation_idx); + +template <> +CUTLASS_DEVICE void maybe_mask_qk_tiles( + NA1dDim& q_shape, + NA1dDim orig_shape, + NA1dDim dilation, + NA1dDim dilation_idx) { + auto num_tiles_with_fewer_tokens = (q_shape * dilation) - orig_shape; + // TODO: assert num_tiles_with_fewer_tokens >= 0 + if (dilation_idx.x >= dilation.x - num_tiles_with_fewer_tokens.x) { + q_shape.x = q_shape.x - 1; + } +} + +template <> +CUTLASS_DEVICE void maybe_mask_qk_tiles( + NA2dDim& q_shape, + NA2dDim orig_shape, + NA2dDim dilation, + NA2dDim dilation_idx) { + auto num_tiles_with_fewer_tokens = (q_shape * dilation) - orig_shape; + // TODO: assert num_tiles_with_fewer_tokens >= 0 + if (dilation_idx.x >= dilation.x - num_tiles_with_fewer_tokens.x) { + q_shape.x = q_shape.x - 1; + } + if (dilation_idx.y >= dilation.y - num_tiles_with_fewer_tokens.y) { + q_shape.y = q_shape.y - 1; + } +} + +template <> +CUTLASS_DEVICE void maybe_mask_qk_tiles( + NA3dDim& q_shape, + NA3dDim orig_shape, + NA3dDim dilation, + NA3dDim dilation_idx) { + auto num_tiles_with_fewer_tokens = (q_shape * dilation) - orig_shape; + // TODO: assert num_tiles_with_fewer_tokens >= 0 + if (dilation_idx.x >= dilation.x - num_tiles_with_fewer_tokens.x) { + q_shape.x = q_shape.x - 1; + } + if (dilation_idx.y >= dilation.y - num_tiles_with_fewer_tokens.y) { + q_shape.y = q_shape.y - 1; + } + if (dilation_idx.z >= dilation.z - num_tiles_with_fewer_tokens.z) { + q_shape.z = q_shape.z - 1; + } +} + +template +CUTLASS_DEVICE Dim compute_stride(Dim input_shape, int64_t last_stride); + +template <> +CUTLASS_DEVICE NA1dDim +compute_stride(NA1dDim input_shape, int64_t last_stride) { + return NA1dDim(last_stride); +} + +template <> +CUTLASS_DEVICE NA2dDim +compute_stride(NA2dDim input_shape, int64_t last_stride) { + return NA2dDim(input_shape.y * last_stride, last_stride); +} + +template <> +CUTLASS_DEVICE NA3dDim +compute_stride(NA3dDim input_shape, int64_t last_stride) { + return NA3dDim( + input_shape.y * input_shape.z * last_stride, + input_shape.z * last_stride, + last_stride); +} + +template +struct CausalMask; + +template +struct CausalMask { + static constexpr int kRank = 1; + static constexpr bool Dim0 = IsDim0Causal; + + static constexpr bool AnyCausalDims = IsDim0Causal; +}; + +template +struct CausalMask { + static constexpr int kRank = 2; + static constexpr bool Dim0 = IsDim0Causal; + static constexpr bool Dim1 = IsDim1Causal; + + static constexpr bool AnyCausalDims = IsDim0Causal || IsDim1Causal; +}; + +template +struct CausalMask { + static constexpr int kRank = 3; + static constexpr bool Dim0 = IsDim0Causal; + static constexpr bool Dim1 = IsDim1Causal; + static constexpr bool Dim2 = IsDim2Causal; + + static constexpr bool AnyCausalDims = + IsDim0Causal || IsDim1Causal || IsDim2Causal; +}; + +// No causal masking +template +struct GetNonCausalMask; + +template <> +struct GetNonCausalMask<1> { + using type = CausalMask; +}; + +template <> +struct GetNonCausalMask<2> { + using type = CausalMask; +}; + +template <> +struct GetNonCausalMask<3> { + using type = CausalMask; +}; + +// NA Mask +template +struct NeighborhoodAttentionMaskBase { + static constexpr bool DoCausalMasking = DoCausalMasking_; +}; + +// Standard NA +template <> +struct NeighborhoodAttentionMaskBase { + static constexpr bool DoCausalMasking = false; + + int32_t window_size; + int32_t window_radius; + int32_t spatial_extent; + int32_t last_start; + + CUTLASS_DEVICE NeighborhoodAttentionMaskBase( + int32_t kernel_size, + int32_t spatial_extent_) + : window_size(kernel_size), + window_radius(kernel_size / 2), + spatial_extent(spatial_extent_), + last_start(spatial_extent_ - window_radius - 1) {} + + CUTLASS_DEVICE int32_t get_window_start(int32_t index) { + // return cutlass::fast_max(index - window_radius, 0) + + // (index + window_radius >= spatial_extent) * + // (spatial_extent - index - window_radius - 1); + return cutlass::fast_max(index - window_radius, 0) + + cutlass::fast_min(last_start - index, 0); + } + + CUTLASS_DEVICE int32_t get_window_end(int32_t index, int32_t start) { + return start + window_size; + } + + CUTLASS_DEVICE int32_t get_rpb_start(int32_t index) { + return cutlass::fast_max(window_radius + cutlass::fast_max(window_radius - index, 0) - + cutlass::fast_max(index - spatial_extent + window_radius + 1, 0), 0); + } +}; + +// Causal NA +template <> +struct NeighborhoodAttentionMaskBase { + static constexpr bool DoCausalMasking = true; + + int32_t window_size; + int32_t window_radius; + int32_t spatial_extent; + int32_t last_start; + + CUTLASS_DEVICE NeighborhoodAttentionMaskBase( + int32_t kernel_size, + int32_t spatial_extent_) + : window_size(kernel_size), + window_radius(kernel_size / 2), + spatial_extent(spatial_extent_), + last_start(spatial_extent_ - window_radius - 1) {} + + CUTLASS_DEVICE int32_t get_window_start(int32_t index) { + return cutlass::fast_max(index - window_size + 1, 0); + } + + CUTLASS_DEVICE int32_t get_window_end(int32_t index, int32_t start) { + return cutlass::fast_min(index + 1, spatial_extent); + } + + CUTLASS_DEVICE int32_t get_rpb_start(int32_t index) { + printf( + "FATAL: RPB kernels do not support causal masking. Please open an issue."); + asm volatile("brkpt;\n"); + } +}; + +// TODO: figure out an alternative to partial specializations for +// literally every dim. I'm pretty sure there's a better way of handling +// it with less repetition. It might require refactoring this whole +// header file, particularly how NA.dDim structs are defined. + +template +struct NeighborhoodAttentionMask; + +template +struct NeighborhoodAttentionMask { + static_assert(NADim >= 1 && NADim < 4); + static_assert(NADim == CausalMask_::kRank); + + using CausalMask = CausalMask_; +}; + +template +struct NeighborhoodAttentionMask<1, CausalMask_> { + static constexpr int kRank = 1; + + using MaskType0 = NeighborhoodAttentionMaskBase; + using Dim = typename natten::cuda::fna::GetDim::type; + + MaskType0 mask_0; + + CUTLASS_DEVICE NeighborhoodAttentionMask(Dim kernel_size, Dim spatial_extent_) + : mask_0(kernel_size.x, spatial_extent_.x) {} + + CUTLASS_DEVICE Dim get_window_start(Dim index) { + return Dim(mask_0.get_window_start(index.x)); + } + + CUTLASS_DEVICE Dim get_window_end(Dim index, Dim start) { + return Dim(mask_0.get_window_end(index.x, start.x)); + } + + CUTLASS_DEVICE Dim get_rpb_start(Dim index) { + return Dim(mask_0.get_rpb_start(index.x)); + } +}; + +template +struct NeighborhoodAttentionMask<2, CausalMask_> { + static constexpr int kRank = 2; + + using MaskType0 = NeighborhoodAttentionMaskBase; + using MaskType1 = NeighborhoodAttentionMaskBase; + using Dim = typename natten::cuda::fna::GetDim::type; + + MaskType0 mask_0; + MaskType1 mask_1; + + CUTLASS_DEVICE NeighborhoodAttentionMask(Dim kernel_size, Dim spatial_extent_) + : mask_0(kernel_size.x, spatial_extent_.x), + mask_1(kernel_size.y, spatial_extent_.y) {} + + CUTLASS_DEVICE Dim get_window_start(Dim index) { + return Dim( + mask_0.get_window_start(index.x), mask_1.get_window_start(index.y)); + } + + CUTLASS_DEVICE Dim get_window_end(Dim index, Dim start) { + return Dim( + mask_0.get_window_end(index.x, start.x), + mask_1.get_window_end(index.y, start.y)); + } + + CUTLASS_DEVICE Dim get_rpb_start(Dim index) { + return Dim(mask_0.get_rpb_start(index.x), mask_1.get_rpb_start(index.y)); + } +}; + +template +struct NeighborhoodAttentionMask<3, CausalMask_> { + static constexpr int kRank = 3; + + using MaskType0 = NeighborhoodAttentionMaskBase; + using MaskType1 = NeighborhoodAttentionMaskBase; + using MaskType2 = NeighborhoodAttentionMaskBase; + using Dim = typename natten::cuda::fna::GetDim::type; + + MaskType0 mask_0; + MaskType1 mask_1; + MaskType2 mask_2; + + CUTLASS_DEVICE NeighborhoodAttentionMask(Dim kernel_size, Dim spatial_extent_) + : mask_0(kernel_size.x, spatial_extent_.x), + mask_1(kernel_size.y, spatial_extent_.y), + mask_2(kernel_size.z, spatial_extent_.z) {} + + CUTLASS_DEVICE Dim get_window_start(Dim index) { + return Dim( + mask_0.get_window_start(index.x), + mask_1.get_window_start(index.y), + mask_2.get_window_start(index.z)); + } + + CUTLASS_DEVICE Dim get_window_end(Dim index, Dim start) { + return Dim( + mask_0.get_window_end(index.x, start.x), + mask_1.get_window_end(index.y, start.y), + mask_2.get_window_end(index.z, start.z)); + } + + CUTLASS_DEVICE Dim get_rpb_start(Dim index) { + return Dim( + mask_0.get_rpb_start(index.x), + mask_1.get_rpb_start(index.y), + mask_2.get_rpb_start(index.z)); + } +}; + +template +CUTLASS_DEVICE bool is_coord_within_upper_bound(Dim coord, Dim upper_bound); + +template <> +CUTLASS_DEVICE bool is_coord_within_upper_bound( + NA1dDim coord, + NA1dDim upper_bound) { + return coord.x < upper_bound.x; +} + +template <> +CUTLASS_DEVICE bool is_coord_within_upper_bound( + NA2dDim coord, + NA2dDim upper_bound) { + return coord.x < upper_bound.x && coord.y < upper_bound.y; +} + +template <> +CUTLASS_DEVICE bool is_coord_within_upper_bound( + NA3dDim coord, + NA3dDim upper_bound) { + return coord.x < upper_bound.x && coord.y < upper_bound.y && + coord.z < upper_bound.z; +} + +template +CUTLASS_DEVICE bool is_coord_within_bounds( + Dim coord, + Dim lower_bound, + Dim upper_bound); + +template <> +CUTLASS_DEVICE bool is_coord_within_bounds( + NA1dDim coord, + NA1dDim lower_bound, + NA1dDim upper_bound) { + return coord.x >= lower_bound.x && coord.x < upper_bound.x; +} + +template <> +CUTLASS_DEVICE bool is_coord_within_bounds( + NA2dDim coord, + NA2dDim lower_bound, + NA2dDim upper_bound) { + return coord.x >= lower_bound.x && coord.x < upper_bound.x && + coord.y >= lower_bound.y && coord.y < upper_bound.y; +} + +template <> +CUTLASS_DEVICE bool is_coord_within_bounds( + NA3dDim coord, + NA3dDim lower_bound, + NA3dDim upper_bound) { + return coord.x >= lower_bound.x && coord.x < upper_bound.x && + coord.y >= lower_bound.y && coord.y < upper_bound.y && + coord.z >= lower_bound.z && coord.z < upper_bound.z; +} + +template +CUTLASS_DEVICE bool is_coord_within_bounds_nn(Dim coord, Dim upper_bound); + +template <> +CUTLASS_DEVICE bool is_coord_within_bounds_nn( + NA1dDim coord, + NA1dDim upper_bound) { + return coord.x >= 0 && coord.x < upper_bound.x; +} + +template <> +CUTLASS_DEVICE bool is_coord_within_bounds_nn( + NA2dDim coord, + NA2dDim upper_bound) { + return coord.x >= 0 && coord.y >= 0 && coord.x < upper_bound.x && + coord.y < upper_bound.y; +} + +template <> +CUTLASS_DEVICE bool is_coord_within_bounds_nn( + NA3dDim coord, + NA3dDim upper_bound) { + return coord.x >= 0 && coord.y >= 0 && coord.z >= 0 && + coord.x < upper_bound.x && coord.y < upper_bound.y && + coord.z < upper_bound.z; +} + +template +CUTLASS_DEVICE void increment_tile(Dim& tile, Dim inc_value, Dim upper_bound); + +template <> +CUTLASS_DEVICE void increment_tile( + NA1dDim& tile, + NA1dDim inc_value, + NA1dDim upper_bound) { + tile.x += inc_value.x; +} + +template <> +CUTLASS_DEVICE void increment_tile( + NA2dDim& tile, + NA2dDim inc_value, + NA2dDim upper_bound) { + tile.y = tile.y + inc_value.y; + tile.x = tile.x + (tile.y >= upper_bound.y) * inc_value.x; + tile.y = (tile.y < upper_bound.y) * tile.y; +} + +template <> +CUTLASS_DEVICE void increment_tile( + NA3dDim& tile, + NA3dDim inc_value, + NA3dDim upper_bound) { + tile.z = tile.z + inc_value.z; + if (tile.z >= upper_bound.z) { + tile.z = 0; + tile.y += inc_value.y; + } + if (tile.y >= upper_bound.y) { + tile.y = 0; + tile.x += inc_value.x; + } +} + +template +CUTLASS_DEVICE bool is_tile_last(Dim& tile, Dim inc_value, Dim upper_bound); + +template <> +CUTLASS_DEVICE bool is_tile_last( + NA1dDim& tile, + NA1dDim inc_value, + NA1dDim upper_bound) { + return tile.x + inc_value.x >= upper_bound.x; +} + +template <> +CUTLASS_DEVICE bool is_tile_last( + NA2dDim& tile, + NA2dDim inc_value, + NA2dDim upper_bound) { + return tile.y + inc_value.y >= upper_bound.y && + tile.x + inc_value.x >= upper_bound.x; +} + +template <> +CUTLASS_DEVICE bool is_tile_last( + NA3dDim& tile, + NA3dDim inc_value, + NA3dDim upper_bound) { + return tile.z + inc_value.z >= upper_bound.z && + tile.y + inc_value.y >= upper_bound.y && + tile.x + inc_value.x >= upper_bound.x; +} + +} // namespace fna +} // namespace cuda +} // namespace natten diff --git a/csrc/include/natten/cuda/fna/transform/tile_smem_loader.h b/csrc/include/natten/cuda/fna/transform/tile_smem_loader.h new file mode 100644 index 0000000..c4c5c40 --- /dev/null +++ b/csrc/include/natten/cuda/fna/transform/tile_smem_loader.h @@ -0,0 +1,95 @@ +/* + * Copied from xFormers (https://github.com/facebookresearch/xformers/) + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * All rights reserved. + * + * BSD 3-Clause License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC + * Laboratories America and IDIAP Research Institute nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +template < + typename scalar_t, // scalar type + typename ThreadblockTileShape, // size of tile to load + int Threads, // number of participating threads + int ElementsPerAccess> // thread access width in elements +class TileSmemLoader { + public: + using SmemTile = + cutlass::AlignedBuffer; + + using ThreadMap = cutlass::transform::PitchLinearStripminedThreadMap< + cutlass::layout::PitchLinearShape< + ThreadblockTileShape::kColumn, // contiguous + ThreadblockTileShape::kRow>, // strided + Threads, // Threads + ElementsPerAccess>; // ElementsPerAccess + + using GmemTileIterator = + cutlass::transform::threadblock::PredicatedTileIterator< + ThreadblockTileShape, // Shape + scalar_t, // Element + cutlass::layout::RowMajor, // Layout + 0, // AdvanceRank + ThreadMap>; // ThreadMap + + using SmemTileIterator = cutlass::transform::threadblock::RegularTileIterator< + ThreadblockTileShape, // Shape + scalar_t, // Element + cutlass::layout::RowMajor, // Layout + 0, // AdvanceRank + ThreadMap>; // ThreadMap + + using Fragment = typename GmemTileIterator::Fragment; + + /// load a tile from global memory into shared memory + CUTLASS_DEVICE + static void load( + GmemTileIterator tile_load_iter, + SmemTileIterator tile_store_iter) { + Fragment tb_frag; + tb_frag.clear(); + tile_load_iter.load(tb_frag); + tile_store_iter.store(tb_frag); + + __syncthreads(); + } +}; diff --git a/csrc/include/natten/cuda/gemm/kernel/default_na.cuh b/csrc/include/natten/cuda/gemm/kernel/default_na.cuh index 13d91e1..785bedb 100644 --- a/csrc/include/natten/cuda/gemm/kernel/default_na.cuh +++ b/csrc/include/natten/cuda/gemm/kernel/default_na.cuh @@ -50,7 +50,26 @@ namespace natten { namespace cuda { namespace gemm { -namespace kernel {} // namespace kernel +namespace kernel { + +namespace { + +template +struct GetFragmentsPerIter { + static_assert( + ArchTag::kMinComputeCapability == 80 || + ArchTag::kMinComputeCapability == 75); + static constexpr int value = EpilogueBase::kFragmentsPerIteration; +}; + +template +struct GetFragmentsPerIter { + static constexpr int value = 1; +}; + +} // namespace + +} // namespace kernel } // namespace gemm } // namespace cuda } // namespace natten diff --git a/csrc/include/natten/cuda/gemm/kernel/default_na1d_in.cuh b/csrc/include/natten/cuda/gemm/kernel/default_na1d_in.cuh index f08cd31..a780f21 100644 --- a/csrc/include/natten/cuda/gemm/kernel/default_na1d_in.cuh +++ b/csrc/include/natten/cuda/gemm/kernel/default_na1d_in.cuh @@ -42,13 +42,11 @@ #pragma once #include -#include -#include +#include +#include #include "natten/cuda/gemm/kernel/default_na.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_simt.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh" #include "natten/cuda/gemm/threadblock/na1d_in_input_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na1d_in_output_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na1d_in_value_tile_iterator.cuh" @@ -127,6 +125,9 @@ struct DefaultNA1dIN< AlignmentA, AlignmentB> { static_assert(AlignmentA == 1); // NA requirement for IN + static_assert( + ArchTag::kMinComputeCapability >= 80, + "This specialization is intended for SM80 and above."); // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< @@ -190,36 +191,31 @@ struct DefaultNA1dIN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< - ThreadblockShape, - typename WarpMmaTensorOp::Shape, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dINOutputTileIterator; - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< + using EpilogueBase = + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, WarpMmaTensorOp, kPartitionsK, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + EpilogueOutputOp::kCount>; + + using OutputTileIterator = + natten::cuda::gemm::threadblock::NA1dINOutputTileIterator< + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = @@ -267,6 +263,10 @@ struct DefaultNA1dIN< AlignmentA, AlignmentB> { static_assert(AlignmentA == 1); // NA requirement for IN + static_assert( + ArchTag::kMinComputeCapability == 70 || + ArchTag::kMinComputeCapability == 75, + "This specialization is intended for SM70 and SM75."); // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< @@ -328,307 +328,38 @@ struct DefaultNA1dIN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< - ThreadblockShape, - typename WarpMmaTensorOp::Shape, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dINOutputTileIterator; - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< + using EpilogueBase = typename std::conditional< + ArchTag::kMinComputeCapability == 75, + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, WarpMmaTensorOp, kPartitionsK, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = - ImplicitGemmNA1d; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - int Stages, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA1dIN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - Stages, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::ColumnMajor, - ElementB, - cutlass::layout::RowMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - Stages, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::NA1dINInputTileIterator< - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::NA1dINValueTileIterator< - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - static cutlass::arch::CacheOperation::Kind const CacheOpB = - ((cutlass::sizeof_bits::value * AlignmentB) == 128) - ? cutlass::arch::CacheOperation::Global - : cutlass::arch::CacheOperation::Always; - - // Define the Mma - using Mma = natten::cuda::gemm::threadblock::ImplicitGemmMultistage< - ThreadblockShape, - IteratorA, - SmemIteratorA, - cutlass::arch::CacheOperation::Always, - IteratorB, - SmemIteratorB, - CacheOpB, - MmaPolicy, - Stages>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< + EpilogueOutputOp::kCount>, + typename cutlass::epilogue::threadblock::DefaultEpilogueVoltaTensorOp< ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dINOutputTileIterator; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, - EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = - ImplicitGemmNA1d; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// Pipelined SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA1dIN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - 2, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::ColumnMajor, - ElementB, - cutlass::layout::RowMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - 2, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA1dINInputTileIterator< - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>, - 1>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA1dINValueTileIterator< - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>, - 1>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - // Define the Mma - using Mma = cutlass::conv::threadblock::ImplicitGemmPipelined< - ThreadblockShape, - IteratorA, - SmemIteratorA, - IteratorB, - SmemIteratorB, - ElementC, - LayoutC, - MmaPolicy>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< - ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, + WarpMmaTensorOp, kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dINOutputTileIterator; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + EpilogueOutputOp::kCount>>::type; + + using OutputTileIterator = + natten::cuda::gemm::threadblock::NA1dINOutputTileIterator< + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = diff --git a/csrc/include/natten/cuda/gemm/kernel/default_na1d_nn.cuh b/csrc/include/natten/cuda/gemm/kernel/default_na1d_nn.cuh index 6c145b8..b5f8e33 100644 --- a/csrc/include/natten/cuda/gemm/kernel/default_na1d_nn.cuh +++ b/csrc/include/natten/cuda/gemm/kernel/default_na1d_nn.cuh @@ -42,13 +42,11 @@ #pragma once #include -#include -#include +#include +#include #include "natten/cuda/gemm/kernel/default_na.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_simt.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh" #include "natten/cuda/gemm/threadblock/na1d_nn_input_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na1d_nn_output_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na1d_nn_value_tile_iterator.cuh" @@ -127,6 +125,9 @@ struct DefaultNA1dNN< AlignmentA, AlignmentB> { static_assert(AlignmentA == 1); // NA requirement for NN + static_assert( + ArchTag::kMinComputeCapability >= 80, + "This specialization is intended for SM80 and above."); // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< @@ -190,36 +191,31 @@ struct DefaultNA1dNN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< - ThreadblockShape, - typename WarpMmaTensorOp::Shape, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dNNOutputTileIterator; - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< + using EpilogueBase = + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, WarpMmaTensorOp, kPartitionsK, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + EpilogueOutputOp::kCount>; + + using OutputTileIterator = + natten::cuda::gemm::threadblock::NA1dNNOutputTileIterator< + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = @@ -267,6 +263,10 @@ struct DefaultNA1dNN< AlignmentA, AlignmentB> { static_assert(AlignmentA == 1); // NA requirement for NN + static_assert( + ArchTag::kMinComputeCapability == 70 || + ArchTag::kMinComputeCapability == 75, + "This specialization is intended for SM70 and SM75."); // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< @@ -328,307 +328,38 @@ struct DefaultNA1dNN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< - ThreadblockShape, - typename WarpMmaTensorOp::Shape, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dNNOutputTileIterator; - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< + using EpilogueBase = typename std::conditional< + ArchTag::kMinComputeCapability == 75, + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, WarpMmaTensorOp, kPartitionsK, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = - ImplicitGemmNA1d; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - int Stages, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA1dNN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - Stages, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::RowMajor, - ElementB, - cutlass::layout::RowMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - Stages, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::NA1dNNInputTileIterator< - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::NA1dNNValueTileIterator< - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - static cutlass::arch::CacheOperation::Kind const CacheOpB = - ((cutlass::sizeof_bits::value * AlignmentB) == 128) - ? cutlass::arch::CacheOperation::Global - : cutlass::arch::CacheOperation::Always; - - // Define the Mma - using Mma = natten::cuda::gemm::threadblock::ImplicitGemmMultistage< - ThreadblockShape, - IteratorA, - SmemIteratorA, - cutlass::arch::CacheOperation::Always, - IteratorB, - SmemIteratorB, - CacheOpB, - MmaPolicy, - Stages>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< + EpilogueOutputOp::kCount>, + typename cutlass::epilogue::threadblock::DefaultEpilogueVoltaTensorOp< ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dNNOutputTileIterator; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, - EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = - ImplicitGemmNA1d; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// Pipelined SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA1dNN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - 2, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::RowMajor, - ElementB, - cutlass::layout::RowMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - 2, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA1dNNInputTileIterator< - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>, - 1>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA1dNNValueTileIterator< - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>, - 1>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - // Define the Mma - using Mma = cutlass::conv::threadblock::ImplicitGemmPipelined< - ThreadblockShape, - IteratorA, - SmemIteratorA, - IteratorB, - SmemIteratorB, - ElementC, - LayoutC, - MmaPolicy>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< - ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, + WarpMmaTensorOp, kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dNNOutputTileIterator; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + EpilogueOutputOp::kCount>>::type; + + using OutputTileIterator = + natten::cuda::gemm::threadblock::NA1dNNOutputTileIterator< + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = diff --git a/csrc/include/natten/cuda/gemm/kernel/default_na1d_pn.cuh b/csrc/include/natten/cuda/gemm/kernel/default_na1d_pn.cuh index da9416e..9f9a168 100644 --- a/csrc/include/natten/cuda/gemm/kernel/default_na1d_pn.cuh +++ b/csrc/include/natten/cuda/gemm/kernel/default_na1d_pn.cuh @@ -42,13 +42,11 @@ #pragma once #include -#include -#include +#include +#include #include "natten/cuda/gemm/kernel/default_na.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_simt.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh" #include "natten/cuda/gemm/threadblock/na1d_pn_input_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na1d_pn_output_tile_iterator.cuh" @@ -125,6 +123,10 @@ struct DefaultNA1dPN< MathOperatorTag, AlignmentA, AlignmentB> { + static_assert( + ArchTag::kMinComputeCapability >= 80, + "This specialization is intended for SM80 and above."); + // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< ThreadblockShape, @@ -192,36 +194,31 @@ struct DefaultNA1dPN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< - ThreadblockShape, - typename WarpMmaTensorOp::Shape, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dPNOutputTileIterator; - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< + using EpilogueBase = + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, WarpMmaTensorOp, kPartitionsK, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + EpilogueOutputOp::kCount>; + + using OutputTileIterator = + natten::cuda::gemm::threadblock::NA1dPNOutputTileIterator< + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = @@ -268,6 +265,11 @@ struct DefaultNA1dPN< MathOperatorTag, AlignmentA, AlignmentB> { + static_assert( + ArchTag::kMinComputeCapability == 70 || + ArchTag::kMinComputeCapability == 75, + "This specialization is intended for SM70 and SM75."); + // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< ThreadblockShape, @@ -328,312 +330,38 @@ struct DefaultNA1dPN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< - ThreadblockShape, - typename WarpMmaTensorOp::Shape, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dPNOutputTileIterator; - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< + using EpilogueBase = typename std::conditional< + ArchTag::kMinComputeCapability == 75, + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, WarpMmaTensorOp, kPartitionsK, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = - ImplicitGemmNA1d; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - int Stages, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA1dPN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - Stages, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::RowMajor, - ElementB, - cutlass::layout::ColumnMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - Stages, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::NA1dPNInputTileIterator< - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::NA1dPNInputTileIterator< - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - static cutlass::arch::CacheOperation::Kind const CacheOpA = - ((cutlass::sizeof_bits::value * AlignmentA) == 128) - ? cutlass::arch::CacheOperation::Global - : cutlass::arch::CacheOperation::Always; - - static cutlass::arch::CacheOperation::Kind const CacheOpB = - ((cutlass::sizeof_bits::value * AlignmentB) == 128) - ? cutlass::arch::CacheOperation::Global - : cutlass::arch::CacheOperation::Always; - - // Define the Mma - using Mma = natten::cuda::gemm::threadblock::ImplicitGemmMultistage< - ThreadblockShape, - IteratorA, - SmemIteratorA, - CacheOpA, - IteratorB, - SmemIteratorB, - CacheOpB, - MmaPolicy, - Stages>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< - ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dPNOutputTileIterator; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, - EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = - ImplicitGemmNA1d; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// Pipelined SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA1dPN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - 2, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::RowMajor, - ElementB, - cutlass::layout::ColumnMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - 2, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA1dPNInputTileIterator< - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>, - 1>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA1dPNInputTileIterator< - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>, - 1>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - // Define the Mma - using Mma = cutlass::conv::threadblock::ImplicitGemmPipelined< - ThreadblockShape, - IteratorA, - SmemIteratorA, - IteratorB, - SmemIteratorB, - ElementC, - LayoutC, - MmaPolicy>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< + EpilogueOutputOp::kCount>, + typename cutlass::epilogue::threadblock::DefaultEpilogueVoltaTensorOp< ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, + WarpMmaTensorOp, kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = natten::cuda::gemm::threadblock:: - NA1dPNOutputTileIterator; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + EpilogueOutputOp::kCount>>::type; + + using OutputTileIterator = + natten::cuda::gemm::threadblock::NA1dPNOutputTileIterator< + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = diff --git a/csrc/include/natten/cuda/gemm/kernel/default_na2d_in.cuh b/csrc/include/natten/cuda/gemm/kernel/default_na2d_in.cuh index 342cf73..a821a24 100644 --- a/csrc/include/natten/cuda/gemm/kernel/default_na2d_in.cuh +++ b/csrc/include/natten/cuda/gemm/kernel/default_na2d_in.cuh @@ -42,13 +42,11 @@ #pragma once #include -#include -#include +#include +#include #include "natten/cuda/gemm/kernel/default_na.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_simt.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh" #include "natten/cuda/gemm/threadblock/na2d_in_input_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na2d_in_output_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na2d_in_value_tile_iterator.cuh" @@ -130,6 +128,9 @@ struct DefaultNA2dIN< AlignmentA, AlignmentB> { static_assert(AlignmentA == 1); // NA requirement for IN + static_assert( + ArchTag::kMinComputeCapability >= 80, + "This specialization is intended for SM80 and above."); // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< @@ -195,39 +196,32 @@ struct DefaultNA2dIN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< + // Define the epilogue + using EpilogueBase = + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, - typename WarpMmaTensorOp::Shape, + WarpMmaTensorOp, kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; + EpilogueOutputOp, + EpilogueOutputOp::kCount>; using OutputTileIterator = natten::cuda::gemm::threadblock::NA2dINOutputTileIterator< NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< - ThreadblockShape, - WarpMmaTensorOp, - kPartitionsK, - EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = ImplicitGemmNA2d< @@ -281,6 +275,10 @@ struct DefaultNA2dIN< AlignmentA, AlignmentB> { static_assert(AlignmentA == 1); // NA requirement for IN + static_assert( + ArchTag::kMinComputeCapability == 70 || + ArchTag::kMinComputeCapability == 75, + "This specialization is intended for SM70 and SM75."); // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< @@ -344,332 +342,39 @@ struct DefaultNA2dIN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< - ThreadblockShape, - typename WarpMmaTensorOp::Shape, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = - natten::cuda::gemm::threadblock::NA2dINOutputTileIterator< - NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< + using EpilogueBase = typename std::conditional< + ArchTag::kMinComputeCapability == 75, + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, WarpMmaTensorOp, kPartitionsK, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = ImplicitGemmNA2d< - Operator::kIN, - NAShape, - Mma, - Epilogue, - ThreadblockSwizzle>; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename NAShape, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - int Stages, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA2dIN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - NAShape, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - Stages, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::ColumnMajor, - ElementB, - cutlass::layout::RowMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - Stages, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::NA2dINInputTileIterator< - NAShape, - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::NA2dINValueTileIterator< - NAShape, - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - static cutlass::arch::CacheOperation::Kind const CacheOpB = - ((cutlass::sizeof_bits::value * AlignmentB) == 128) - ? cutlass::arch::CacheOperation::Global - : cutlass::arch::CacheOperation::Always; - - // Define the Mma - using Mma = natten::cuda::gemm::threadblock::ImplicitGemmMultistage< - ThreadblockShape, - IteratorA, - SmemIteratorA, - cutlass::arch::CacheOperation::Always, - IteratorB, - SmemIteratorB, - CacheOpB, - MmaPolicy, - Stages>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< + EpilogueOutputOp::kCount>, + typename cutlass::epilogue::threadblock::DefaultEpilogueVoltaTensorOp< ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, + WarpMmaTensorOp, kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = - natten::cuda::gemm::threadblock::NA2dINOutputTileIterator< - NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = ImplicitGemmNA2d< - Operator::kIN, - NAShape, - Mma, - Epilogue, - ThreadblockSwizzle>; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// Pipelined SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename NAShape, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA2dIN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - NAShape, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - 2, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::ColumnMajor, - ElementB, - cutlass::layout::RowMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - 2, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA2dINInputTileIterator< - NAShape, - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>, - 2>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA2dINValueTileIterator< - NAShape, - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>, - 2>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - // Define the Mma - using Mma = cutlass::conv::threadblock::ImplicitGemmPipelined< - ThreadblockShape, - IteratorA, - SmemIteratorA, - IteratorB, - SmemIteratorB, - ElementC, - LayoutC, - MmaPolicy>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< - ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; + EpilogueOutputOp::kCount>>::type; using OutputTileIterator = natten::cuda::gemm::threadblock::NA2dINOutputTileIterator< NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, - EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = ImplicitGemmNA2d< diff --git a/csrc/include/natten/cuda/gemm/kernel/default_na2d_nn.cuh b/csrc/include/natten/cuda/gemm/kernel/default_na2d_nn.cuh index 9747616..6dab4af 100644 --- a/csrc/include/natten/cuda/gemm/kernel/default_na2d_nn.cuh +++ b/csrc/include/natten/cuda/gemm/kernel/default_na2d_nn.cuh @@ -42,13 +42,11 @@ #pragma once #include -#include -#include +#include +#include #include "natten/cuda/gemm/kernel/default_na.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_simt.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh" #include "natten/cuda/gemm/threadblock/na2d_nn_input_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na2d_nn_output_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na2d_nn_value_tile_iterator.cuh" @@ -130,6 +128,9 @@ struct DefaultNA2dNN< AlignmentA, AlignmentB> { static_assert(AlignmentA == 1); // NA requirement for IN + static_assert( + ArchTag::kMinComputeCapability >= 80, + "This specialization is intended for SM80 and above."); // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< @@ -195,39 +196,32 @@ struct DefaultNA2dNN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< + // Define the epilogue + using EpilogueBase = + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, - typename WarpMmaTensorOp::Shape, + WarpMmaTensorOp, kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; + EpilogueOutputOp, + EpilogueOutputOp::kCount>; using OutputTileIterator = natten::cuda::gemm::threadblock::NA2dNNOutputTileIterator< NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< - ThreadblockShape, - WarpMmaTensorOp, - kPartitionsK, - EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = ImplicitGemmNA2d< @@ -281,6 +275,10 @@ struct DefaultNA2dNN< AlignmentA, AlignmentB> { static_assert(AlignmentA == 1); // NA requirement for NN + static_assert( + ArchTag::kMinComputeCapability == 70 || + ArchTag::kMinComputeCapability == 75, + "This specialization is intended for SM70 and SM75."); // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< @@ -344,332 +342,39 @@ struct DefaultNA2dNN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< - ThreadblockShape, - typename WarpMmaTensorOp::Shape, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = - natten::cuda::gemm::threadblock::NA2dNNOutputTileIterator< - NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< + using EpilogueBase = typename std::conditional< + ArchTag::kMinComputeCapability == 75, + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, WarpMmaTensorOp, kPartitionsK, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = ImplicitGemmNA2d< - Operator::kNN, - NAShape, - Mma, - Epilogue, - ThreadblockSwizzle>; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename NAShape, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - int Stages, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA2dNN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - NAShape, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - Stages, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::RowMajor, - ElementB, - cutlass::layout::RowMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - Stages, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::NA2dNNInputTileIterator< - NAShape, - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::NA2dNNValueTileIterator< - NAShape, - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - static cutlass::arch::CacheOperation::Kind const CacheOpB = - ((cutlass::sizeof_bits::value * AlignmentB) == 128) - ? cutlass::arch::CacheOperation::Global - : cutlass::arch::CacheOperation::Always; - - // Define the Mma - using Mma = natten::cuda::gemm::threadblock::ImplicitGemmMultistage< - ThreadblockShape, - IteratorA, - SmemIteratorA, - cutlass::arch::CacheOperation::Always, - IteratorB, - SmemIteratorB, - CacheOpB, - MmaPolicy, - Stages>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< + EpilogueOutputOp::kCount>, + typename cutlass::epilogue::threadblock::DefaultEpilogueVoltaTensorOp< ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, + WarpMmaTensorOp, kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = - natten::cuda::gemm::threadblock::NA2dNNOutputTileIterator< - NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = ImplicitGemmNA2d< - Operator::kNN, - NAShape, - Mma, - Epilogue, - ThreadblockSwizzle>; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// Pipelined SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename NAShape, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA2dNN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - NAShape, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - 2, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::RowMajor, - ElementB, - cutlass::layout::RowMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - 2, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA2dNNInputTileIterator< - NAShape, - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>, - 2>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA2dNNValueTileIterator< - NAShape, - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>, - 2>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - // Define the Mma - using Mma = cutlass::conv::threadblock::ImplicitGemmPipelined< - ThreadblockShape, - IteratorA, - SmemIteratorA, - IteratorB, - SmemIteratorB, - ElementC, - LayoutC, - MmaPolicy>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< - ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; + EpilogueOutputOp::kCount>>::type; using OutputTileIterator = natten::cuda::gemm::threadblock::NA2dNNOutputTileIterator< NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, - EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = ImplicitGemmNA2d< diff --git a/csrc/include/natten/cuda/gemm/kernel/default_na2d_pn.cuh b/csrc/include/natten/cuda/gemm/kernel/default_na2d_pn.cuh index 4972c36..384b2f5 100644 --- a/csrc/include/natten/cuda/gemm/kernel/default_na2d_pn.cuh +++ b/csrc/include/natten/cuda/gemm/kernel/default_na2d_pn.cuh @@ -42,13 +42,11 @@ #pragma once #include -#include -#include +#include +#include #include "natten/cuda/gemm/kernel/default_na.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_simt.cuh" -#include "natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh" #include "natten/cuda/gemm/threadblock/na2d_pn_input_tile_iterator.cuh" #include "natten/cuda/gemm/threadblock/na2d_pn_output_tile_iterator.cuh" @@ -128,6 +126,10 @@ struct DefaultNA2dPN< MathOperatorTag, AlignmentA, AlignmentB> { + static_assert( + ArchTag::kMinComputeCapability >= 80, + "This specialization is intended for SM80 and above."); + // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< ThreadblockShape, @@ -197,39 +199,32 @@ struct DefaultNA2dPN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< + // Define the epilogue + using EpilogueBase = + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, - typename WarpMmaTensorOp::Shape, + WarpMmaTensorOp, kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; + EpilogueOutputOp, + EpilogueOutputOp::kCount>; using OutputTileIterator = natten::cuda::gemm::threadblock::NA2dPNOutputTileIterator< NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< - ThreadblockShape, - WarpMmaTensorOp, - kPartitionsK, - EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = ImplicitGemmNA2d< @@ -282,6 +277,11 @@ struct DefaultNA2dPN< MathOperatorTag, AlignmentA, AlignmentB> { + static_assert( + ArchTag::kMinComputeCapability == 70 || + ArchTag::kMinComputeCapability == 75, + "This specialization is intended for SM70 and SM75."); + // Define the core components from GEMM using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< ThreadblockShape, @@ -344,337 +344,39 @@ struct DefaultNA2dPN< static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapTensorOp< - ThreadblockShape, - typename WarpMmaTensorOp::Shape, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = - natten::cuda::gemm::threadblock::NA2dPNOutputTileIterator< - NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueTensorOp< + using EpilogueBase = typename std::conditional< + ArchTag::kMinComputeCapability == 75, + typename cutlass::epilogue::threadblock::DefaultEpilogueTensorOp< ThreadblockShape, WarpMmaTensorOp, kPartitionsK, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = ImplicitGemmNA2d< - Operator::kPN, - NAShape, - Mma, - Epilogue, - ThreadblockSwizzle>; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename NAShape, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - int Stages, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA2dPN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - NAShape, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - Stages, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::RowMajor, - ElementB, - cutlass::layout::ColumnMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - Stages, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::NA2dPNInputTileIterator< - NAShape, - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::NA2dPNInputTileIterator< - NAShape, - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - static cutlass::arch::CacheOperation::Kind const CacheOpA = - ((cutlass::sizeof_bits::value * AlignmentA) == 128) - ? cutlass::arch::CacheOperation::Global - : cutlass::arch::CacheOperation::Always; - - static cutlass::arch::CacheOperation::Kind const CacheOpB = - ((cutlass::sizeof_bits::value * AlignmentB) == 128) - ? cutlass::arch::CacheOperation::Global - : cutlass::arch::CacheOperation::Always; - - // Define the Mma - using Mma = natten::cuda::gemm::threadblock::ImplicitGemmMultistage< - ThreadblockShape, - IteratorA, - SmemIteratorA, - CacheOpA, - IteratorB, - SmemIteratorB, - CacheOpB, - MmaPolicy, - Stages>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< + EpilogueOutputOp::kCount>, + typename cutlass::epilogue::threadblock::DefaultEpilogueVoltaTensorOp< ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, + WarpMmaTensorOp, kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; - - using OutputTileIterator = - natten::cuda::gemm::threadblock::NA2dPNOutputTileIterator< - NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; - - // Define the kernel - using Kernel = ImplicitGemmNA2d< - Operator::kPN, - NAShape, - Mma, - Epilogue, - ThreadblockSwizzle>; -}; - -///////////////////////////////////////////////////////////////////////////////////////////////// -// Pipelined SIMT implicit gemm -///////////////////////////////////////////////////////////////////////////////////////////////// - -template < - typename ElementA, - typename LayoutA, - typename ElementB, - typename LayoutB, - typename ElementC, - typename LayoutC, - typename ElementAccumulator, - typename ArchTag, - typename NAShape, - typename ThreadblockShape, - typename WarpShape, - typename InstructionShape, - typename EpilogueOutputOp, - typename ThreadblockSwizzle, - typename MathOperatorTag, - int AlignmentA, - int AlignmentB> -struct DefaultNA2dPN< - ElementA, - LayoutA, - ElementB, - LayoutB, - ElementC, - LayoutC, - ElementAccumulator, - cutlass::arch::OpClassSimt, - ArchTag, - NAShape, - ThreadblockShape, - WarpShape, - InstructionShape, - EpilogueOutputOp, - ThreadblockSwizzle, - 2, - MathOperatorTag, - AlignmentA, - AlignmentB> { - static_assert(AlignmentA == 1 && AlignmentB == 1); - - // Define the core components from GEMM - using MmaCore = typename cutlass::gemm::threadblock::DefaultMmaCore< - ThreadblockShape, - WarpShape, - InstructionShape, - ElementA, - cutlass::layout::RowMajor, - ElementB, - cutlass::layout::ColumnMajor, - ElementAccumulator, - cutlass::layout::RowMajor, - cutlass::arch::OpClassSimt, - 2, - MathOperatorTag>; - - // Define iterators over tiles from the A operand - using ThreadMapA = typename MmaCore::IteratorThreadMapA; - using IteratorA = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA2dPNInputTileIterator< - NAShape, - cutlass::MatrixShape, - ElementA, - LayoutA, - ThreadMapA>, - 2>; - - using SmemIteratorA = typename MmaCore::SmemIteratorA; - - // Define iterators over tiles from the B operand - using ThreadMapB = typename MmaCore::IteratorThreadMapB; - using IteratorB = natten::cuda::gemm::threadblock::TileIterator< - natten::cuda::gemm::threadblock::NA2dPNInputTileIterator< - NAShape, - cutlass::MatrixShape, - ElementB, - LayoutB, - ThreadMapB>, - 2>; - - using SmemIteratorB = typename MmaCore::SmemIteratorB; - - // Warp-level GEMM components - using WarpMmaSimt = typename MmaCore::MmaWarpSimt; - using MmaPolicy = typename MmaCore::MmaPolicy; - - // Define the Mma - using Mma = cutlass::conv::threadblock::ImplicitGemmPipelined< - ThreadblockShape, - IteratorA, - SmemIteratorA, - IteratorB, - SmemIteratorB, - ElementC, - LayoutC, - MmaPolicy>; - - static const int kPartitionsK = ThreadblockShape::kK / WarpShape::kK; - - using EpilogueElementOutput = typename EpilogueOutputOp::ElementOutput; - - // Threadmap and output iterator were moved out of the default epilogue, - // which may seem counter-intuitive, but it was all done pretty lazily to - // allow different kernels to have their correct output iterator instantiated - // at the kernel level. - // May move this back and customize the epilogue in the future. - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< - ThreadblockShape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, - kPartitionsK, - EpilogueElementOutput, - EpilogueOutputOp::kCount>::Type; - - static bool const UseCUDAStore = - cutlass::platform::is_same::value; + EpilogueOutputOp::kCount>>::type; using OutputTileIterator = natten::cuda::gemm::threadblock::NA2dPNOutputTileIterator< NAShape, - OutputTileThreadMap, - EpilogueElementOutput>; - - // Define the epilogue - using Epilogue = - typename natten::cuda::gemm::threadblock::DefaultEpilogueSimt< - ThreadblockShape, - WarpMmaSimt, - EpilogueOutputOp, - EpilogueOutputOp::kCount, - OutputTileIterator>::Epilogue; + typename EpilogueBase::OutputTileThreadMap, + typename EpilogueOutputOp::ElementOutput>; + + using Epilogue = cutlass::epilogue::threadblock::Epilogue< + typename EpilogueBase::Shape, + typename EpilogueBase::WarpMmaTensorOp, + EpilogueBase::kPartitionsK, + OutputTileIterator, + typename EpilogueBase::AccumulatorFragmentIterator, + typename EpilogueBase::WarpTileIterator, + typename EpilogueBase::SharedLoadIterator, + typename EpilogueBase::OutputOp, + typename EpilogueBase::Padding, + GetFragmentsPerIter::value>; // Define the kernel using Kernel = ImplicitGemmNA2d< diff --git a/csrc/include/natten/cuda/gemm/na1d.cuh b/csrc/include/natten/cuda/gemm/na1d.cuh index e7dde02..f8f5893 100644 --- a/csrc/include/natten/cuda/gemm/na1d.cuh +++ b/csrc/include/natten/cuda/gemm/na1d.cuh @@ -33,13 +33,13 @@ #include #include +#include #include #include #include #include #include #include -#include namespace natten { namespace cuda { @@ -93,13 +93,13 @@ struct NA1DLauncher { DeviceKernel gemm; cutlass::Status status = gemm.can_implement(arguments); - CUTLASS_CHECK(status); + NATTEN_CUTLASS_CHECK(status); status = gemm.initialize(arguments, nullptr, stream); - CUTLASS_CHECK(status); + NATTEN_CUTLASS_CHECK(status); status = gemm(stream); - CUTLASS_CHECK(status); + NATTEN_CUTLASS_CHECK(status); } public: diff --git a/csrc/include/natten/cuda/gemm/na2d.cuh b/csrc/include/natten/cuda/gemm/na2d.cuh index 082052e..d9839b1 100644 --- a/csrc/include/natten/cuda/gemm/na2d.cuh +++ b/csrc/include/natten/cuda/gemm/na2d.cuh @@ -33,13 +33,13 @@ #include #include +#include #include #include #include #include #include #include -#include namespace natten { namespace cuda { @@ -93,13 +93,13 @@ struct NA2DLauncher { DeviceKernel gemm; cutlass::Status status = gemm.can_implement(arguments); - CUTLASS_CHECK(status); + NATTEN_CUTLASS_CHECK(status); status = gemm.initialize(arguments, nullptr, stream); - CUTLASS_CHECK(status); + NATTEN_CUTLASS_CHECK(status); status = gemm(stream); - CUTLASS_CHECK(status); + NATTEN_CUTLASS_CHECK(status); } public: @@ -251,7 +251,8 @@ struct PointwiseNeighborhood2D { // PN refs auto layout_ab = LayoutOperand( dim, dim * width, dim * height * width, dim * height * width * heads); - auto layout_c = LayoutOperand(attn_stride_3, attn_stride_2, attn_stride_1, attn_stride_0); + auto layout_c = LayoutOperand( + attn_stride_3, attn_stride_2, attn_stride_1, attn_stride_0); auto ref_a = RefOperand(static_cast(ptr_query), layout_ab); auto ref_b = RefOperand(static_cast(ptr_key), layout_ab); auto ref_c = RefOutput(static_cast(ptr_attn), layout_c); @@ -374,7 +375,8 @@ struct NeighborhoodNeighborhood2D { const float scale, cudaStream_t stream) { // NN refs - auto layout_a = LayoutOperand(attn_stride_3, attn_stride_2, attn_stride_1, attn_stride_0); + auto layout_a = LayoutOperand( + attn_stride_3, attn_stride_2, attn_stride_1, attn_stride_0); auto layout_bc = LayoutOperand( dim, dim * width, dim * height * width, dim * height * width * heads); auto ref_a = RefOperand(static_cast(ptr_attn), layout_a); @@ -477,7 +479,8 @@ struct InverseNeighborhood2D { const float scale, cudaStream_t stream) { // IN refs - auto layout_a = LayoutOperand(attn_stride_3, attn_stride_2, attn_stride_1, attn_stride_0); + auto layout_a = LayoutOperand( + attn_stride_3, attn_stride_2, attn_stride_1, attn_stride_0); auto layout_bc = LayoutOperand( dim, dim * width, dim * height * width, dim * height * width * heads); auto ref_a = RefOperand(static_cast(ptr_attn), layout_a); diff --git a/csrc/include/natten/cuda/gemm/threadblock/default_epilogue_simt.cuh b/csrc/include/natten/cuda/gemm/threadblock/default_epilogue_simt.cuh deleted file mode 100644 index b5d932a..0000000 --- a/csrc/include/natten/cuda/gemm/threadblock/default_epilogue_simt.cuh +++ /dev/null @@ -1,167 +0,0 @@ -/*************************************************************************************************** - * Copyright (c) 2022-2024 Ali Hassani. - * NATTEN's CUTLASS kernels started off from CUTLASS 2.X's implicit GEMM kernels - *for convolution. - **************************************************************************************************/ -/*************************************************************************************************** - * Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights - *reserved. SPDX-License-Identifier: BSD-3-Clause - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - *this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - *POSSIBILITY OF SUCH DAMAGE. - * - **************************************************************************************************/ -/*! \file - \brief Epilogue for threadblock scoped GEMMs using SIMT. - - The epilogue rearranges the result of a matrix product through shared memory - to match canonical tensor layouts in global memory. Epilogues support - conversion and reduction operations. - -*/ - -#pragma once - -#include "cutlass/array.h" -#include "cutlass/cutlass.h" -#include "cutlass/numeric_types.h" - -#include "cutlass/arch/mma.h" - -#include "cutlass/gemm/gemm.h" -#include "cutlass/gemm/warp/mma.h" - -#include "cutlass/epilogue/thread/conversion_op.h" -#include "cutlass/epilogue/thread/linear_combination.h" -#include "cutlass/epilogue/thread/linear_combination_clamp.h" -#include "cutlass/epilogue/thread/linear_combination_gelu.h" -#include "cutlass/epilogue/thread/linear_combination_planar_complex.h" -#include "cutlass/epilogue/thread/linear_combination_relu.h" -#include "cutlass/epilogue/thread/linear_combination_sigmoid.h" -#include "cutlass/epilogue/thread/reduction_op.h" - -#include "cutlass/transform/threadblock/regular_tile_iterator_pitch_linear.h" - -#include "cutlass/epilogue/threadblock/default_thread_map_simt.h" -#include "cutlass/epilogue/warp/fragment_iterator_simt.h" -#include "cutlass/epilogue/warp/tile_iterator_simt.h" -#include "cutlass/transform/pitch_linear_thread_map.h" - -#include "cutlass/epilogue/threadblock/epilogue.h" -#include "cutlass/epilogue/threadblock/epilogue_depthwise.h" -#include "cutlass/epilogue/threadblock/predicated_tile_iterator.h" -#include "cutlass/epilogue/threadblock/predicated_tile_iterator_affine.h" -#include "cutlass/epilogue/threadblock/predicated_tile_iterator_direct_conv.h" -#include "cutlass/epilogue/threadblock/predicated_tile_iterator_strided_dgrad.h" -#include "cutlass/epilogue/threadblock/shared_load_iterator.h" -#include "cutlass/epilogue/threadblock/shared_load_iterator_pitch_liner.h" - -#include "cutlass/layout/permute.h" - -///////////////////////////////////////////////////////////////////////////////////////////////// - -namespace natten { -namespace cuda { -namespace gemm { -namespace threadblock { - -///////////////////////////////////////////////////////////////////////////////////////////////// - -/// Defines sensible defaults for epilogues for SimtOps. -template < - typename Shape_, - typename WarpMmaSimt_, - typename OutputOp_, - int ElementsPerAccess, - typename OutputTileIterator, - bool ScatterD = false, - typename PermuteDLayout = cutlass::layout::NoPermute> -struct DefaultEpilogueSimt { - using Shape = Shape_; - using WarpMmaSimt = WarpMmaSimt_; - using OutputOp = OutputOp_; - static int const kElementsPerAccess = ElementsPerAccess; - static const int kPartitionsK = Shape::kK / WarpMmaSimt::Shape::kK; - - using ElementOutput = typename OutputOp::ElementOutput; - using LayoutC = typename WarpMmaSimt::LayoutC; - using ElementAccumulator = typename WarpMmaSimt::ElementC; - - // - // Thread map - // - - using OutputTileThreadMap = - typename cutlass::epilogue::threadblock::DefaultThreadMapSimt< - Shape, - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::Policy, - kPartitionsK, - ElementOutput, - kElementsPerAccess>::Type; - - using AccumulatorFragmentIterator = - cutlass::epilogue::warp::FragmentIteratorSimt< - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::ThreadMma, - cutlass::layout::RowMajor, - typename WarpMmaSimt::Policy>; - - using WarpTileIterator = cutlass::epilogue::warp::TileIteratorSimt< - typename WarpMmaSimt::Shape, - typename WarpMmaSimt::ThreadMma, - ElementAccumulator, - cutlass::layout::RowMajor, - typename WarpMmaSimt::Policy>; - - using SharedLoadIterator = cutlass::epilogue::threadblock::SharedLoadIterator< - typename OutputTileThreadMap::CompactedThreadMap, - ElementAccumulator>; - - /// Hard-coded padding elements added - using Padding = typename WarpTileIterator::Padding; - - // - // Define the epilogue - // - using Epilogue = cutlass::epilogue::threadblock::Epilogue< - Shape, - WarpMmaSimt, - kPartitionsK, - OutputTileIterator, - AccumulatorFragmentIterator, - WarpTileIterator, - SharedLoadIterator, - OutputOp, - Padding>; -}; - -} // namespace threadblock -} // namespace gemm -} // namespace cuda -} // namespace natten - -//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh b/csrc/include/natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh deleted file mode 100644 index 1626bcc..0000000 --- a/csrc/include/natten/cuda/gemm/threadblock/default_epilogue_tensor_op.cuh +++ /dev/null @@ -1,173 +0,0 @@ -/*************************************************************************************************** - * Copyright (c) 2022-2024 Ali Hassani. - * NATTEN's CUTLASS kernels started off from CUTLASS 2.X's implicit GEMM kernels - *for convolution. - **************************************************************************************************/ -/*************************************************************************************************** - * Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights - *reserved. SPDX-License-Identifier: BSD-3-Clause - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - *this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - *LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - *INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - *CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - *ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - *POSSIBILITY OF SUCH DAMAGE. - * - **************************************************************************************************/ -/*! \file - \brief Epilogue for threadblock scoped GEMMs using Tensor Ops. - - The epilogue rearranges the result of a matrix product through shared memory - to match canonical tensor layouts in global memory. Epilogues support - conversion and reduction operations. - -*/ - -#pragma once - -#include -#include -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -//////////////////////////////////////////////////////////////////////////////// - -namespace natten { -namespace cuda { -namespace gemm { -namespace threadblock { - -//////////////////////////////////////////////////////////////////////////////// - -/// Defines sensible defaults for epilogues for TensorOps. -template < - typename Shape_, - typename WarpMmaTensorOp_, - int PartitionsK, - typename OutputOp_, - int ElementsPerAccess, - typename OutputTileIterator> -struct DefaultEpilogueTensorOp { - using Shape = Shape_; - using WarpMmaTensorOp = WarpMmaTensorOp_; - static int const kPartitionsK = PartitionsK; - using OutputOp = OutputOp_; - static int const kElementsPerAccess = ElementsPerAccess; - - using ElementOutput = typename OutputOp::ElementOutput; - using LayoutC = typename WarpMmaTensorOp::LayoutC; - using ElementAccumulator = typename WarpMmaTensorOp::ElementC; - - // - // Thread map - // - - using AccumulatorFragmentIterator = typename cutlass::platform::conditional< - cutlass::is_complex::value, - cutlass::epilogue::warp::FragmentIteratorComplexTensorOp< - typename WarpMmaTensorOp::Shape, - typename WarpMmaTensorOp::Policy::Operator::Shape, - typename WarpMmaTensorOp::Policy::Operator::ElementC, - typename WarpMmaTensorOp::Policy::Operator::FragmentC, - LayoutC>, - cutlass::epilogue::warp::FragmentIteratorTensorOp< - typename WarpMmaTensorOp::Shape, - typename WarpMmaTensorOp::Policy::Operator::Shape, - typename WarpMmaTensorOp::Policy::Operator::ElementC, - typename WarpMmaTensorOp::Policy::Operator::FragmentC, - LayoutC>>::type; - - /// Support several implementations depending on structure of epilogue - using DefaultIterators = - cutlass::epilogue::threadblock::detail::DefaultIteratorsTensorOp< - ElementOutput, - ElementAccumulator, - kElementsPerAccess, - Shape, - typename WarpMmaTensorOp::Shape, - typename WarpMmaTensorOp::Policy::Operator::Shape, - typename OutputTileIterator::ThreadMap::CompactedThreadMap>; - - using WarpTileIterator = typename DefaultIterators::WarpTileIterator; - using SharedLoadIterator = typename DefaultIterators::SharedLoadIterator; - - /// Hard-coded padding elements added - using Padding = cutlass:: - MatrixShape<0, 64 / cutlass::sizeof_bits::value * 4>; - - static int const kFragmentsPerIteration = - (kPartitionsK == 1 ? DefaultIterators::kFragmentsPerIteration : 1); - - // - // Define the epilogue - // - using Epilogue = cutlass::epilogue::threadblock::Epilogue< - Shape, - WarpMmaTensorOp, - kPartitionsK, - OutputTileIterator, - AccumulatorFragmentIterator, - WarpTileIterator, - SharedLoadIterator, - OutputOp, - Padding, - kFragmentsPerIteration>; -}; - -} // namespace threadblock -} // namespace gemm -} // namespace cuda -} // namespace natten - -//////////////////////////////////////////////////////////////////////////////// diff --git a/csrc/include/natten/cuda/gemm/threadblock/na1d_in_output_tile_iterator.cuh b/csrc/include/natten/cuda/gemm/threadblock/na1d_in_output_tile_iterator.cuh index 5e761b9..25d54e1 100644 --- a/csrc/include/natten/cuda/gemm/threadblock/na1d_in_output_tile_iterator.cuh +++ b/csrc/include/natten/cuda/gemm/threadblock/na1d_in_output_tile_iterator.cuh @@ -341,12 +341,12 @@ class NA1dINOutputTileIterator { } } - /// Adds a pointer offset in units of Element - CUTLASS_HOST_DEVICE - void add_pointer_offset(LongIndex pointer_offset) { - store_byte_pointer_ += - pointer_offset * cutlass::sizeof_bits::value / 8; - } + ///// Adds a pointer offset in units of Element + // CUTLASS_HOST_DEVICE + // void add_pointer_offset(LongIndex pointer_offset) { + // store_byte_pointer_ += + // pointer_offset * cutlass::sizeof_bits::value / 8; + //} /// Loads a fragment from memory CUTLASS_DEVICE @@ -406,14 +406,14 @@ class NA1dINOutputTileIterator { } } - if (group + 1 < ThreadMap::Iterations::kGroup) { - byte_pointer += params_.increment_group; - } + // if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + //} } - if (cluster + 1 < ThreadMap::Iterations::kCluster) { - byte_pointer += params_.increment_cluster; - } + // if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + //} } } @@ -450,7 +450,7 @@ class NA1dINOutputTileIterator { if (state_[0] == ThreadMap::Count::kRow) { state_[0] = 0; ++state_[1]; - store_byte_pointer_ += params_.advance_group; + // store_byte_pointer_ += params_.advance_group; thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow; @@ -458,7 +458,7 @@ class NA1dINOutputTileIterator { if (state_[1] == ThreadMap::Count::kGroup) { state_[1] = 0; ++state_[2]; - store_byte_pointer_ += params_.advance_cluster; + // store_byte_pointer_ += params_.advance_cluster; thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * @@ -466,7 +466,7 @@ class NA1dINOutputTileIterator { if (state_[2] == ThreadMap::Count::kCluster) { state_[2] = 0; - store_byte_pointer_ += params_.advance_tile; + // store_byte_pointer_ += params_.advance_tile; thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * @@ -489,7 +489,7 @@ class NA1dINOutputTileIterator { int increment_row = state_[0] / ThreadMap::Count::kRow; state_[0] = state_[0] % ThreadMap::Count::kRow; - store_byte_pointer_ += (params_.advance_row * increment); + // store_byte_pointer_ += (params_.advance_row * increment); thread_start_row_ += (ThreadMap::Shape::kRow * increment); // Group @@ -497,7 +497,7 @@ class NA1dINOutputTileIterator { int increment_group = state_[1] / ThreadMap::Count::kGroup; state_[1] = state_[1] % ThreadMap::Count::kGroup; - store_byte_pointer_ += (params_.advance_group * increment_row); + // store_byte_pointer_ += (params_.advance_group * increment_row); thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow * increment_row; @@ -506,12 +506,12 @@ class NA1dINOutputTileIterator { int increment_cluster = state_[2] / ThreadMap::Count::kCluster; state_[2] = state_[2] % ThreadMap::Count::kCluster; - store_byte_pointer_ += (params_.advance_cluster * increment_group); + // store_byte_pointer_ += (params_.advance_cluster * increment_group); thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * ThreadMap::Shape::kRow * increment_group; // Tile - store_byte_pointer_ += (params_.advance_tile * increment_cluster); + // store_byte_pointer_ += (params_.advance_tile * increment_cluster); thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * ThreadMap::Shape::kTile * increment_cluster; diff --git a/csrc/include/natten/cuda/gemm/threadblock/na1d_nn_output_tile_iterator.cuh b/csrc/include/natten/cuda/gemm/threadblock/na1d_nn_output_tile_iterator.cuh index ed75f1d..209064a 100644 --- a/csrc/include/natten/cuda/gemm/threadblock/na1d_nn_output_tile_iterator.cuh +++ b/csrc/include/natten/cuda/gemm/threadblock/na1d_nn_output_tile_iterator.cuh @@ -341,12 +341,12 @@ class NA1dNNOutputTileIterator { } } - /// Adds a pointer offset in units of Element - CUTLASS_HOST_DEVICE - void add_pointer_offset(LongIndex pointer_offset) { - store_byte_pointer_ += - pointer_offset * cutlass::sizeof_bits::value / 8; - } + ///// Adds a pointer offset in units of Element + // CUTLASS_HOST_DEVICE + // void add_pointer_offset(LongIndex pointer_offset) { + // store_byte_pointer_ += + // pointer_offset * cutlass::sizeof_bits::value / 8; + //} /// Loads a fragment from memory CUTLASS_DEVICE @@ -406,14 +406,14 @@ class NA1dNNOutputTileIterator { } } - if (group + 1 < ThreadMap::Iterations::kGroup) { - byte_pointer += params_.increment_group; - } + // if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + //} } - if (cluster + 1 < ThreadMap::Iterations::kCluster) { - byte_pointer += params_.increment_cluster; - } + // if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + //} } } @@ -450,7 +450,7 @@ class NA1dNNOutputTileIterator { if (state_[0] == ThreadMap::Count::kRow) { state_[0] = 0; ++state_[1]; - store_byte_pointer_ += params_.advance_group; + // store_byte_pointer_ += params_.advance_group; thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow; @@ -458,7 +458,7 @@ class NA1dNNOutputTileIterator { if (state_[1] == ThreadMap::Count::kGroup) { state_[1] = 0; ++state_[2]; - store_byte_pointer_ += params_.advance_cluster; + // store_byte_pointer_ += params_.advance_cluster; thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * @@ -466,7 +466,7 @@ class NA1dNNOutputTileIterator { if (state_[2] == ThreadMap::Count::kCluster) { state_[2] = 0; - store_byte_pointer_ += params_.advance_tile; + // store_byte_pointer_ += params_.advance_tile; thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * @@ -489,7 +489,7 @@ class NA1dNNOutputTileIterator { int increment_row = state_[0] / ThreadMap::Count::kRow; state_[0] = state_[0] % ThreadMap::Count::kRow; - store_byte_pointer_ += (params_.advance_row * increment); + // store_byte_pointer_ += (params_.advance_row * increment); thread_start_row_ += (ThreadMap::Shape::kRow * increment); // Group @@ -497,7 +497,7 @@ class NA1dNNOutputTileIterator { int increment_group = state_[1] / ThreadMap::Count::kGroup; state_[1] = state_[1] % ThreadMap::Count::kGroup; - store_byte_pointer_ += (params_.advance_group * increment_row); + // store_byte_pointer_ += (params_.advance_group * increment_row); thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow * increment_row; @@ -506,12 +506,12 @@ class NA1dNNOutputTileIterator { int increment_cluster = state_[2] / ThreadMap::Count::kCluster; state_[2] = state_[2] % ThreadMap::Count::kCluster; - store_byte_pointer_ += (params_.advance_cluster * increment_group); + // store_byte_pointer_ += (params_.advance_cluster * increment_group); thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * ThreadMap::Shape::kRow * increment_group; // Tile - store_byte_pointer_ += (params_.advance_tile * increment_cluster); + // store_byte_pointer_ += (params_.advance_tile * increment_cluster); thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * ThreadMap::Shape::kTile * increment_cluster; diff --git a/csrc/include/natten/cuda/gemm/threadblock/na1d_pn_output_tile_iterator.cuh b/csrc/include/natten/cuda/gemm/threadblock/na1d_pn_output_tile_iterator.cuh index 27198f0..bddd058 100644 --- a/csrc/include/natten/cuda/gemm/threadblock/na1d_pn_output_tile_iterator.cuh +++ b/csrc/include/natten/cuda/gemm/threadblock/na1d_pn_output_tile_iterator.cuh @@ -224,12 +224,12 @@ class NA1dPNOutputTileIterator { state_[0] = state_[1] = state_[2] = 0; } - /// Adds a pointer offset in units of Element - CUTLASS_HOST_DEVICE - void add_pointer_offset(LongIndex pointer_offset) { - store_byte_pointer_ += - pointer_offset * cutlass::sizeof_bits::value / 8; - } + ///// Adds a pointer offset in units of Element + // CUTLASS_HOST_DEVICE + // void add_pointer_offset(LongIndex pointer_offset) { + // store_byte_pointer_ += + // pointer_offset * cutlass::sizeof_bits::value / 8; + //} /// Loads a fragment from memory CUTLASS_DEVICE @@ -291,14 +291,14 @@ class NA1dPNOutputTileIterator { } } - if (group + 1 < ThreadMap::Iterations::kGroup) { - byte_pointer += params_.increment_group; - } + // if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + //} } - if (cluster + 1 < ThreadMap::Iterations::kCluster) { - byte_pointer += params_.increment_cluster; - } + // if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + //} } } @@ -392,14 +392,14 @@ class NA1dPNOutputTileIterator { } } - if (group + 1 < ThreadMap::Iterations::kGroup) { - byte_pointer += params_.increment_group; - } + // if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + //} } - if (cluster + 1 < ThreadMap::Iterations::kCluster) { - byte_pointer += params_.increment_cluster; - } + // if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + //} } } @@ -436,7 +436,7 @@ class NA1dPNOutputTileIterator { if (state_[0] == ThreadMap::Count::kRow) { state_[0] = 0; ++state_[1]; - store_byte_pointer_ += params_.advance_group; + // store_byte_pointer_ += params_.advance_group; thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow; @@ -444,7 +444,7 @@ class NA1dPNOutputTileIterator { if (state_[1] == ThreadMap::Count::kGroup) { state_[1] = 0; ++state_[2]; - store_byte_pointer_ += params_.advance_cluster; + // store_byte_pointer_ += params_.advance_cluster; thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * @@ -452,7 +452,7 @@ class NA1dPNOutputTileIterator { if (state_[2] == ThreadMap::Count::kCluster) { state_[2] = 0; - store_byte_pointer_ += params_.advance_tile; + // store_byte_pointer_ += params_.advance_tile; thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * @@ -472,7 +472,7 @@ class NA1dPNOutputTileIterator { int increment_row = state_[0] / ThreadMap::Count::kRow; state_[0] = state_[0] % ThreadMap::Count::kRow; - store_byte_pointer_ += (params_.advance_row * increment); + // store_byte_pointer_ += (params_.advance_row * increment); thread_start_row_ += (ThreadMap::Shape::kRow * increment); // Group @@ -480,7 +480,7 @@ class NA1dPNOutputTileIterator { int increment_group = state_[1] / ThreadMap::Count::kGroup; state_[1] = state_[1] % ThreadMap::Count::kGroup; - store_byte_pointer_ += (params_.advance_group * increment_row); + // store_byte_pointer_ += (params_.advance_group * increment_row); thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow * increment_row; @@ -489,12 +489,12 @@ class NA1dPNOutputTileIterator { int increment_cluster = state_[2] / ThreadMap::Count::kCluster; state_[2] = state_[2] % ThreadMap::Count::kCluster; - store_byte_pointer_ += (params_.advance_cluster * increment_group); + // store_byte_pointer_ += (params_.advance_cluster * increment_group); thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * ThreadMap::Shape::kRow * increment_group; // Tile - store_byte_pointer_ += (params_.advance_tile * increment_cluster); + // store_byte_pointer_ += (params_.advance_tile * increment_cluster); thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * ThreadMap::Shape::kTile * increment_cluster; diff --git a/csrc/include/natten/cuda/gemm/threadblock/na2d_in_output_tile_iterator.cuh b/csrc/include/natten/cuda/gemm/threadblock/na2d_in_output_tile_iterator.cuh index e14fe42..99b3bcc 100644 --- a/csrc/include/natten/cuda/gemm/threadblock/na2d_in_output_tile_iterator.cuh +++ b/csrc/include/natten/cuda/gemm/threadblock/na2d_in_output_tile_iterator.cuh @@ -348,12 +348,12 @@ class NA2dINOutputTileIterator { } } - /// Adds a pointer offset in units of Element - CUTLASS_HOST_DEVICE - void add_pointer_offset(LongIndex pointer_offset) { - store_byte_pointer_ += - pointer_offset * cutlass::sizeof_bits::value / 8; - } + ///// Adds a pointer offset in units of Element + // CUTLASS_HOST_DEVICE + // void add_pointer_offset(LongIndex pointer_offset) { + // store_byte_pointer_ += + // pointer_offset * cutlass::sizeof_bits::value / 8; + //} /// Loads a fragment from memory CUTLASS_DEVICE @@ -413,14 +413,14 @@ class NA2dINOutputTileIterator { } } - if (group + 1 < ThreadMap::Iterations::kGroup) { - byte_pointer += params_.increment_group; - } + // if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + //} } - if (cluster + 1 < ThreadMap::Iterations::kCluster) { - byte_pointer += params_.increment_cluster; - } + // if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + //} } } @@ -457,7 +457,7 @@ class NA2dINOutputTileIterator { if (state_[0] == ThreadMap::Count::kRow) { state_[0] = 0; ++state_[1]; - store_byte_pointer_ += params_.advance_group; + // store_byte_pointer_ += params_.advance_group; thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow; @@ -465,7 +465,7 @@ class NA2dINOutputTileIterator { if (state_[1] == ThreadMap::Count::kGroup) { state_[1] = 0; ++state_[2]; - store_byte_pointer_ += params_.advance_cluster; + // store_byte_pointer_ += params_.advance_cluster; thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * @@ -473,7 +473,7 @@ class NA2dINOutputTileIterator { if (state_[2] == ThreadMap::Count::kCluster) { state_[2] = 0; - store_byte_pointer_ += params_.advance_tile; + // store_byte_pointer_ += params_.advance_tile; thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * @@ -496,7 +496,7 @@ class NA2dINOutputTileIterator { int increment_row = state_[0] / ThreadMap::Count::kRow; state_[0] = state_[0] % ThreadMap::Count::kRow; - store_byte_pointer_ += (params_.advance_row * increment); + // store_byte_pointer_ += (params_.advance_row * increment); thread_start_row_ += (ThreadMap::Shape::kRow * increment); // Group @@ -504,7 +504,7 @@ class NA2dINOutputTileIterator { int increment_group = state_[1] / ThreadMap::Count::kGroup; state_[1] = state_[1] % ThreadMap::Count::kGroup; - store_byte_pointer_ += (params_.advance_group * increment_row); + // store_byte_pointer_ += (params_.advance_group * increment_row); thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow * increment_row; @@ -513,12 +513,12 @@ class NA2dINOutputTileIterator { int increment_cluster = state_[2] / ThreadMap::Count::kCluster; state_[2] = state_[2] % ThreadMap::Count::kCluster; - store_byte_pointer_ += (params_.advance_cluster * increment_group); + // store_byte_pointer_ += (params_.advance_cluster * increment_group); thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * ThreadMap::Shape::kRow * increment_group; // Tile - store_byte_pointer_ += (params_.advance_tile * increment_cluster); + // store_byte_pointer_ += (params_.advance_tile * increment_cluster); thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * ThreadMap::Shape::kTile * increment_cluster; diff --git a/csrc/include/natten/cuda/gemm/threadblock/na2d_nn_output_tile_iterator.cuh b/csrc/include/natten/cuda/gemm/threadblock/na2d_nn_output_tile_iterator.cuh index fb9c7a3..66d4b30 100644 --- a/csrc/include/natten/cuda/gemm/threadblock/na2d_nn_output_tile_iterator.cuh +++ b/csrc/include/natten/cuda/gemm/threadblock/na2d_nn_output_tile_iterator.cuh @@ -348,12 +348,12 @@ class NA2dNNOutputTileIterator { } } - /// Adds a pointer offset in units of Element - CUTLASS_HOST_DEVICE - void add_pointer_offset(LongIndex pointer_offset) { - store_byte_pointer_ += - pointer_offset * cutlass::sizeof_bits::value / 8; - } + ///// Adds a pointer offset in units of Element + // CUTLASS_HOST_DEVICE + // void add_pointer_offset(LongIndex pointer_offset) { + // store_byte_pointer_ += + // pointer_offset * cutlass::sizeof_bits::value / 8; + //} /// Loads a fragment from memory CUTLASS_DEVICE @@ -413,14 +413,14 @@ class NA2dNNOutputTileIterator { } } - if (group + 1 < ThreadMap::Iterations::kGroup) { - byte_pointer += params_.increment_group; - } + // if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + //} } - if (cluster + 1 < ThreadMap::Iterations::kCluster) { - byte_pointer += params_.increment_cluster; - } + // if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + //} } } @@ -457,7 +457,7 @@ class NA2dNNOutputTileIterator { if (state_[0] == ThreadMap::Count::kRow) { state_[0] = 0; ++state_[1]; - store_byte_pointer_ += params_.advance_group; + // store_byte_pointer_ += params_.advance_group; thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow; @@ -465,7 +465,7 @@ class NA2dNNOutputTileIterator { if (state_[1] == ThreadMap::Count::kGroup) { state_[1] = 0; ++state_[2]; - store_byte_pointer_ += params_.advance_cluster; + // store_byte_pointer_ += params_.advance_cluster; thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * @@ -473,7 +473,7 @@ class NA2dNNOutputTileIterator { if (state_[2] == ThreadMap::Count::kCluster) { state_[2] = 0; - store_byte_pointer_ += params_.advance_tile; + // store_byte_pointer_ += params_.advance_tile; thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * @@ -496,7 +496,7 @@ class NA2dNNOutputTileIterator { int increment_row = state_[0] / ThreadMap::Count::kRow; state_[0] = state_[0] % ThreadMap::Count::kRow; - store_byte_pointer_ += (params_.advance_row * increment); + // store_byte_pointer_ += (params_.advance_row * increment); thread_start_row_ += (ThreadMap::Shape::kRow * increment); // Group @@ -504,7 +504,7 @@ class NA2dNNOutputTileIterator { int increment_group = state_[1] / ThreadMap::Count::kGroup; state_[1] = state_[1] % ThreadMap::Count::kGroup; - store_byte_pointer_ += (params_.advance_group * increment_row); + // store_byte_pointer_ += (params_.advance_group * increment_row); thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow * increment_row; @@ -513,12 +513,12 @@ class NA2dNNOutputTileIterator { int increment_cluster = state_[2] / ThreadMap::Count::kCluster; state_[2] = state_[2] % ThreadMap::Count::kCluster; - store_byte_pointer_ += (params_.advance_cluster * increment_group); + // store_byte_pointer_ += (params_.advance_cluster * increment_group); thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * ThreadMap::Shape::kRow * increment_group; // Tile - store_byte_pointer_ += (params_.advance_tile * increment_cluster); + // store_byte_pointer_ += (params_.advance_tile * increment_cluster); thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * ThreadMap::Shape::kTile * increment_cluster; diff --git a/csrc/include/natten/cuda/gemm/threadblock/na2d_pn_output_tile_iterator.cuh b/csrc/include/natten/cuda/gemm/threadblock/na2d_pn_output_tile_iterator.cuh index cfc344b..76e9c52 100644 --- a/csrc/include/natten/cuda/gemm/threadblock/na2d_pn_output_tile_iterator.cuh +++ b/csrc/include/natten/cuda/gemm/threadblock/na2d_pn_output_tile_iterator.cuh @@ -224,12 +224,12 @@ class NA2dPNOutputTileIterator { state_[0] = state_[1] = state_[2] = 0; } - /// Adds a pointer offset in units of Element - CUTLASS_HOST_DEVICE - void add_pointer_offset(LongIndex pointer_offset) { - store_byte_pointer_ += - pointer_offset * cutlass::sizeof_bits::value / 8; - } + ///// Adds a pointer offset in units of Element + // CUTLASS_HOST_DEVICE + // void add_pointer_offset(LongIndex pointer_offset) { + // store_byte_pointer_ += + // pointer_offset * cutlass::sizeof_bits::value / 8; + //} /// Loads a fragment from memory CUTLASS_DEVICE @@ -308,14 +308,14 @@ class NA2dPNOutputTileIterator { } } - if (group + 1 < ThreadMap::Iterations::kGroup) { - byte_pointer += params_.increment_group; - } + // if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + //} } - if (cluster + 1 < ThreadMap::Iterations::kCluster) { - byte_pointer += params_.increment_cluster; - } + // if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + //} } } @@ -425,14 +425,14 @@ class NA2dPNOutputTileIterator { } } - if (group + 1 < ThreadMap::Iterations::kGroup) { - byte_pointer += params_.increment_group; - } + // if (group + 1 < ThreadMap::Iterations::kGroup) { + // byte_pointer += params_.increment_group; + //} } - if (cluster + 1 < ThreadMap::Iterations::kCluster) { - byte_pointer += params_.increment_cluster; - } + // if (cluster + 1 < ThreadMap::Iterations::kCluster) { + // byte_pointer += params_.increment_cluster; + //} } } @@ -469,7 +469,7 @@ class NA2dPNOutputTileIterator { if (state_[0] == ThreadMap::Count::kRow) { state_[0] = 0; ++state_[1]; - store_byte_pointer_ += params_.advance_group; + // store_byte_pointer_ += params_.advance_group; thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow; @@ -477,7 +477,7 @@ class NA2dPNOutputTileIterator { if (state_[1] == ThreadMap::Count::kGroup) { state_[1] = 0; ++state_[2]; - store_byte_pointer_ += params_.advance_cluster; + // store_byte_pointer_ += params_.advance_cluster; thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * @@ -485,7 +485,7 @@ class NA2dPNOutputTileIterator { if (state_[2] == ThreadMap::Count::kCluster) { state_[2] = 0; - store_byte_pointer_ += params_.advance_tile; + // store_byte_pointer_ += params_.advance_tile; thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * @@ -505,7 +505,7 @@ class NA2dPNOutputTileIterator { int increment_row = state_[0] / ThreadMap::Count::kRow; state_[0] = state_[0] % ThreadMap::Count::kRow; - store_byte_pointer_ += (params_.advance_row * increment); + // store_byte_pointer_ += (params_.advance_row * increment); thread_start_row_ += (ThreadMap::Shape::kRow * increment); // Group @@ -513,7 +513,7 @@ class NA2dPNOutputTileIterator { int increment_group = state_[1] / ThreadMap::Count::kGroup; state_[1] = state_[1] % ThreadMap::Count::kGroup; - store_byte_pointer_ += (params_.advance_group * increment_row); + // store_byte_pointer_ += (params_.advance_group * increment_row); thread_start_row_ += (ThreadMap::Shape::kGroup - 1) * ThreadMap::Shape::kRow * ThreadMap::Count::kRow * increment_row; @@ -522,12 +522,12 @@ class NA2dPNOutputTileIterator { int increment_cluster = state_[2] / ThreadMap::Count::kCluster; state_[2] = state_[2] % ThreadMap::Count::kCluster; - store_byte_pointer_ += (params_.advance_cluster * increment_group); + // store_byte_pointer_ += (params_.advance_cluster * increment_group); thread_start_row_ += ThreadMap::Count::kGroup * ThreadMap::Shape::kGroup * ThreadMap::Count::kRow * ThreadMap::Shape::kRow * increment_group; // Tile - store_byte_pointer_ += (params_.advance_tile * increment_cluster); + // store_byte_pointer_ += (params_.advance_tile * increment_cluster); thread_start_row_ += ThreadMap::Shape::kGroup * ThreadMap::Shape::kRow * ThreadMap::Shape::kCluster * ThreadMap::Shape::kTile * increment_cluster; diff --git a/csrc/include/natten/cuda/na1d.cuh b/csrc/include/natten/cuda/na1d.cuh index 8c054b8..3665728 100644 --- a/csrc/include/natten/cuda/na1d.cuh +++ b/csrc/include/natten/cuda/na1d.cuh @@ -27,33 +27,92 @@ #pragma once #include +#include #include #ifdef NATTEN_WITH_CUTLASS #include +#include #endif namespace natten { namespace cuda { +template +void na1d_forward( + int32_t cc, + size_t max_smem, + cudaStream_t stream, + void* query_ptr, + void* key_ptr, + void* value_ptr, + void* out_ptr, + void* rpb_ptr, + int32_t batch_size, + int32_t length, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { +#ifdef NATTEN_WITH_CUTLASS + if (cc >= 80 || (cc >= 50 && !std::is_same::value)) { + natten::cuda::fna::fna_forward_generic( + cc, + max_smem, + stream, + query_ptr, + key_ptr, + value_ptr, + out_ptr, + rpb_ptr, + batch_size, + {length}, + heads, + dim, + dim, // dim_value + kernel_size, + dilation, + is_causal, + attn_scale, + nullptr, // TODO: pass logsumexp_ptr when backward kernel is implemented + query_tile_size, + key_tile_size); + } else { +#endif + NATTEN_FAILURE( + "Fused kernels are only available on devices with " + "compute capability >= 50 for FP16/FP32 inputs, and devices with " + "compute capability >= 80 for FP32, BF16, and FP16 inputs."); +#ifdef NATTEN_WITH_CUTLASS + } +#endif +} + template void na1d_qk_forward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* query_ptr, void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { #ifdef NATTEN_WITH_CUTLASS if (natten::kEnableGemmNA && + !any_true(is_causal) && // TODO: remove when GEMM supports causal masking (cc >= 80 || (cc >= 70 && std::is_same::value))) { LAUNCH_na1d_pn_cuda_gemm( cc, @@ -70,8 +129,8 @@ void na1d_qk_forward( attn_stride_0, attn_stride_1, attn_stride_2, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), 1.0, stream); } else { @@ -79,10 +138,12 @@ void na1d_qk_forward( if (bias_ptr == nullptr) { DISPATCH_DTYPE_na1d_pn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, + /* is_grad = */ false, query_ptr, key_ptr, attn_ptr, @@ -96,10 +157,14 @@ void na1d_qk_forward( kernel_size, dilation); } else { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na1d_pn_bias_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, query_ptr, @@ -123,7 +188,8 @@ void na1d_qk_forward( template void na1d_qk_backward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* query_ptr, void* key_ptr, @@ -131,17 +197,19 @@ void na1d_qk_backward( void* d_query_ptr, void* d_key_ptr, void* d_bias_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { #ifdef NATTEN_WITH_CUTLASS if (natten::kEnableGemmNA && + !any_true(is_causal) && // TODO: remove when GEMM supports causal masking (cc >= 80 || (cc >= 70 && std::is_same::value))) { LAUNCH_na1d_nn_cuda_gemm( cc, @@ -157,8 +225,8 @@ void na1d_qk_backward( attn_stride_0, attn_stride_1, attn_stride_2, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), 1.0, stream); LAUNCH_na1d_in_cuda_gemm( @@ -175,16 +243,17 @@ void na1d_qk_backward( attn_stride_0, attn_stride_1, attn_stride_2, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), 1.0, stream); } else { #endif DISPATCH_DTYPE_na1d_nn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, d_attn_ptr, @@ -201,8 +270,9 @@ void na1d_qk_backward( dilation); DISPATCH_DTYPE_na1d_in_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, d_attn_ptr, @@ -221,10 +291,14 @@ void na1d_qk_backward( } #endif if (d_bias_ptr != nullptr) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na1d_rpbgrad_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, d_bias_ptr, @@ -243,22 +317,25 @@ void na1d_qk_backward( template void na1d_av_forward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { #ifdef NATTEN_WITH_CUTLASS if (natten::kEnableGemmNA && + !any_true(is_causal) && // TODO: remove when GEMM supports causal masking (cc >= 80 || (cc >= 70 && std::is_same::value))) { LAUNCH_na1d_nn_cuda_gemm( cc, @@ -274,16 +351,17 @@ void na1d_av_forward( attn_stride_0, attn_stride_1, attn_stride_2, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), 1.0, stream); } else { #endif DISPATCH_DTYPE_na1d_nn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, attn_ptr, @@ -305,24 +383,27 @@ void na1d_av_forward( template void na1d_av_backward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* attn_ptr, void* value_ptr, void* d_output_ptr, void* d_attn_ptr, void* d_value_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { #ifdef NATTEN_WITH_CUTLASS if (natten::kEnableGemmNA && + !any_true(is_causal) && // TODO: remove when GEMM supports causal masking (cc >= 80 || (cc >= 70 && std::is_same::value))) { LAUNCH_na1d_pn_cuda_gemm( cc, @@ -339,8 +420,8 @@ void na1d_av_backward( attn_stride_0, attn_stride_1, attn_stride_2, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), 1.0, stream); LAUNCH_na1d_in_cuda_gemm( @@ -357,18 +438,20 @@ void na1d_av_backward( attn_stride_0, attn_stride_1, attn_stride_2, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), 1.0, stream); } else { #endif DISPATCH_DTYPE_na1d_pn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, + /* is_grad = */ true, d_output_ptr, value_ptr, d_attn_ptr, @@ -383,8 +466,9 @@ void na1d_av_backward( dilation); DISPATCH_DTYPE_na1d_in_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, attn_ptr, diff --git a/csrc/include/natten/cuda/na2d.cuh b/csrc/include/natten/cuda/na2d.cuh index 37f9e93..f4eea85 100644 --- a/csrc/include/natten/cuda/na2d.cuh +++ b/csrc/include/natten/cuda/na2d.cuh @@ -26,40 +26,105 @@ #pragma once +#include #include #ifdef NATTEN_WITH_CUTLASS #include +#include #endif namespace natten { namespace cuda { +template +void na2d_forward( + int32_t cc, + size_t max_smem, + cudaStream_t stream, + void* query_ptr, + void* key_ptr, + void* value_ptr, + void* out_ptr, + void* rpb_ptr, + int32_t batch_size, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { +#ifdef NATTEN_WITH_CUTLASS + if (cc >= 80 || (cc >= 50 && !std::is_same::value)) { + natten::cuda::fna::fna_forward_generic( + cc, + max_smem, + stream, + query_ptr, + key_ptr, + value_ptr, + out_ptr, + rpb_ptr, + batch_size, + {height, width}, + heads, + dim, + dim, // dim_value + kernel_size, + dilation, + is_causal, + attn_scale, + nullptr, // TODO: pass logsumexp_ptr when backward kernel is implemented + query_tile_size, + key_tile_size); + } else { +#endif + NATTEN_FAILURE( + "Fused kernels are only available on devices with " + "compute capability >= 50 for FP16/FP32 inputs, and devices with " + "compute capability >= 80 for FP32, BF16, and FP16 inputs."); +#ifdef NATTEN_WITH_CUTLASS + } +#endif +} + template void na2d_qk_forward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* query_ptr, void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { #ifdef NATTEN_WITH_CUTLASS if (natten::kEnableGemmNA && + !any_true(is_causal) && // TODO: remove when GEMM supports causal masking + all_dims_match(kernel_size) && // TODO: remove when GEMM supports varying + // kernel sizes + all_dims_match( + dilation) && // TODO: remove when GEMM supports varying dilations (cc >= 80 || (cc >= 70 && std::is_same::value))) { LAUNCH_na2d_pn_cuda_gemm( cc, T, - kernel_size, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes dim, query_ptr, key_ptr, @@ -74,8 +139,10 @@ void na2d_qk_forward( attn_stride_1, attn_stride_2, attn_stride_3, - kernel_size, - dilation, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes + std::get<0>( + dilation), // TODO: remove when GEMM supports varying dilations 1.0, stream); } else { @@ -83,10 +150,12 @@ void na2d_qk_forward( if (bias_ptr == nullptr) { DISPATCH_DTYPE_na2d_pn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, + /* is_grad = */ false, query_ptr, key_ptr, attn_ptr, @@ -102,10 +171,14 @@ void na2d_qk_forward( kernel_size, dilation); } else { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na2d_pn_bias_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, query_ptr, @@ -131,7 +204,8 @@ void na2d_qk_forward( template void na2d_qk_backward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* query_ptr, void* key_ptr, @@ -139,24 +213,31 @@ void na2d_qk_backward( void* d_query_ptr, void* d_key_ptr, void* d_bias_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { #ifdef NATTEN_WITH_CUTLASS if (natten::kEnableGemmNA && + !any_true(is_causal) && // TODO: remove when GEMM supports causal masking + all_dims_match(kernel_size) && // TODO: remove when GEMM supports varying + // kernel sizes + all_dims_match( + dilation) && // TODO: remove when GEMM supports varying dilations (cc >= 80 || (cc >= 70 && std::is_same::value))) { LAUNCH_na2d_nn_cuda_gemm( cc, T, - kernel_size, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes dim, d_attn_ptr, key_ptr, @@ -170,14 +251,17 @@ void na2d_qk_backward( attn_stride_1, attn_stride_2, attn_stride_3, - kernel_size, - dilation, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes + std::get<0>( + dilation), // TODO: remove when GEMM supports varying dilations 1.0, stream); LAUNCH_na2d_in_cuda_gemm( cc, T, - kernel_size, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes dim, d_attn_ptr, query_ptr, @@ -191,16 +275,19 @@ void na2d_qk_backward( attn_stride_1, attn_stride_2, attn_stride_3, - kernel_size, - dilation, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes + std::get<0>( + dilation), // TODO: remove when GEMM supports varying dilations 1.0, stream); } else { #endif DISPATCH_DTYPE_na2d_nn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, d_attn_ptr, @@ -219,8 +306,9 @@ void na2d_qk_backward( dilation); DISPATCH_DTYPE_na2d_in_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, d_attn_ptr, @@ -241,10 +329,14 @@ void na2d_qk_backward( } #endif if (d_bias_ptr != nullptr) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na2d_rpbgrad_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, d_bias_ptr, @@ -265,29 +357,37 @@ void na2d_qk_backward( template void na2d_av_forward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { #ifdef NATTEN_WITH_CUTLASS if (natten::kEnableGemmNA && + !any_true(is_causal) && // TODO: remove when GEMM supports causal masking + all_dims_match(kernel_size) && // TODO: remove when GEMM supports varying + // kernel sizes + all_dims_match( + dilation) && // TODO: remove when GEMM supports varying dilations (cc >= 80 || (cc >= 70 && std::is_same::value))) { LAUNCH_na2d_nn_cuda_gemm( cc, T, - kernel_size, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes dim, attn_ptr, value_ptr, @@ -301,16 +401,19 @@ void na2d_av_forward( attn_stride_1, attn_stride_2, attn_stride_3, - kernel_size, - dilation, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes + std::get<0>( + dilation), // TODO: remove when GEMM supports varying dilations 1.0, stream); } else { #endif DISPATCH_DTYPE_na2d_nn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, attn_ptr, @@ -334,31 +437,39 @@ void na2d_av_forward( template void na2d_av_backward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* attn_ptr, void* value_ptr, void* d_output_ptr, void* d_attn_ptr, void* d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { #ifdef NATTEN_WITH_CUTLASS if (natten::kEnableGemmNA && + !any_true(is_causal) && // TODO: remove when GEMM supports causal masking + all_dims_match(kernel_size) && // TODO: remove when GEMM supports varying + // kernel sizes + all_dims_match( + dilation) && // TODO: remove when GEMM supports varying dilations (cc >= 80 || (cc >= 70 && std::is_same::value))) { LAUNCH_na2d_pn_cuda_gemm( cc, T, - kernel_size, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes dim, d_output_ptr, value_ptr, @@ -373,14 +484,17 @@ void na2d_av_backward( attn_stride_1, attn_stride_2, attn_stride_3, - kernel_size, - dilation, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes + std::get<0>( + dilation), // TODO: remove when GEMM supports varying dilations 1.0, stream); LAUNCH_na2d_in_cuda_gemm( cc, T, - kernel_size, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes dim, attn_ptr, d_output_ptr, @@ -394,18 +508,22 @@ void na2d_av_backward( attn_stride_1, attn_stride_2, attn_stride_3, - kernel_size, - dilation, + std::get<0>(kernel_size), // TODO: remove when GEMM supports varying + // kernel sizes + std::get<0>( + dilation), // TODO: remove when GEMM supports varying dilations 1.0, stream); } else { #endif DISPATCH_DTYPE_na2d_pn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, + /* is_grad = */ true, d_output_ptr, value_ptr, d_attn_ptr, @@ -422,8 +540,9 @@ void na2d_av_backward( dilation); DISPATCH_DTYPE_na2d_in_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, attn_ptr, diff --git a/csrc/include/natten/cuda/na3d.cuh b/csrc/include/natten/cuda/na3d.cuh index 063df23..ca62659 100644 --- a/csrc/include/natten/cuda/na3d.cuh +++ b/csrc/include/natten/cuda/na3d.cuh @@ -26,41 +26,103 @@ #pragma once +#include #include +#ifdef NATTEN_WITH_CUTLASS +#include +#endif namespace natten { namespace cuda { +template +void na3d_forward( + int32_t cc, + size_t max_smem, + cudaStream_t stream, + void* query_ptr, + void* key_ptr, + void* value_ptr, + void* out_ptr, + void* rpb_ptr, + int32_t batch_size, + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { +#ifdef NATTEN_WITH_CUTLASS + if (cc >= 80 || (cc >= 50 && !std::is_same::value)) { + natten::cuda::fna::fna_forward_generic( + cc, + max_smem, + stream, + query_ptr, + key_ptr, + value_ptr, + out_ptr, + rpb_ptr, + batch_size, + {depth, height, width}, + heads, + dim, + dim, // dim_value + kernel_size, + dilation, + is_causal, + attn_scale, + nullptr, // TODO: pass logsumexp_ptr when backward kernel is implemented + query_tile_size, + key_tile_size); + } else { +#endif + NATTEN_FAILURE( + "Fused kernels are only available on devices with " + "compute capability >= 50 for FP16/FP32 inputs, and devices with " + "compute capability >= 80 for FP32, BF16, and FP16 inputs."); +#ifdef NATTEN_WITH_CUTLASS + } +#endif +} + template void na3d_qk_forward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* query_ptr, void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int depth_kernel_size, - int depth_dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { if (bias_ptr == nullptr) { DISPATCH_DTYPE_na3d_pn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, + /* is_grad = */ false, query_ptr, key_ptr, attn_ptr, @@ -76,14 +138,16 @@ void na3d_qk_forward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, - dilation, - depth_dilation); + dilation); } else { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na3d_pn_bias_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, query_ptr, @@ -102,15 +166,14 @@ void na3d_qk_forward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, - dilation, - depth_dilation); + dilation); } } template void na3d_qk_backward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* query_ptr, void* key_ptr, @@ -118,25 +181,25 @@ void na3d_qk_backward( void* d_query_ptr, void* d_key_ptr, void* d_bias_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int depth_kernel_size, - int depth_dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na3d_nn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, d_attn_ptr, @@ -154,13 +217,12 @@ void na3d_qk_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, - dilation, - depth_dilation); + dilation); DISPATCH_DTYPE_na3d_in_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, d_attn_ptr, @@ -178,14 +240,16 @@ void na3d_qk_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, - dilation, - depth_dilation); + dilation); if (d_bias_ptr != nullptr) { + NATTEN_CHECK( + !any_true(is_causal), + "Neighborhood attention with causal masking does not support positional biases yet."); DISPATCH_DTYPE_na3d_rpbgrad_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, d_bias_ptr, @@ -202,38 +266,37 @@ void na3d_qk_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, - dilation, - depth_dilation); + dilation); } } template void na3d_av_forward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int depth_kernel_size, - int depth_dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na3d_nn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, attn_ptr, @@ -251,41 +314,41 @@ void na3d_av_forward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, - dilation, - depth_dilation); + dilation); } template void na3d_av_backward( - const int cc, + int32_t cc, + size_t max_smem, cudaStream_t stream, void* attn_ptr, void* value_ptr, void* d_output_ptr, void* d_attn_ptr, void* d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int dilation, - int depth_kernel_size, - int depth_dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE_na3d_pn_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, + /* is_grad = */ true, d_output_ptr, value_ptr, d_attn_ptr, @@ -301,13 +364,12 @@ void na3d_av_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, - dilation, - depth_dilation); + dilation); DISPATCH_DTYPE_na3d_in_cuda_naive( T, - kernel_size, - dilation, + is_causal, + // kernel_size, + // dilation, cc, stream, attn_ptr, @@ -325,9 +387,7 @@ void na3d_av_backward( attn_stride_3, attn_stride_4, kernel_size, - depth_kernel_size, - dilation, - depth_dilation); + dilation); } } // namespace cuda diff --git a/csrc/include/natten/cuda/naive/inverse_neighborhood_1d.cuh b/csrc/include/natten/cuda/naive/inverse_neighborhood_1d.cuh index 6325d78..8fd2e1c 100644 --- a/csrc/include/natten/cuda/naive/inverse_neighborhood_1d.cuh +++ b/csrc/include/natten/cuda/naive/inverse_neighborhood_1d.cuh @@ -31,6 +31,8 @@ #include #include +#include +#include #include namespace natten { @@ -43,14 +45,14 @@ struct InverseNeighborhood1DBase { scalar_t* weights; scalar_t* values; scalar_t* output; - const int length; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int dim; - const int64_t problem_size; - const int64_t weights_stride_0, weights_stride_1, weights_stride_2; - const int64_t values_stride_0, values_stride_1, values_stride_2; + int32_t length; + int32_t heads; + int32_t kernel_size; + int32_t dilation; + int32_t dim; + int64_t problem_size; + int64_t weights_stride_0, weights_stride_1, weights_stride_2; + int64_t values_stride_0, values_stride_1, values_stride_2; __device__ __host__ Params() {} @@ -58,22 +60,22 @@ struct InverseNeighborhood1DBase { scalar_t* weights, // d_attn / attn scalar_t* values, // query / d_out scalar_t* output, // d_key / d_value - const int length, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int dim, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t output_numel) + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t dim, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t output_numel) : weights(weights), values(values), output(output), length(length), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size(kernel_size), + dilation(dilation), dim(dim), problem_size(output_numel), weights_stride_2(weights_stride_2), @@ -97,49 +99,46 @@ struct InverseNeighborhood1DBase { } }; -template +template struct InverseNeighborhood1DFull : InverseNeighborhood1DBase { using Base = InverseNeighborhood1DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = false; static constexpr bool IsHalfKernel = false; static constexpr bool UsesSmem = false; __device__ __host__ InverseNeighborhood1DFull() : Base() {} - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { return dim; } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = + NeighborhoodMask(p.length, p.kernel_size, p.dilation); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.length; - const int i = indtmp1 - indtmp2 * p.length; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.length; + auto i = indtmp1 - indtmp2 * p.length; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; - const int ni = get_backward_window_start( - i, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ei = get_backward_window_end( - i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto ni = mask_0.get_backward_window_start(i); + auto ei = mask_0.get_backward_window_end(i); + + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; scalar_t output_update = scalar_t(0); -#pragma unroll - for (int xi = ni; xi < ei; xi += dilation) { - const int oni = get_window_start( - xi, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t valuesIndex = valuesOffset + xi * p.values_stride_2; - const int64_t weightsIndex = - weightsOffset + xi * p.weights_stride_2 + int((i - oni) / dilation); + for (int32_t xi = ni; xi < ei; xi += p.dilation) { + auto oni = mask_0.get_window_start(xi); + int64_t valuesIndex = valuesOffset + xi * p.values_stride_2; + int64_t weightsIndex = weightsOffset + xi * p.weights_stride_2 + + int32_t((i - oni) / p.dilation); output_update += p.weights[weightsIndex] * p.values[valuesIndex]; } p.output[linearIndex] = output_update; @@ -147,10 +146,11 @@ struct InverseNeighborhood1DFull : InverseNeighborhood1DBase { } }; -template +template struct InverseNeighborhood1DHalf : InverseNeighborhood1DBase { using Base = InverseNeighborhood1DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = IsBF16::value; static constexpr bool IsHalfKernel = true; static constexpr bool UsesSmem = false; @@ -158,7 +158,7 @@ struct InverseNeighborhood1DHalf : InverseNeighborhood1DBase { __device__ __host__ InverseNeighborhood1DHalf() : Base() {} using HalfHelper = typename HalfArray::Base; - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { if (dim % 2 != 0) { std::cerr << "Naive NATTEN half-precision kernels only support 32-bit alignment. " @@ -170,36 +170,33 @@ struct InverseNeighborhood1DHalf : InverseNeighborhood1DBase { } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = + NeighborhoodMask(p.length, p.kernel_size, p.dilation); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { auto values2 = HalfHelper::typecast(p.values); auto output2 = HalfHelper::typecast(p.output); - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.length; - const int i = indtmp1 - indtmp2 * p.length; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.length; + auto i = indtmp1 - indtmp2 * p.length; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; - const int ni = get_backward_window_start( - i, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ei = get_backward_window_end( - i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; - const int valuesOffset = + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto ni = mask_0.get_backward_window_start(i); + auto ei = mask_0.get_backward_window_end(i); + + int32_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; + int32_t valuesOffset = b * (p.dim * p.length * p.heads) + h * (p.dim * p.length) + d; - auto output_update = HalfHelper::zero(); -#pragma unroll - for (int xi = ni; xi < ei; xi += dilation) { - const int oni = get_window_start( - xi, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t valuesIndex = valuesOffset + xi * p.dim; - const int64_t weightsIndex = - weightsOffset + xi * p.weights_stride_2 + int((i - oni) / dilation); + auto output_update = HalfHelper::zeros(); + for (int32_t xi = ni; xi < ei; xi += p.dilation) { + auto oni = mask_0.get_window_start(xi); + int64_t valuesIndex = valuesOffset + xi * p.dim; + int64_t weightsIndex = weightsOffset + xi * p.weights_stride_2 + + int32_t((i - oni) / p.dilation); scalar_t a = p.weights[weightsIndex]; output_update = HalfHelper::fma(values2[valuesIndex], a, output_update); } @@ -211,31 +208,29 @@ struct InverseNeighborhood1DHalf : InverseNeighborhood1DBase { template struct InverseNeighborhood1D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - InverseNeighborhood1DFull, - InverseNeighborhood1DHalf>::type; + InverseNeighborhood1DFull, + InverseNeighborhood1DHalf>::type; using Params = typename Kernel::Params; void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* attn_ptr, void* d_output_ptr, void* d_value_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); int64_t problem_size = batch_size * heads * length * dim; auto grid = Kernel::Base::get_grid(problem_size); @@ -246,8 +241,8 @@ struct InverseNeighborhood1D { reinterpret_cast(d_value_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), dim, attn_stride_0, attn_stride_1, diff --git a/csrc/include/natten/cuda/naive/inverse_neighborhood_2d.cuh b/csrc/include/natten/cuda/naive/inverse_neighborhood_2d.cuh index cf75634..47dae08 100644 --- a/csrc/include/natten/cuda/naive/inverse_neighborhood_2d.cuh +++ b/csrc/include/natten/cuda/naive/inverse_neighborhood_2d.cuh @@ -31,6 +31,8 @@ #include #include +#include +#include #include namespace natten { @@ -43,17 +45,16 @@ struct InverseNeighborhood2DBase { scalar_t* weights; scalar_t* values; scalar_t* output; - const int height; - const int width; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int dim; - const int64_t problem_size; - const int64_t weights_stride_0, weights_stride_1, weights_stride_2, + int32_t height; + int32_t width; + int32_t heads; + int32_t kernel_size_0, kernel_size_1; + int32_t dilation_0, dilation_1; + int32_t dim; + int64_t problem_size; + int64_t weights_stride_0, weights_stride_1, weights_stride_2, weights_stride_3; - const int64_t values_stride_0, values_stride_1, values_stride_2, - values_stride_3; + int64_t values_stride_0, values_stride_1, values_stride_2, values_stride_3; __device__ __host__ Params() {} @@ -61,25 +62,29 @@ struct InverseNeighborhood2DBase { scalar_t* weights, // attn / d_attn scalar_t* values, // value / key scalar_t* output, // output / d_query - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int dim, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t weights_stride_3, - const int problem_size) + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t dim, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t weights_stride_3, + int32_t problem_size) : weights(weights), values(values), output(output), height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + dilation_0(dilation_0), + dilation_1(dilation_1), dim(dim), problem_size(problem_size), weights_stride_3(weights_stride_3), @@ -105,63 +110,58 @@ struct InverseNeighborhood2DBase { } }; -template +template struct InverseNeighborhood2DFull : InverseNeighborhood2DBase { using Base = InverseNeighborhood2DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = false; static constexpr bool IsHalfKernel = false; static constexpr bool UsesSmem = false; __device__ __host__ InverseNeighborhood2DFull() : Base() {} - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { return dim; } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = NeighborhoodMask( + p.height, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.width, p.kernel_size_1, p.dilation_1); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; - const int ni = get_backward_window_start( - i, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_backward_window_start( - j, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ei = get_backward_window_end( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ej = get_backward_window_end( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto ni = mask_0.get_backward_window_start(i); + auto nj = mask_1.get_backward_window_start(j); + auto ei = mask_0.get_backward_window_end(i); + auto ej = mask_1.get_backward_window_end(j); + + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; scalar_t output_update = scalar_t(0); -#pragma unroll - for (int xi = ni; xi < ei; xi += dilation) { - const int oni = get_window_start( - xi, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); -#pragma unroll - for (int xj = nj; xj < ej; xj += dilation) { - const int onj = get_window_start( - xj, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t valuesIndex = + for (int32_t xi = ni; xi < ei; xi += p.dilation_0) { + auto oni = mask_0.get_window_start(xi); + for (int32_t xj = nj; xj < ej; xj += p.dilation_1) { + auto onj = mask_1.get_window_start(xj); + int64_t valuesIndex = valuesOffset + xi * p.values_stride_2 + xj * p.values_stride_3; - const int64_t weightsIndex = weightsOffset + xi * p.weights_stride_2 + + int64_t weightsIndex = weightsOffset + xi * p.weights_stride_2 + xj * p.weights_stride_3 + - int((i - oni) / dilation) * KERNEL_SIZE + - int((j - onj) / dilation); + int32_t((i - oni) / p.dilation_0) * p.kernel_size_1 + + int32_t((j - onj) / p.dilation_1); output_update += p.values[valuesIndex] * p.weights[weightsIndex]; } } @@ -170,10 +170,11 @@ struct InverseNeighborhood2DFull : InverseNeighborhood2DBase { } }; -template +template struct InverseNeighborhood2DHalf : InverseNeighborhood2DBase { using Base = InverseNeighborhood2DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = IsBF16::value; static constexpr bool IsHalfKernel = true; static constexpr bool UsesSmem = false; @@ -182,7 +183,7 @@ struct InverseNeighborhood2DHalf : InverseNeighborhood2DBase { using HalfHelper = typename HalfArray::Base; - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { if (dim % 2 != 0) { std::cerr << "Naive NATTEN half-precision kernels only support 32-bit alignment. " @@ -194,50 +195,44 @@ struct InverseNeighborhood2DHalf : InverseNeighborhood2DBase { } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = NeighborhoodMask( + p.height, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.width, p.kernel_size_1, p.dilation_1); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { auto values2 = HalfHelper::typecast(p.values); auto output2 = HalfHelper::typecast(p.output); - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; - const int ni = get_backward_window_start( - i, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_backward_window_start( - j, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ei = get_backward_window_end( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ej = get_backward_window_end( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; - auto output_update = HalfHelper::zero(); -#pragma unroll - for (int xi = ni; xi < ei; xi += dilation) { - const int oni = get_window_start( - xi, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); -#pragma unroll - for (int xj = nj; xj < ej; xj += dilation) { - const int onj = get_window_start( - xj, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t valuesIndex = + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto ni = mask_0.get_backward_window_start(i); + auto nj = mask_1.get_backward_window_start(j); + auto ei = mask_0.get_backward_window_end(i); + auto ej = mask_1.get_backward_window_end(j); + + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; + auto output_update = HalfHelper::zeros(); + for (int32_t xi = ni; xi < ei; xi += p.dilation_0) { + auto oni = mask_0.get_window_start(xi); + for (int32_t xj = nj; xj < ej; xj += p.dilation_1) { + auto onj = mask_1.get_window_start(xj); + int64_t valuesIndex = valuesOffset + xi * p.values_stride_2 + xj * p.values_stride_3; - const int64_t weightsIndex = weightsOffset + xi * p.weights_stride_2 + + int64_t weightsIndex = weightsOffset + xi * p.weights_stride_2 + xj * p.weights_stride_3 + - int((i - oni) / dilation) * KERNEL_SIZE + - int((j - onj) / dilation); + int32_t((i - oni) / p.dilation_0) * p.kernel_size_1 + + int32_t((j - onj) / p.dilation_1); output_update = HalfHelper::fma( values2[valuesIndex], p.weights[weightsOffset], output_update); } @@ -250,33 +245,31 @@ struct InverseNeighborhood2DHalf : InverseNeighborhood2DBase { template struct InverseNeighborhood2D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - InverseNeighborhood2DFull, - InverseNeighborhood2DHalf>::type; + InverseNeighborhood2DFull, + InverseNeighborhood2DHalf>::type; using Params = typename Kernel::Params; void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* attn_ptr, void* d_output_ptr, void* d_value_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); int64_t problem_size = batch_size * heads * height * width * dim; auto grid = Kernel::Base::get_grid(problem_size); @@ -288,8 +281,10 @@ struct InverseNeighborhood2D { height, width, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), dim, attn_stride_0, attn_stride_1, diff --git a/csrc/include/natten/cuda/naive/inverse_neighborhood_3d.cuh b/csrc/include/natten/cuda/naive/inverse_neighborhood_3d.cuh index fddb13d..0ba8e73 100644 --- a/csrc/include/natten/cuda/naive/inverse_neighborhood_3d.cuh +++ b/csrc/include/natten/cuda/naive/inverse_neighborhood_3d.cuh @@ -31,7 +31,9 @@ #include #include -#include +#include +#include +#include namespace natten { namespace cuda { @@ -43,20 +45,18 @@ struct InverseNeighborhood3DBase { scalar_t* weights; scalar_t* values; scalar_t* output; - const int depth; - const int height; - const int width; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int depth_kernel_size_in; - const int depth_dilation_in; - const int dim; - const int64_t problem_size; - const int64_t weights_stride_0, weights_stride_1, weights_stride_2, + int32_t depth; + int32_t height; + int32_t width; + int32_t heads; + int32_t kernel_size_0, kernel_size_1, kernel_size_2; + int32_t dilation_0, dilation_1, dilation_2; + int32_t dim; + int64_t problem_size; + int64_t weights_stride_0, weights_stride_1, weights_stride_2, weights_stride_3, weights_stride_4; - const int64_t values_stride_0, values_stride_1, values_stride_2, - values_stride_3, values_stride_4; + int64_t values_stride_0, values_stride_1, values_stride_2, values_stride_3, + values_stride_4; __device__ __host__ Params() {} @@ -64,21 +64,23 @@ struct InverseNeighborhood3DBase { scalar_t* weights, // attn / d_attn scalar_t* values, // value / key scalar_t* output, // output / d_query - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int depth_kernel_size_in, - const int depth_dilation_in, - const int dim, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t weights_stride_3, - const int64_t weights_stride_4, - const int problem_size) + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t dim, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t weights_stride_3, + int64_t weights_stride_4, + int32_t problem_size) : weights(weights), values(values), output(output), @@ -86,10 +88,12 @@ struct InverseNeighborhood3DBase { height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), - depth_kernel_size_in(depth_kernel_size_in), - depth_dilation_in(depth_dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + kernel_size_2(kernel_size_2), + dilation_0(dilation_0), + dilation_1(dilation_1), + dilation_2(dilation_2), dim(dim), problem_size(problem_size), weights_stride_4(weights_stride_4), @@ -117,85 +121,69 @@ struct InverseNeighborhood3DBase { } }; -template < - typename scalar_t, - int KS, - int NS, - int DILATION, - int DKS, - int DNS, - int DDILATION> +template struct InverseNeighborhood3DFull : InverseNeighborhood3DBase { using Base = InverseNeighborhood3DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = false; static constexpr bool IsHalfKernel = false; static constexpr bool UsesSmem = false; __device__ __host__ InverseNeighborhood3DFull() : Base() {} - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { return dim; } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int KERNEL_SIZE_D = (DKS > 1) ? DKS : p.depth_kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int NEIGHBORHOOD_SIZE_D = (DNS > 0) ? DNS : KERNEL_SIZE_D / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int dilation_d = (DDILATION > 0) ? DDILATION : p.depth_dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = NeighborhoodMask( + p.depth, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.height, p.kernel_size_1, p.dilation_1); + auto mask_2 = NeighborhoodMask( + p.width, p.kernel_size_2, p.dilation_2); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.depth; - const int k = indtmp1 - indtmp2 * p.depth; + auto k = indtmp1 - indtmp2 * p.depth; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; - const int ni = get_backward_window_start( - i, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_backward_window_start( - j, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nk = get_backward_window_start( - k, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); - const int ei = get_backward_window_end( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ej = get_backward_window_end( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ek = get_backward_window_end( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); - const int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto nk = mask_0.get_backward_window_start(k); + auto ni = mask_1.get_backward_window_start(i); + auto nj = mask_2.get_backward_window_start(j); + auto ek = mask_0.get_backward_window_end(k); + auto ei = mask_1.get_backward_window_end(i); + auto ej = mask_2.get_backward_window_end(j); + + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; scalar_t output_update = scalar_t(0); -#pragma unroll - for (int xk = nk; xk < ek; xk += dilation_d) { - const int onk = get_window_start( - xk, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); -#pragma unroll - for (int xi = ni; xi < ei; xi += dilation) { - const int oni = get_window_start( - xi, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); -#pragma unroll - for (int xj = nj; xj < ej; xj += dilation) { - const int onj = get_window_start( - xj, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t valuesIndex = valuesOffset + xk * p.values_stride_2 + + for (int32_t xk = nk; xk < ek; xk += p.dilation_0) { + auto onk = mask_0.get_window_start(xk); + for (int32_t xi = ni; xi < ei; xi += p.dilation_1) { + auto oni = mask_1.get_window_start(xi); + for (int32_t xj = nj; xj < ej; xj += p.dilation_2) { + auto onj = mask_2.get_window_start(xj); + int64_t valuesIndex = valuesOffset + xk * p.values_stride_2 + xi * p.values_stride_3 + xj * p.values_stride_4; - const int64_t weightsIndex = weightsOffset + xk * p.weights_stride_2 + + int64_t weightsIndex = weightsOffset + xk * p.weights_stride_2 + xi * p.weights_stride_3 + xj * p.weights_stride_4 + - (int((k - onk) / dilation_d) * KERNEL_SIZE * KERNEL_SIZE) + - int((i - oni) / dilation) * KERNEL_SIZE + - int((j - onj) / dilation); + (int32_t((k - onk) / p.dilation_0) * p.kernel_size_1 * + p.kernel_size_2) + + int32_t((i - oni) / p.dilation_1) * p.kernel_size_2 + + int32_t((j - onj) / p.dilation_2); output_update += p.values[valuesIndex] * p.weights[weightsIndex]; } } @@ -205,17 +193,11 @@ struct InverseNeighborhood3DFull : InverseNeighborhood3DBase { } }; -template < - typename scalar_t, - int KS, - int NS, - int DILATION, - int DKS, - int DNS, - int DDILATION> +template struct InverseNeighborhood3DHalf : InverseNeighborhood3DBase { using Base = InverseNeighborhood3DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = IsBF16::value; static constexpr bool IsHalfKernel = true; static constexpr bool UsesSmem = false; @@ -224,7 +206,7 @@ struct InverseNeighborhood3DHalf : InverseNeighborhood3DBase { using HalfHelper = typename HalfArray::Base; - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { if (dim % 2 != 0) { std::cerr << "Naive NATTEN half-precision kernels only support 32-bit alignment. " @@ -236,65 +218,55 @@ struct InverseNeighborhood3DHalf : InverseNeighborhood3DBase { } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int KERNEL_SIZE_D = (DKS > 1) ? DKS : p.depth_kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int NEIGHBORHOOD_SIZE_D = (DNS > 0) ? DNS : KERNEL_SIZE_D / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int dilation_d = (DDILATION > 0) ? DDILATION : p.depth_dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = NeighborhoodMask( + p.depth, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.height, p.kernel_size_1, p.dilation_1); + auto mask_2 = NeighborhoodMask( + p.width, p.kernel_size_2, p.dilation_2); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { auto values2 = HalfHelper::typecast(p.values); auto output2 = HalfHelper::typecast(p.output); - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.depth; - const int k = indtmp1 - indtmp2 * p.depth; + auto k = indtmp1 - indtmp2 * p.depth; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; - const int ni = get_backward_window_start( - i, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_backward_window_start( - j, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nk = get_backward_window_start( - k, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); - const int ei = get_backward_window_end( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ej = get_backward_window_end( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int ek = get_backward_window_end( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); - const int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; - auto output_update = HalfHelper::zero(); -#pragma unroll - for (int xk = nk; xk < ek; xk += dilation_d) { - const int onk = get_window_start( - xk, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); -#pragma unroll - for (int xi = ni; xi < ei; xi += dilation) { - const int oni = get_window_start( - xi, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); -#pragma unroll - for (int xj = nj; xj < ej; xj += dilation) { - const int onj = get_window_start( - xj, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t valuesIndex = valuesOffset + xk * p.values_stride_2 + + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto nk = mask_0.get_backward_window_start(k); + auto ni = mask_1.get_backward_window_start(i); + auto nj = mask_2.get_backward_window_start(j); + auto ek = mask_0.get_backward_window_end(k); + auto ei = mask_1.get_backward_window_end(i); + auto ej = mask_2.get_backward_window_end(j); + + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1; + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; + auto output_update = HalfHelper::zeros(); + for (int32_t xk = nk; xk < ek; xk += p.dilation_0) { + auto onk = mask_0.get_window_start(xk); + for (int32_t xi = ni; xi < ei; xi += p.dilation_1) { + auto oni = mask_1.get_window_start(xi); + for (int32_t xj = nj; xj < ej; xj += p.dilation_2) { + auto onj = mask_2.get_window_start(xj); + int64_t valuesIndex = valuesOffset + xk * p.values_stride_2 + xi * p.values_stride_3 + xj * p.values_stride_4; - const int64_t weightsIndex = weightsOffset + xk * p.weights_stride_2 + + int64_t weightsIndex = weightsOffset + xk * p.weights_stride_2 + xi * p.weights_stride_3 + xj * p.weights_stride_4 + - (int((k - onk) / dilation_d) * KERNEL_SIZE * KERNEL_SIZE) + - int((i - oni) / dilation) * KERNEL_SIZE + - int((j - onj) / dilation); + (int32_t((k - onk) / p.dilation_0) * p.kernel_size_1 * + p.kernel_size_2) + + int32_t((i - oni) / p.dilation_1) * p.kernel_size_2 + + int32_t((j - onj) / p.dilation_2); output_update = HalfHelper::fma( values2[valuesIndex], p.weights[weightsOffset], output_update); } @@ -308,54 +280,33 @@ struct InverseNeighborhood3DHalf : InverseNeighborhood3DBase { template struct InverseNeighborhood3D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DKS = Args::DepthKernelSize; - static constexpr int DNS = Args::DepthNeighborhoodSize; - static constexpr int DILATION = Args::Dilation; - static constexpr int DDILATION = Args::DepthDilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - InverseNeighborhood3DFull< - scalar_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>, - InverseNeighborhood3DHalf< - scalar_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>>::type; + InverseNeighborhood3DFull, + InverseNeighborhood3DHalf>::type; using Params = typename Kernel::Params; void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* attn_ptr, void* d_output_ptr, void* d_value_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); int64_t problem_size = batch_size * heads * depth * height * width * dim; auto grid = Kernel::Base::get_grid(problem_size); @@ -368,10 +319,12 @@ struct InverseNeighborhood3D { height, width, heads, - kernel_size, - dilation, - kernel_size_depth, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), dim, attn_stride_0, attn_stride_1, diff --git a/csrc/include/natten/cuda/naive/natten_commons.cuh b/csrc/include/natten/cuda/naive/natten_commons.cuh index 21cf925..2d08a21 100644 --- a/csrc/include/natten/cuda/naive/natten_commons.cuh +++ b/csrc/include/natten/cuda/naive/natten_commons.cuh @@ -26,7 +26,7 @@ #pragma once -#ifndef __CUDA_ARCH__ +#ifndef __CUDA_ARCH__ #include #endif @@ -38,11 +38,11 @@ #define CUDA_NUM_THREADS 1024 // CUDA: number of blocks for threads. -inline int GET_BLOCKS( - const int64_t N, - const int64_t max_threads_per_block = CUDA_NUM_THREADS) { +inline int32_t GET_BLOCKS( + int64_t N, + int64_t max_threads_per_block = CUDA_NUM_THREADS) { auto block_num = (N - 1) / max_threads_per_block + 1; - return static_cast(block_num); + return static_cast(block_num); } namespace natten { @@ -125,9 +125,14 @@ struct HalfArrayBase { return __half2float(s); } - __device__ __inline__ static ElementVector zero() { + __device__ __inline__ static ElementScalar zero() { + return __float2half(0.f); + } + + __device__ __inline__ static ElementVector zeros() { return __float2half2_rn(0.f); } + __device__ __inline__ static ElementVector fma( ElementVector a, ElementVector b, @@ -159,40 +164,6 @@ struct HalfArrayBase { using ElementNatten = natten::float16; using ElementScalar = natten::float16; using ElementVector = float162; - - __device__ __inline__ static ElementVector* typecast( - ElementScalar* ptr_scalar) { - asm volatile("brkpt;\n"); - } - - __device__ __inline__ static ElementNatten cast_back(ElementScalar s) { - asm volatile("brkpt;\n"); - } - - __device__ __inline__ static float to_float(ElementScalar s) { - asm volatile("brkpt;\n"); - } - - __device__ __inline__ static ElementVector zero() { - asm volatile("brkpt;\n"); - } - __device__ __inline__ static ElementVector fma( - ElementVector a, - ElementVector b, - ElementVector c) { - asm volatile("brkpt;\n"); - } - __device__ __inline__ static ElementVector fma( - ElementVector a, - ElementScalar b, - ElementVector c) { - asm volatile("brkpt;\n"); - } - __device__ __inline__ static ElementScalar add( - ElementScalar a, - ElementScalar b) { - asm volatile("brkpt;\n"); - } }; template <> @@ -222,9 +193,14 @@ struct HalfArrayBase { return __bfloat162float(s); } - __device__ __inline__ static ElementVector zero() { + __device__ __inline__ static ElementScalar zero() { + return __float2bfloat16(0.f); + } + + __device__ __inline__ static ElementVector zeros() { return __float2bfloat162_rn(0.f); } + __device__ __inline__ static ElementVector fma( ElementVector a, ElementVector b, @@ -256,86 +232,122 @@ struct HalfArrayBase { using ElementNatten = natten::bfloat16; using ElementScalar = natten::bfloat16; using ElementVector = bfloat162; +}; - __device__ __inline__ static ElementVector* typecast( - ElementScalar* ptr_scalar) { - asm volatile("brkpt;\n"); - } +template <> +struct HalfArray { + using Base = HalfArrayBase; +}; +#endif - __device__ __inline__ static ElementNatten cast_back(ElementScalar s) { - asm volatile("brkpt;\n"); +template +struct NeighborhoodMask { + static constexpr bool IsCausal = IsCausal_; + + int32_t length; + int32_t kernel_size; + int32_t neighborhood_size; + int32_t dilation; + + inline __device__ NeighborhoodMask( + int32_t length, + int32_t kernel_size, + int32_t dilation) + : length(length), + kernel_size(kernel_size), + neighborhood_size(kernel_size / 2), + dilation(dilation) {} + + inline __device__ int32_t get_backward_window_start(int32_t index) { + if constexpr (!IsCausal) { + return (index < kernel_size * dilation) + ? (index % dilation) + : index - neighborhood_size * dilation; + } else { + return index; + } } - __device__ __inline__ static float to_float(ElementScalar s) { - asm volatile("brkpt;\n"); + inline __device__ int32_t get_backward_window_end(int32_t index) { + if constexpr (!IsCausal) { + return (index >= length - kernel_size * dilation) + ? (length) + : (index + (neighborhood_size + 1) * dilation); + } else { + return min(index + kernel_size * dilation, length); + } } - __device__ __inline__ static ElementVector zero() { - asm volatile("brkpt;\n"); - } - __device__ __inline__ static ElementVector fma( - ElementVector a, - ElementVector b, - ElementVector c) { - asm volatile("brkpt;\n"); - } - __device__ __inline__ static ElementVector fma( - ElementVector a, - ElementScalar b, - ElementVector c) { - asm volatile("brkpt;\n"); + inline __device__ int32_t get_window_start(int32_t index) { + if constexpr (!IsCausal) { + if (dilation <= 1) + return max(index - neighborhood_size, 0) + + (index + neighborhood_size >= length) * + (length - index - neighborhood_size - 1); + int32_t ni = index - neighborhood_size * dilation; + if (ni < 0) + return index % dilation; + if (index + neighborhood_size * dilation >= length) { + int32_t imodd = index % dilation; + int32_t a = int32_t(length / dilation) * dilation; + int32_t b = length - a; + if (imodd < b) + return length - b + imodd - 2 * neighborhood_size * dilation; + return a + imodd - kernel_size * dilation; + } + return ni; + } else { + auto dilation_idx = index % dilation; + auto index_pdp = index / dilation; + return max(index_pdp - kernel_size + 1, 0) * dilation + dilation_idx; + } } - __device__ __inline__ static ElementScalar add( - ElementScalar a, - ElementScalar b) { - asm volatile("brkpt;\n"); + + inline __device__ int32_t get_window_end(int32_t index, int32_t start_index) { + if constexpr (!IsCausal) { + return min(length, start_index + kernel_size * dilation); + } else { + return min(length, index + dilation); + } } -}; -template <> -struct HalfArray { - using Base = HalfArrayBase; + inline __device__ int32_t get_pb_start(int32_t index) { + if constexpr (!IsCausal) { + if (dilation <= 1) + return neighborhood_size + + (index < neighborhood_size) * (neighborhood_size - index) + + (index + neighborhood_size >= length) * + (length - index - 1 - neighborhood_size); + if (index - neighborhood_size * dilation < 0) + return kernel_size - 1 - (index / dilation); + if (index + neighborhood_size * dilation >= length) + return (length - index - 1) / dilation; + return neighborhood_size; + } else { + printf( + "FATAL: RPB kernels do not support causal masking. Please open an issue."); + asm volatile("brkpt;\n"); + } + } }; -#endif -inline __host__ __device__ int get_backward_window_start( - const int index, - const int KERNEL_SIZE, - const int NEIGHBORHOOD_SIZE, - const int dilation) { - return (index < KERNEL_SIZE * dilation) - ? (index % dilation) - : index - NEIGHBORHOOD_SIZE * dilation; -} - -inline __host__ __device__ int get_backward_window_end( - const int index, - const int length, - const int KERNEL_SIZE, - const int NEIGHBORHOOD_SIZE, - const int dilation) { - return (index >= length - KERNEL_SIZE * dilation) - ? (length) - : (index + (NEIGHBORHOOD_SIZE + 1) * dilation); -} - -inline __host__ __device__ int get_window_start( - const int index, - const int length, - const int KERNEL_SIZE, - const int NEIGHBORHOOD_SIZE, - const int dilation) { +inline __device__ int32_t get_window_start( + int32_t index, + int32_t length, + int32_t KERNEL_SIZE, + int32_t NEIGHBORHOOD_SIZE, + int32_t dilation) { if (dilation <= 1) return max(index - NEIGHBORHOOD_SIZE, 0) + (index + NEIGHBORHOOD_SIZE >= length) * (length - index - NEIGHBORHOOD_SIZE - 1); - int ni = index - NEIGHBORHOOD_SIZE * dilation; + int32_t ni = index - NEIGHBORHOOD_SIZE * dilation; if (ni < 0) return index % dilation; if (index + NEIGHBORHOOD_SIZE * dilation >= length) { - const int imodd = index % dilation; - const int a = int(length / dilation) * dilation; - const int b = length - a; + int32_t imodd = index % dilation; + int32_t a = int32_t(length / dilation) * dilation; + int32_t b = length - a; if (imodd < b) return length - b + imodd - 2 * NEIGHBORHOOD_SIZE * dilation; return a + imodd - KERNEL_SIZE * dilation; @@ -343,12 +355,12 @@ inline __host__ __device__ int get_window_start( return ni; } -inline __host__ __device__ int get_pb_start( - const int index, - const int length, - const int KERNEL_SIZE, - const int NEIGHBORHOOD_SIZE, - const int dilation) { +inline __device__ int32_t get_pb_start( + int32_t index, + int32_t length, + int32_t KERNEL_SIZE, + int32_t NEIGHBORHOOD_SIZE, + int32_t dilation) { if (dilation <= 1) return NEIGHBORHOOD_SIZE + (index < NEIGHBORHOOD_SIZE) * (NEIGHBORHOOD_SIZE - index) + @@ -361,6 +373,49 @@ inline __host__ __device__ int get_pb_start( return NEIGHBORHOOD_SIZE; } +template +struct AttnMask; + +#ifdef __CUDA_ARCH__ + +// TODO: bitcast into a constexpr instead of evaluating at runtime + +template <> +struct AttnMask { + static __device__ auto value(bool is_grad) { + return is_grad ? 0.0 : -__longlong_as_double(0x7ff0000000000000ULL); + } +}; + +template <> +struct AttnMask { + static __device__ auto value(bool is_grad) { + return is_grad ? 0.f : -__int_as_float(0x7f800000U); + } +}; + +#if (__CUDACC_VER_MAJOR__ >= 11) && (__CUDA_ARCH__ >= 600) +template <> +struct AttnMask { + static __device__ auto value(bool is_grad) { + return is_grad ? __float2half(0.f) + : __hneg(__ushort_as_half((unsigned short)0x7C00U)); + } +}; +#endif + +#if (__CUDACC_VER_MAJOR__ >= 11) && (__CUDA_ARCH__ >= 800) +template <> +struct AttnMask { + static __device__ auto value(bool is_grad) { + return is_grad ? __float2bfloat16(0.f) + : __hneg(__ushort_as_bfloat16((unsigned short)0x7F80U)); + } +}; +#endif + +#endif + } // namespace naive } // namespace cuda } // namespace natten diff --git a/csrc/include/natten/cuda/naive/neighborhood_neighborhood_1d.cuh b/csrc/include/natten/cuda/naive/neighborhood_neighborhood_1d.cuh index 1916948..5be46fa 100644 --- a/csrc/include/natten/cuda/naive/neighborhood_neighborhood_1d.cuh +++ b/csrc/include/natten/cuda/naive/neighborhood_neighborhood_1d.cuh @@ -30,6 +30,8 @@ #include #include +#include +#include #include namespace natten { @@ -42,14 +44,14 @@ struct NeighborhoodNeighborhood1DBase { scalar_t* weights; scalar_t* values; scalar_t* output; - const int length; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int dim; - const int64_t problem_size; - const int64_t weights_stride_0, weights_stride_1, weights_stride_2; - const int64_t values_stride_0, values_stride_1, values_stride_2; + int32_t length; + int32_t heads; + int32_t kernel_size; + int32_t dilation; + int32_t dim; + int64_t problem_size; + int64_t weights_stride_0, weights_stride_1, weights_stride_2; + int64_t values_stride_0, values_stride_1, values_stride_2; __device__ __host__ Params() {} @@ -57,22 +59,22 @@ struct NeighborhoodNeighborhood1DBase { scalar_t* weights, // attn / d_attn scalar_t* values, // value / key scalar_t* output, // output / d_query - const int length, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int dim, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t problem_size) + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t dim, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t problem_size) : weights(weights), values(values), output(output), length(length), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size(kernel_size), + dilation(dilation), dim(dim), problem_size(problem_size), weights_stride_2(weights_stride_2), @@ -96,46 +98,45 @@ struct NeighborhoodNeighborhood1DBase { } }; -template +template struct NeighborhoodNeighborhood1DFull : NeighborhoodNeighborhood1DBase { using Base = NeighborhoodNeighborhood1DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = false; static constexpr bool IsHalfKernel = false; static constexpr bool UsesSmem = false; __device__ __host__ NeighborhoodNeighborhood1DFull() : Base() {} - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { return dim; } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = + NeighborhoodMask(p.length, p.kernel_size, p.dilation); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.length; - const int i = indtmp1 - indtmp2 * p.length; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.length; + auto i = indtmp1 - indtmp2 * p.length; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto ni = mask_0.get_window_start(i); + auto ei = mask_0.get_window_end(i, ni); - const int ni = get_window_start( - i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); scalar_t updt = scalar_t(0); - int weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + + int32_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + i * p.weights_stride_2; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; -#pragma unroll - for (int xi = ni; xi < ni + KERNEL_SIZE * dilation; xi += dilation) { - const int64_t valuesIndex = valuesOffset + xi * p.values_stride_2; + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; + for (int32_t xi = ni; xi < ei; xi += p.dilation) { + int64_t valuesIndex = valuesOffset + xi * p.values_stride_2; updt += p.weights[weightsOffset] * p.values[valuesIndex]; ++weightsOffset; } @@ -144,11 +145,12 @@ struct NeighborhoodNeighborhood1DFull } }; -template +template struct NeighborhoodNeighborhood1DHalf : NeighborhoodNeighborhood1DBase { using Base = NeighborhoodNeighborhood1DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = IsBF16::value; static constexpr bool IsHalfKernel = true; static constexpr bool UsesSmem = false; @@ -156,7 +158,7 @@ struct NeighborhoodNeighborhood1DHalf __device__ __host__ NeighborhoodNeighborhood1DHalf() : Base() {} using HalfHelper = typename HalfArray::Base; - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { if (dim % 2 != 0) { std::cerr << "Naive NATTEN half-precision kernels only support 32-bit alignment. " @@ -168,32 +170,30 @@ struct NeighborhoodNeighborhood1DHalf } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = + NeighborhoodMask(p.length, p.kernel_size, p.dilation); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { auto values2 = HalfHelper::typecast(p.values); auto output2 = HalfHelper::typecast(p.output); - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.length; - const int i = indtmp1 - indtmp2 * p.length; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.length; + auto i = indtmp1 - indtmp2 * p.length; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto ni = mask_0.get_window_start(i); + auto ei = mask_0.get_window_end(i, ni); - const int ni = get_window_start( - i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - auto output_update = HalfHelper::zero(); - int weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + + auto output_update = HalfHelper::zeros(); + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + i * p.weights_stride_2; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; -#pragma unroll - for (int xi = ni; xi < ni + KERNEL_SIZE * dilation; xi += dilation) { - const int64_t valuesIndex = valuesOffset + xi * p.values_stride_2; + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; + for (int32_t xi = ni; xi < ei; xi += p.dilation) { + int64_t valuesIndex = valuesOffset + xi * p.values_stride_2; scalar_t a = p.weights[weightsOffset]; output_update = HalfHelper::fma(values2[valuesIndex], a, output_update); ++weightsOffset; @@ -206,31 +206,29 @@ struct NeighborhoodNeighborhood1DHalf template struct NeighborhoodNeighborhood1D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - NeighborhoodNeighborhood1DFull, - NeighborhoodNeighborhood1DHalf>::type; + NeighborhoodNeighborhood1DFull, + NeighborhoodNeighborhood1DHalf>::type; using Params = typename Kernel::Params; void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); int64_t problem_size = batch_size * heads * length * dim; auto grid = Kernel::Base::get_grid(problem_size); @@ -241,8 +239,8 @@ struct NeighborhoodNeighborhood1D { reinterpret_cast(output_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), dim, attn_stride_0, attn_stride_1, diff --git a/csrc/include/natten/cuda/naive/neighborhood_neighborhood_2d.cuh b/csrc/include/natten/cuda/naive/neighborhood_neighborhood_2d.cuh index 09bfb2b..648ccff 100644 --- a/csrc/include/natten/cuda/naive/neighborhood_neighborhood_2d.cuh +++ b/csrc/include/natten/cuda/naive/neighborhood_neighborhood_2d.cuh @@ -30,6 +30,8 @@ #include #include +#include +#include #include namespace natten { @@ -42,17 +44,16 @@ struct NeighborhoodNeighborhood2DBase { scalar_t* weights; scalar_t* values; scalar_t* output; - const int height; - const int width; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int dim; - const int64_t problem_size; - const int64_t weights_stride_0, weights_stride_1, weights_stride_2, + int32_t height; + int32_t width; + int32_t heads; + int32_t kernel_size_0, kernel_size_1; + int32_t dilation_0, dilation_1; + int32_t dim; + int64_t problem_size; + int64_t weights_stride_0, weights_stride_1, weights_stride_2, weights_stride_3; - const int64_t values_stride_0, values_stride_1, values_stride_2, - values_stride_3; + int64_t values_stride_0, values_stride_1, values_stride_2, values_stride_3; __device__ __host__ Params() {} @@ -60,25 +61,29 @@ struct NeighborhoodNeighborhood2DBase { scalar_t* weights, // attn / d_attn scalar_t* values, // value / key scalar_t* output, // output / d_query - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int dim, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t weights_stride_3, - const int problem_size) + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t dim, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t weights_stride_3, + int32_t problem_size) : weights(weights), values(values), output(output), height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + dilation_0(dilation_0), + dilation_1(dilation_1), dim(dim), problem_size(problem_size), weights_stride_3(weights_stride_3), @@ -104,56 +109,58 @@ struct NeighborhoodNeighborhood2DBase { } }; -template +template struct NeighborhoodNeighborhood2DFull : NeighborhoodNeighborhood2DBase { using Base = NeighborhoodNeighborhood2DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = false; static constexpr bool IsHalfKernel = false; static constexpr bool UsesSmem = false; __device__ __host__ NeighborhoodNeighborhood2DFull() : Base() {} - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { return dim; } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = NeighborhoodMask( + p.height, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.width, p.kernel_size_1, p.dilation_1); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto ni = mask_0.get_window_start(i); + auto nj = mask_1.get_window_start(j); + auto ei = mask_0.get_window_end(i, ni); + auto ej = mask_1.get_window_end(j, nj); - const int ni = get_window_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); scalar_t updt = scalar_t(0); - int weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + i * p.weights_stride_2 + j * p.weights_stride_3; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; -#pragma unroll - for (int xi = ni; xi < ni + KERNEL_SIZE * dilation; xi += dilation) { -#pragma unroll - for (int xj = nj; xj < nj + KERNEL_SIZE * dilation; xj += dilation) { - const int64_t valuesIndex = + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; + for (int32_t xi = ni; xi < ei; xi += p.dilation_0) { + for (int32_t xj = nj; xj < ej; xj += p.dilation_1) { + int64_t valuesIndex = valuesOffset + xi * p.values_stride_2 + xj * p.values_stride_3; - updt += p.weights[weightsOffset] * p.values[valuesIndex]; - ++weightsOffset; + int64_t weightsIndex = weightsOffset + + int32_t((xi - ni) / p.dilation_0) * p.kernel_size_1 + + int32_t((xj - nj) / p.dilation_1); + updt += p.weights[weightsIndex] * p.values[valuesIndex]; } } p.output[linearIndex] = updt; @@ -161,11 +168,12 @@ struct NeighborhoodNeighborhood2DFull } }; -template +template struct NeighborhoodNeighborhood2DHalf : NeighborhoodNeighborhood2DBase { using Base = NeighborhoodNeighborhood2DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = IsBF16::value; static constexpr bool IsHalfKernel = true; static constexpr bool UsesSmem = false; @@ -174,7 +182,7 @@ struct NeighborhoodNeighborhood2DHalf using HalfHelper = typename HalfArray::Base; - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { if (dim % 2 != 0) { std::cerr << "Naive NATTEN half-precision kernels only support 32-bit alignment. " @@ -186,44 +194,46 @@ struct NeighborhoodNeighborhood2DHalf } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = NeighborhoodMask( + p.height, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.width, p.kernel_size_1, p.dilation_1); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { auto values2 = HalfHelper::typecast(p.values); auto output2 = HalfHelper::typecast(p.output); - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto ni = mask_0.get_window_start(i); + auto nj = mask_1.get_window_start(j); + auto ei = mask_0.get_window_end(i, ni); + auto ej = mask_1.get_window_end(j, nj); - const int ni = get_window_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - auto updt = HalfHelper::zero(); - int weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + + auto updt = HalfHelper::zeros(); + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + i * p.weights_stride_2 + j * p.weights_stride_3; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; -#pragma unroll - for (int xi = ni; xi < ni + KERNEL_SIZE * dilation; xi += dilation) -#pragma unroll - for (int xj = nj; xj < nj + KERNEL_SIZE * dilation; xj += dilation) { - const int64_t valuesIndex = + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; + for (int32_t xi = ni; xi < ei; xi += p.dilation_0) { + for (int32_t xj = nj; xj < ej; xj += p.dilation_1) { + int64_t valuesIndex = valuesOffset + xi * p.values_stride_2 + xj * p.values_stride_3; + int64_t weightsIndex = weightsOffset + + int32_t((xi - ni) / p.dilation_0) * p.kernel_size_1 + + int32_t((xj - nj) / p.dilation_1); updt = HalfHelper::fma( - values2[valuesIndex], p.weights[weightsOffset], updt); - ++weightsOffset; + values2[valuesIndex], p.weights[weightsIndex], updt); } + } output2[linearIndex] = updt; } } @@ -232,33 +242,31 @@ struct NeighborhoodNeighborhood2DHalf template struct NeighborhoodNeighborhood2D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - NeighborhoodNeighborhood2DFull, - NeighborhoodNeighborhood2DHalf>::type; + NeighborhoodNeighborhood2DFull, + NeighborhoodNeighborhood2DHalf>::type; using Params = typename Kernel::Params; void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); int64_t problem_size = batch_size * heads * height * width * dim; auto grid = Kernel::Base::get_grid(problem_size); @@ -270,8 +278,10 @@ struct NeighborhoodNeighborhood2D { height, width, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), dim, attn_stride_0, attn_stride_1, diff --git a/csrc/include/natten/cuda/naive/neighborhood_neighborhood_3d.cuh b/csrc/include/natten/cuda/naive/neighborhood_neighborhood_3d.cuh index fd71fc3..d391ac0 100644 --- a/csrc/include/natten/cuda/naive/neighborhood_neighborhood_3d.cuh +++ b/csrc/include/natten/cuda/naive/neighborhood_neighborhood_3d.cuh @@ -30,6 +30,8 @@ #include #include +#include +#include #include namespace natten { @@ -42,20 +44,18 @@ struct NeighborhoodNeighborhood3DBase { scalar_t* weights; scalar_t* values; scalar_t* output; - const int depth; - const int height; - const int width; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int depth_kernel_size_in; - const int depth_dilation_in; - const int dim; - const int64_t problem_size; - const int64_t weights_stride_0, weights_stride_1, weights_stride_2, + int32_t depth; + int32_t height; + int32_t width; + int32_t heads; + int32_t kernel_size_0, kernel_size_1, kernel_size_2; + int32_t dilation_0, dilation_1, dilation_2; + int32_t dim; + int64_t problem_size; + int64_t weights_stride_0, weights_stride_1, weights_stride_2, weights_stride_3, weights_stride_4; - const int64_t values_stride_0, values_stride_1, values_stride_2, - values_stride_3, values_stride_4; + int64_t values_stride_0, values_stride_1, values_stride_2, values_stride_3, + values_stride_4; __device__ __host__ Params() {} @@ -63,21 +63,23 @@ struct NeighborhoodNeighborhood3DBase { scalar_t* weights, // attn / d_attn scalar_t* values, // value / key scalar_t* output, // output / d_query - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int depth_kernel_size_in, - const int depth_dilation_in, - const int dim, - const int64_t weights_stride_0, - const int64_t weights_stride_1, - const int64_t weights_stride_2, - const int64_t weights_stride_3, - const int64_t weights_stride_4, - const int problem_size) + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t dim, + int64_t weights_stride_0, + int64_t weights_stride_1, + int64_t weights_stride_2, + int64_t weights_stride_3, + int64_t weights_stride_4, + int32_t problem_size) : weights(weights), values(values), output(output), @@ -85,10 +87,12 @@ struct NeighborhoodNeighborhood3DBase { height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), - depth_kernel_size_in(depth_kernel_size_in), - depth_dilation_in(depth_dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + kernel_size_2(kernel_size_2), + dilation_0(dilation_0), + dilation_1(dilation_1), + dilation_2(dilation_2), dim(dim), problem_size(problem_size), weights_stride_4(weights_stride_4), @@ -116,92 +120,81 @@ struct NeighborhoodNeighborhood3DBase { } }; -template < - typename scalar_t, - int KS, - int NS, - int DILATION, - int DKS, - int DNS, - int DDILATION> +template struct NeighborhoodNeighborhood3DFull : NeighborhoodNeighborhood3DBase { using Base = NeighborhoodNeighborhood3DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = false; static constexpr bool IsHalfKernel = false; static constexpr bool UsesSmem = false; __device__ __host__ NeighborhoodNeighborhood3DFull() : Base() {} - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { return dim; } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int KERNEL_SIZE_D = (DKS > 1) ? DKS : p.depth_kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int NEIGHBORHOOD_SIZE_D = (DNS > 0) ? DNS : KERNEL_SIZE_D / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int dilation_d = (DDILATION > 0) ? DDILATION : p.depth_dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = NeighborhoodMask( + p.depth, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.height, p.kernel_size_1, p.dilation_1); + auto mask_2 = NeighborhoodMask( + p.width, p.kernel_size_2, p.dilation_2); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.depth; - const int k = indtmp1 - indtmp2 * p.depth; + auto k = indtmp1 - indtmp2 * p.depth; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto nk = mask_0.get_window_start(k); + auto ni = mask_1.get_window_start(i); + auto nj = mask_2.get_window_start(j); + auto ek = mask_0.get_window_end(k, nk); + auto ei = mask_1.get_window_end(i, ni); + auto ej = mask_2.get_window_end(j, nj); - const int ni = get_window_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nk = get_window_start( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); scalar_t updt = scalar_t(0); - int weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + k * p.weights_stride_2 + i * p.weights_stride_3 + j * p.weights_stride_4; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; -#pragma unroll - for (int xk = nk; xk < nk + KERNEL_SIZE_D * dilation_d; xk += dilation_d) -#pragma unroll - for (int xi = ni; xi < ni + KERNEL_SIZE * dilation; xi += dilation) -#pragma unroll - for (int xj = nj; xj < nj + KERNEL_SIZE * dilation; xj += dilation) { - const int64_t valuesIndex = valuesOffset + xk * p.values_stride_2 + + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; + for (int32_t xk = nk; xk < ek; xk += p.dilation_0) + for (int32_t xi = ni; xi < ei; xi += p.dilation_1) + for (int32_t xj = nj; xj < ej; xj += p.dilation_2) { + int64_t valuesIndex = valuesOffset + xk * p.values_stride_2 + xi * p.values_stride_3 + xj * p.values_stride_4; - updt += p.weights[weightsOffset] * p.values[valuesIndex]; - ++weightsOffset; + int64_t weightsIndex = weightsOffset + + int32_t((xk - nk) / p.dilation_0) * + (p.kernel_size_1 * p.kernel_size_2) + + int32_t((xi - ni) / p.dilation_1) * p.kernel_size_2 + + int32_t((xj - nj) / p.dilation_2); + updt += p.weights[weightsIndex] * p.values[valuesIndex]; } p.output[linearIndex] = updt; } } }; -template < - typename scalar_t, - int KS, - int NS, - int DILATION, - int DKS, - int DNS, - int DDILATION> +template struct NeighborhoodNeighborhood3DHalf : NeighborhoodNeighborhood3DBase { using Base = NeighborhoodNeighborhood3DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = IsBF16::value; static constexpr bool IsHalfKernel = true; static constexpr bool UsesSmem = false; @@ -210,7 +203,7 @@ struct NeighborhoodNeighborhood3DHalf using HalfHelper = typename HalfArray::Base; - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { if (dim % 2 != 0) { std::cerr << "Naive NATTEN half-precision kernels only support 32-bit alignment. " @@ -222,54 +215,55 @@ struct NeighborhoodNeighborhood3DHalf } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int KERNEL_SIZE_D = (DKS > 1) ? DKS : p.depth_kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int NEIGHBORHOOD_SIZE_D = (DNS > 0) ? DNS : KERNEL_SIZE_D / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int dilation_d = (DDILATION > 0) ? DDILATION : p.depth_dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto mask_0 = NeighborhoodMask( + p.depth, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.height, p.kernel_size_1, p.dilation_1); + auto mask_2 = NeighborhoodMask( + p.width, p.kernel_size_2, p.dilation_2); + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.problem_size) { auto values2 = HalfHelper::typecast(p.values); auto output2 = HalfHelper::typecast(p.output); - int indtmp1 = linearIndex / p.dim; - const int d = linearIndex - indtmp1 * p.dim; - int indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + int32_t indtmp1 = linearIndex / p.dim; + auto d = linearIndex - indtmp1 * p.dim; + int32_t indtmp2 = indtmp1 / p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.depth; - const int k = indtmp1 - indtmp2 * p.depth; + auto k = indtmp1 - indtmp2 * p.depth; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.heads; - const int h = indtmp1 - indtmp2 * p.heads; - const int b = indtmp2; + auto h = indtmp1 - indtmp2 * p.heads; + auto& b = indtmp2; + + auto nk = mask_0.get_window_start(k); + auto ni = mask_1.get_window_start(i); + auto nj = mask_2.get_window_start(j); + auto ek = mask_0.get_window_end(k, nk); + auto ei = mask_1.get_window_end(i, ni); + auto ej = mask_2.get_window_end(j, nj); - const int ni = get_window_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nk = get_window_start( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); - auto updt = HalfHelper::zero(); - int weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + + auto updt = HalfHelper::zeros(); + int64_t weightsOffset = b * p.weights_stride_0 + h * p.weights_stride_1 + k * p.weights_stride_2 + i * p.weights_stride_3 + j * p.weights_stride_4; - const int64_t valuesOffset = - b * p.values_stride_0 + h * p.values_stride_1 + d; -#pragma unroll - for (int xk = nk; xk < nk + KERNEL_SIZE_D * dilation_d; xk += dilation_d) -#pragma unroll - for (int xi = ni; xi < ni + KERNEL_SIZE * dilation; xi += dilation) -#pragma unroll - for (int xj = nj; xj < nj + KERNEL_SIZE * dilation; xj += dilation) { - const int64_t valuesIndex = valuesOffset + xk * p.values_stride_2 + + int64_t valuesOffset = b * p.values_stride_0 + h * p.values_stride_1 + d; + for (int32_t xk = nk; xk < ek; xk += p.dilation_0) + for (int32_t xi = ni; xi < ei; xi += p.dilation_1) + for (int32_t xj = nj; xj < ej; xj += p.dilation_2) { + int64_t valuesIndex = valuesOffset + xk * p.values_stride_2 + xi * p.values_stride_3 + xj * p.values_stride_4; + int64_t weightsIndex = weightsOffset + + int32_t((xk - nk) / p.dilation_0) * + (p.kernel_size_1 * p.kernel_size_2) + + int32_t((xi - ni) / p.dilation_1) * p.kernel_size_2 + + int32_t((xj - nj) / p.dilation_2); updt = HalfHelper::fma( - values2[valuesIndex], p.weights[weightsOffset], updt); - ++weightsOffset; + values2[valuesIndex], p.weights[weightsIndex], updt); } output2[linearIndex] = updt; } @@ -279,54 +273,33 @@ struct NeighborhoodNeighborhood3DHalf template struct NeighborhoodNeighborhood3D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DKS = Args::DepthKernelSize; - static constexpr int DNS = Args::DepthNeighborhoodSize; - static constexpr int DILATION = Args::Dilation; - static constexpr int DDILATION = Args::DepthDilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - NeighborhoodNeighborhood3DFull< - scalar_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>, - NeighborhoodNeighborhood3DHalf< - scalar_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>>::type; + NeighborhoodNeighborhood3DFull, + NeighborhoodNeighborhood3DHalf>::type; using Params = typename Kernel::Params; void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* attn_ptr, void* value_ptr, void* output_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); int64_t problem_size = batch_size * heads * depth * height * width * dim; auto grid = Kernel::Base::get_grid(problem_size); @@ -339,10 +312,12 @@ struct NeighborhoodNeighborhood3D { height, width, heads, - kernel_size, - dilation, - kernel_size_depth, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), dim, attn_stride_0, attn_stride_1, diff --git a/csrc/include/natten/cuda/naive/pointwise_neighborhood_1d.cuh b/csrc/include/natten/cuda/naive/pointwise_neighborhood_1d.cuh index 2901367..e7e0aeb 100644 --- a/csrc/include/natten/cuda/naive/pointwise_neighborhood_1d.cuh +++ b/csrc/include/natten/cuda/naive/pointwise_neighborhood_1d.cuh @@ -32,6 +32,8 @@ #include #include +#include +#include #include namespace natten { @@ -41,42 +43,45 @@ namespace naive { template struct PointwiseNeighborhood1DBase { struct Params { + bool is_grad; scalar_t* query; // query / d_out scalar_t* key; // key / value scalar_t* bias = nullptr; // optional: bias scalar_t* attn; // attn / d_attn - const int length; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int dim; - const int batch_size; - const int64_t attn_stride_0, attn_stride_1, attn_stride_2; - const int64_t query_stride_0, query_stride_1, query_stride_2; - const int64_t bias_stride_0; + int32_t length; + int32_t heads; + int32_t kernel_size; + int32_t dilation; + int32_t dim; + int32_t batch_size; + int64_t attn_stride_0, attn_stride_1, attn_stride_2; + int64_t query_stride_0, query_stride_1, query_stride_2; + int64_t bias_stride_0; __device__ __host__ Params() {} __device__ __host__ Params( + bool is_grad, scalar_t* query, scalar_t* key, scalar_t* attn, - const int length, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2) - : query(query), + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2) + : is_grad(is_grad), + query(query), key(key), attn(attn), length(length), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size(kernel_size), + dilation(dilation), dim(dim), batch_size(batch_size), bias_stride_0(0), @@ -93,26 +98,27 @@ struct PointwiseNeighborhood1DBase { scalar_t* key, // value / key scalar_t* bias, // relative positional bias tensor scalar_t* attn, // output / d_query - const int length, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2) - : query(query), + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2) + : is_grad(false), + query(query), key(key), bias(bias), attn(attn), length(length), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size(kernel_size), + dilation(dilation), dim(dim), batch_size(batch_size), - bias_stride_0(2 * kernel_size_in - 1), + bias_stride_0(2 * kernel_size - 1), attn_stride_2(attn_stride_2), attn_stride_1(attn_stride_1), attn_stride_0(attn_stride_0), @@ -124,12 +130,12 @@ struct PointwiseNeighborhood1DBase { __device__ __host__ PointwiseNeighborhood1DBase() {} static LaunchParams get_launch_params( - int batch_dim, - int length, - int kernel_size) { - int KERNELTHREADS = min(CUDA_NUM_THREADS, kernel_size); - int TOKENTHREADS = min(CUDA_NUM_THREADS / KERNELTHREADS, length); - int BATCHTHREADS = + int32_t batch_dim, + int32_t length, + int32_t kernel_size) { + int32_t KERNELTHREADS = min(CUDA_NUM_THREADS, kernel_size); + int32_t TOKENTHREADS = min(CUDA_NUM_THREADS / KERNELTHREADS, length); + int32_t BATCHTHREADS = min(64, max(1, CUDA_NUM_THREADS / (TOKENTHREADS * KERNELTHREADS))); dim3 grid( (length + TOKENTHREADS - 1) / TOKENTHREADS, @@ -140,48 +146,53 @@ struct PointwiseNeighborhood1DBase { } }; -template +template struct PointwiseNeighborhood1DFull : PointwiseNeighborhood1DBase { using Base = PointwiseNeighborhood1DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = false; static constexpr bool IsHalfKernel = false; static constexpr bool UsesSmem = false; __device__ __host__ PointwiseNeighborhood1DFull() : Base() {} - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { return dim; } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int z = blockIdx.z * blockDim.z + threadIdx.z; + auto mask_value = AttnMask::value(p.is_grad); + auto mask_0 = + NeighborhoodMask(p.length, p.kernel_size, p.dilation); + int32_t z = blockIdx.z * blockDim.z + threadIdx.z; if (z < p.batch_size * p.heads) { - const int i = blockIdx.x * blockDim.x + threadIdx.x; + int32_t i = blockIdx.x * blockDim.x + threadIdx.x; if (i < p.length) { - const int ki = blockIdx.y * blockDim.y + threadIdx.y; - if (ki < KERNEL_SIZE) { - const int b = z / p.heads; - const int h = z - b * p.heads; - const int ni = get_window_start( - i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - scalar_t updt = scalar_t(0); - const int64_t batchHeadOffset = - b * p.query_stride_0 + h * p.query_stride_1; - const int64_t queryOffset = batchHeadOffset + i * p.query_stride_2; - const int64_t keyOffset = - batchHeadOffset + (ki * dilation + ni) * p.query_stride_2; -#pragma unroll - for (int dimOffset = 0; dimOffset < p.dim; ++dimOffset) - updt += - p.query[queryOffset + dimOffset] * p.key[keyOffset + dimOffset]; - if (p.bias) { - const int pi = get_pb_start( - i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - updt += p.bias[h * p.bias_stride_0 + (pi + ki)]; + int32_t ki = blockIdx.y * blockDim.y + threadIdx.y; + if (ki < p.kernel_size) { + auto b = z / p.heads; + auto h = z - b * p.heads; + + auto ni = mask_0.get_window_start(i); + auto ei = mask_0.get_window_end(i, ni); + + scalar_t updt = scalar_t(0.0); + auto key_idx = ki * p.dilation + ni; + if (key_idx < ei) { + int64_t batchHeadOffset = + b * p.query_stride_0 + h * p.query_stride_1; + int64_t queryOffset = batchHeadOffset + i * p.query_stride_2; + int64_t keyOffset = batchHeadOffset + key_idx * p.query_stride_2; + for (int32_t dimOffset = 0; dimOffset < p.dim; ++dimOffset) + updt += p.query[queryOffset + dimOffset] * + p.key[keyOffset + dimOffset]; + if (p.bias) { + auto pi = mask_0.get_pb_start(i); + updt += p.bias[h * p.bias_stride_0 + (pi + ki)]; + } + } else { + updt = mask_value; } p.attn [b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + @@ -192,10 +203,11 @@ struct PointwiseNeighborhood1DFull : PointwiseNeighborhood1DBase { } }; -template +template struct PointwiseNeighborhood1DHalf : PointwiseNeighborhood1DBase { using Base = PointwiseNeighborhood1DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = IsBF16::value; static constexpr bool IsHalfKernel = true; static constexpr bool UsesSmem = false; @@ -204,7 +216,7 @@ struct PointwiseNeighborhood1DHalf : PointwiseNeighborhood1DBase { using HalfHelper = typename HalfArray::Base; - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { if (dim % 2 != 0) { std::cerr << "Naive NATTEN half-precision kernels only support 32-bit alignment. " @@ -216,38 +228,44 @@ struct PointwiseNeighborhood1DHalf : PointwiseNeighborhood1DBase { } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int z = blockIdx.z * blockDim.z + threadIdx.z; + auto mask_value = AttnMask::value(p.is_grad); + auto mask_0 = + NeighborhoodMask(p.length, p.kernel_size, p.dilation); + int32_t z = blockIdx.z * blockDim.z + threadIdx.z; if (z < p.batch_size * p.heads) { - const int i = blockIdx.x * blockDim.x + threadIdx.x; + int32_t i = blockIdx.x * blockDim.x + threadIdx.x; if (i < p.length) { - const int ki = blockIdx.y * blockDim.y + threadIdx.y; - if (ki < KERNEL_SIZE) { + int32_t ki = blockIdx.y * blockDim.y + threadIdx.y; + if (ki < p.kernel_size) { auto query2 = HalfHelper::typecast(p.query); auto key2 = HalfHelper::typecast(p.key); - const int b = z / p.heads; - const int h = z - b * p.heads; - const int ni = get_window_start( - i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - auto updt = HalfHelper::zero(); - const int64_t batchHeadOffset = - b * p.query_stride_0 + h * p.query_stride_1; - const int64_t queryOffset = batchHeadOffset + i * p.query_stride_2; - const int64_t keyOffset = - batchHeadOffset + (ki * dilation + ni) * p.query_stride_2; -#pragma unroll - for (int dimOffset = 0; dimOffset < p.dim; ++dimOffset) - updt = HalfHelper::fma( - query2[queryOffset + dimOffset], - key2[keyOffset + dimOffset], - updt); - scalar_t acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); - if (p.bias) { - const int pi = get_pb_start( - i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - acc = HalfHelper::add(acc, p.bias[h * p.bias_stride_0 + (pi + ki)]); + auto b = z / p.heads; + auto h = z - b * p.heads; + + auto ni = mask_0.get_window_start(i); + auto ei = mask_0.get_window_end(i, ni); + + scalar_t acc = HalfHelper::zero(); + auto key_idx = ki * p.dilation + ni; + if (key_idx < ei) { + auto updt = HalfHelper::zeros(); + int64_t batchHeadOffset = + b * p.query_stride_0 + h * p.query_stride_1; + int64_t queryOffset = batchHeadOffset + i * p.query_stride_2; + int64_t keyOffset = batchHeadOffset + key_idx * p.query_stride_2; + for (int32_t dimOffset = 0; dimOffset < p.dim; ++dimOffset) + updt = HalfHelper::fma( + query2[queryOffset + dimOffset], + key2[keyOffset + dimOffset], + updt); + acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); + if (p.bias) { + auto pi = mask_0.get_pb_start(i); + acc = + HalfHelper::add(acc, p.bias[h * p.bias_stride_0 + (pi + ki)]); + } + } else { + acc = mask_value; } p.attn [b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + @@ -261,42 +279,42 @@ struct PointwiseNeighborhood1DHalf : PointwiseNeighborhood1DBase { template struct PointwiseNeighborhood1D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood1DFull, - PointwiseNeighborhood1DHalf>::type; + PointwiseNeighborhood1DFull, + PointwiseNeighborhood1DHalf>::type; using Params = typename Kernel::Params; void operator()( - const int cc, + int32_t cc, cudaStream_t stream, + bool is_grad, void* query_ptr, void* key_ptr, void* attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); LaunchParams lp = Kernel::Base::get_launch_params( - batch_size * heads, length, kernel_size); + batch_size * heads, length, natten::flatten(kernel_size)); auto params = Params( + is_grad, reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), reinterpret_cast(attn_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), dim, batch_size, attn_stride_0, @@ -309,35 +327,35 @@ struct PointwiseNeighborhood1D { template struct PointwiseNeighborhood1DWithBias { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood1DFull, - PointwiseNeighborhood1DHalf>::type; + PointwiseNeighborhood1DFull, + PointwiseNeighborhood1DHalf>::type; using Params = typename Kernel::Params; + static_assert(!CausalMask::Dim0, "PN+Bias does not support causal masking."); + void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* query_ptr, void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); LaunchParams lp = Kernel::Base::get_launch_params( - batch_size * heads, length, kernel_size); + batch_size * heads, length, natten::flatten(kernel_size)); auto params = Params( reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), @@ -345,8 +363,8 @@ struct PointwiseNeighborhood1DWithBias { reinterpret_cast(attn_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), dim, batch_size, attn_stride_0, diff --git a/csrc/include/natten/cuda/naive/pointwise_neighborhood_2d.cuh b/csrc/include/natten/cuda/naive/pointwise_neighborhood_2d.cuh index e72efe1..94b0394 100644 --- a/csrc/include/natten/cuda/naive/pointwise_neighborhood_2d.cuh +++ b/csrc/include/natten/cuda/naive/pointwise_neighborhood_2d.cuh @@ -36,6 +36,8 @@ #include #include +#include +#include #include #include #include @@ -52,63 +54,69 @@ namespace naive { ///////////////////////////// Main kernels //////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// -template +template struct PointwiseNeighborhood2DFull : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = false; static constexpr bool IsHalfKernel = false; static constexpr bool UsesSmem = false; __device__ __host__ PointwiseNeighborhood2DFull() : Base() {} - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { return dim; } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int z = blockIdx.z * blockDim.z + threadIdx.z; + auto mask_value = AttnMask::value(p.is_grad); + auto mask_0 = NeighborhoodMask( + p.height, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.width, p.kernel_size_1, p.dilation_1); + int32_t z = blockIdx.z * blockDim.z + threadIdx.z; if (z < p.batch_size * p.heads) { - const int x = blockIdx.x * blockDim.x + threadIdx.x; + int32_t x = blockIdx.x * blockDim.x + threadIdx.x; if (x < p.height * p.width) { - const int y = blockIdx.y * blockDim.y + threadIdx.y; - if (y < KERNEL_SIZE * KERNEL_SIZE) { - const int b = z / p.heads; - const int h = z - b * p.heads; - const int ki = y / KERNEL_SIZE; - const int kj = y - ki * KERNEL_SIZE; - const int i = x / p.width; - const int j = x - i * p.width; + int32_t y = blockIdx.y * blockDim.y + threadIdx.y; + if (y < p.kernel_size_0 * p.kernel_size_1) { + auto b = z / p.heads; + auto h = z - b * p.heads; + auto ki = y / p.kernel_size_1; + auto kj = y - ki * p.kernel_size_1; + auto i = x / p.width; + auto j = x - i * p.width; - const int ni = get_window_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); + auto ni = mask_0.get_window_start(i); + auto nj = mask_1.get_window_start(j); + auto ei = mask_0.get_window_end(i, ni); + auto ej = mask_1.get_window_end(j, nj); - scalar_t updt = scalar_t(0); - const int64_t batchHeadOffset = - b * p.query_stride_0 + h * p.query_stride_1; - const int64_t queryOffset = - batchHeadOffset + i * p.query_stride_2 + j * p.query_stride_3; - const int64_t keyOffset = batchHeadOffset + - (ki * dilation + ni) * p.query_stride_2 + - (kj * dilation + nj) * p.query_stride_3; - for (int dimOffset = 0; dimOffset < p.dim; ++dimOffset) - updt += - p.query[queryOffset + dimOffset] * p.key[keyOffset + dimOffset]; - if (p.bias) { - const int pi = get_pb_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = get_pb_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t biasIndex = - h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); - updt += p.bias[biasIndex]; + auto key_idx_i = ki * p.dilation_0 + ni; + auto key_idx_j = kj * p.dilation_1 + nj; + scalar_t updt = scalar_t(0.0); + if (key_idx_i < ei && key_idx_j < ej) { + int64_t batchHeadOffset = + b * p.query_stride_0 + h * p.query_stride_1; + int64_t queryOffset = + batchHeadOffset + i * p.query_stride_2 + j * p.query_stride_3; + int64_t keyOffset = batchHeadOffset + key_idx_i * p.query_stride_2 + + key_idx_j * p.query_stride_3; + for (int32_t dimOffset = 0; dimOffset < p.dim; ++dimOffset) + updt += p.query[queryOffset + dimOffset] * + p.key[keyOffset + dimOffset]; + if (p.bias) { + auto pi = mask_0.get_pb_start(i); + auto pj = mask_1.get_pb_start(j); + int64_t biasIndex = + h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); + updt += p.bias[biasIndex]; + } + } else { + updt = mask_value; } - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + j * p.attn_stride_3 + y; p.attn[index] = updt; } @@ -117,10 +125,11 @@ struct PointwiseNeighborhood2DFull : PointwiseNeighborhood2DBase { } }; -template +template struct PointwiseNeighborhood2DHalf : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = IsBF16::value; static constexpr bool IsHalfKernel = true; static constexpr bool UsesSmem = false; @@ -129,7 +138,7 @@ struct PointwiseNeighborhood2DHalf : PointwiseNeighborhood2DBase { using HalfHelper = typename HalfArray::Base; - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { if (dim % 2 != 0) { std::cerr << "Naive NATTEN half-precision kernels only support 32-bit alignment. " @@ -141,54 +150,61 @@ struct PointwiseNeighborhood2DHalf : PointwiseNeighborhood2DBase { } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int z = blockIdx.z * blockDim.z + threadIdx.z; + auto mask_value = AttnMask::value(p.is_grad); + auto mask_0 = NeighborhoodMask( + p.height, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.width, p.kernel_size_1, p.dilation_1); + int32_t z = blockIdx.z * blockDim.z + threadIdx.z; if (z < p.batch_size * p.heads) { - const int x = blockIdx.x * blockDim.x + threadIdx.x; + int32_t x = blockIdx.x * blockDim.x + threadIdx.x; if (x < p.height * p.width) { - const int y = blockIdx.y * blockDim.y + threadIdx.y; - if (y < KERNEL_SIZE * KERNEL_SIZE) { + int32_t y = blockIdx.y * blockDim.y + threadIdx.y; + if (y < p.kernel_size_0 * p.kernel_size_1) { auto query2 = HalfHelper::typecast(p.query); auto key2 = HalfHelper::typecast(p.key); - const int b = z / p.heads; - const int h = z - b * p.heads; - const int ki = y / KERNEL_SIZE; - const int kj = y - ki * KERNEL_SIZE; - const int i = x / p.width; - const int j = x - i * p.width; + auto b = z / p.heads; + auto h = z - b * p.heads; + auto ki = y / p.kernel_size_1; + auto kj = y - ki * p.kernel_size_1; + auto i = x / p.width; + auto j = x - i * p.width; - const int ni = get_window_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); + auto ni = mask_0.get_window_start(i); + auto nj = mask_1.get_window_start(j); + auto ei = mask_0.get_window_end(i, ni); + auto ej = mask_1.get_window_end(j, nj); - auto updt = HalfHelper::zero(); - const int64_t batchHeadOffset = - b * p.query_stride_0 + h * p.query_stride_1; - const int64_t queryOffset = - batchHeadOffset + i * p.query_stride_2 + j * p.query_stride_3; - const int64_t keyOffset = batchHeadOffset + - (ki * dilation + ni) * p.query_stride_2 + - (kj * dilation + nj) * p.query_stride_3; - for (int dimOffset = 0; dimOffset < p.dim; ++dimOffset) - updt = HalfHelper::fma( - query2[queryOffset + dimOffset], - key2[keyOffset + dimOffset], - updt); - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + - i * p.attn_stride_2 + j * p.attn_stride_3 + y; - scalar_t acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); - if (p.bias) { - const int pi = get_pb_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = get_pb_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t biasIndex = - h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); - acc = HalfHelper::add(acc, p.bias[biasIndex]); + auto key_idx_i = ki * p.dilation_0 + ni; + auto key_idx_j = kj * p.dilation_1 + nj; + scalar_t acc = HalfHelper::zero(); + + if (key_idx_i < ei && key_idx_j < ej) { + auto updt = HalfHelper::zeros(); + int64_t batchHeadOffset = + b * p.query_stride_0 + h * p.query_stride_1; + int64_t queryOffset = + batchHeadOffset + i * p.query_stride_2 + j * p.query_stride_3; + int64_t keyOffset = batchHeadOffset + key_idx_i * p.query_stride_2 + + key_idx_j * p.query_stride_3; + for (int32_t dimOffset = 0; dimOffset < p.dim; ++dimOffset) + updt = HalfHelper::fma( + query2[queryOffset + dimOffset], + key2[keyOffset + dimOffset], + updt); + acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); + if (p.bias) { + auto pi = mask_0.get_pb_start(i); + auto pj = mask_1.get_pb_start(j); + int64_t biasIndex = + h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); + acc = HalfHelper::add(acc, p.bias[biasIndex]); + } + } else { + acc = mask_value; } + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + i * p.attn_stride_2 + j * p.attn_stride_3 + y; p.attn[index] = acc; } } @@ -203,469 +219,294 @@ struct PointwiseNeighborhood2DHalf : PointwiseNeighborhood2DBase { template struct PointwiseNeighborhood2D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull, - PointwiseNeighborhood2DHalf>::type; + PointwiseNeighborhood2DFull, + PointwiseNeighborhood2DHalf>::type; + using Kernel3x3 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull3x3, - PointwiseNeighborhood2DHalf3x3>::type; + PointwiseNeighborhood2DFull3x3, + PointwiseNeighborhood2DHalf3x3>::type; using Kernel5x5 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull5x5, - PointwiseNeighborhood2DHalf5x5>::type; + PointwiseNeighborhood2DFull5x5, + PointwiseNeighborhood2DHalf5x5>::type; using Kernel7x7 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull7x7, - PointwiseNeighborhood2DHalf7x7>::type; + PointwiseNeighborhood2DFull7x7, + PointwiseNeighborhood2DHalf7x7>::type; using Kernel9x9 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull9x9, - PointwiseNeighborhood2DHalf9x9>::type; + PointwiseNeighborhood2DFull9x9, + PointwiseNeighborhood2DHalf9x9>::type; using Kernel11x11 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull11x11, - PointwiseNeighborhood2DHalf11x11>::type; + PointwiseNeighborhood2DFull11x11, + PointwiseNeighborhood2DHalf11x11>::type; using Kernel13x13 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull13x13, - PointwiseNeighborhood2DHalf13x13>::type; + PointwiseNeighborhood2DFull13x13, + PointwiseNeighborhood2DHalf13x13>::type; using Params = typename Kernel::Params; void operator()( - const int cc, + int32_t cc, cudaStream_t stream, + bool is_grad, void* query_ptr, void* key_ptr, void* attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t original_dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - if (dim == 32 && natten::kEnableTiledNA && cc >= 60) { - if (kernel_size == 3) { - LaunchParams lp = Kernel3x3::get_launch_params( - batch_size * heads, - height, - width, - kernel_size * kernel_size, - dilation); - dim = Kernel3x3::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); - launch_cuda_kernel<<>>(params); - return; - } else if (kernel_size == 5) { - LaunchParams lp = Kernel5x5::get_launch_params( - batch_size * heads, - height, - width, - kernel_size * kernel_size, - dilation); - dim = Kernel5x5::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); - launch_cuda_kernel<<>>(params); - return; - } else if (kernel_size == 7) { - LaunchParams lp = Kernel7x7::get_launch_params( - batch_size * heads, - height, - width, - kernel_size * kernel_size, - dilation); - dim = Kernel7x7::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); - launch_cuda_kernel<<>>(params); - return; - } else if (kernel_size == 9) { - LaunchParams lp = Kernel9x9::get_launch_params( - batch_size * heads, - height, - width, - kernel_size * kernel_size, - dilation); - dim = Kernel9x9::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); - launch_cuda_kernel<<>>(params); - return; - } else if (kernel_size == 11) { - LaunchParams lp = Kernel11x11::get_launch_params( - batch_size * heads, - height, - width, - kernel_size * kernel_size, - dilation); - dim = Kernel11x11::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); - launch_cuda_kernel - <<>>(params); - return; - } else if (kernel_size == 13) { - LaunchParams lp = Kernel13x13::get_launch_params( - batch_size * heads, - height, - width, - kernel_size * kernel_size, - dilation); - dim = Kernel13x13::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); - launch_cuda_kernel - <<>>(params); - return; - } - } - LaunchParams lp = Kernel::get_launch_params( - batch_size * heads, height * width, kernel_size * kernel_size); - dim = Kernel::get_dim(dim); + const std::tuple& kernel_size, + const std::tuple& dilation) { + auto dim = Kernel::get_dim(original_dim); auto params = Params( + is_grad, reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), reinterpret_cast(attn_ptr), height, width, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), dim, batch_size, attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3); - launch_cuda_kernel<<>>(params); + if constexpr (!CausalMask::Dim0 && !CausalMask::Dim1) { + if (natten::kEnableTiledNA && all_dims_match(kernel_size) && + all_dims_match(dilation) && original_dim == 32 && cc >= 50) { + auto kernel_size_ = std::get<0>(kernel_size); + auto dilation_ = std::get<0>(dilation); + if (kernel_size_ == 3) { + LaunchParams lp = Kernel3x3::get_launch_params( + batch_size * heads, + height, + width, + natten::flatten(kernel_size), + dilation_); + launch_cuda_kernel + <<>>(params); + return; + } else if (kernel_size_ == 5) { + LaunchParams lp = Kernel5x5::get_launch_params( + batch_size * heads, + height, + width, + natten::flatten(kernel_size), + dilation_); + launch_cuda_kernel + <<>>(params); + return; + } else if (kernel_size_ == 7) { + LaunchParams lp = Kernel7x7::get_launch_params( + batch_size * heads, + height, + width, + natten::flatten(kernel_size), + dilation_); + launch_cuda_kernel + <<>>(params); + return; + } else if (kernel_size_ == 9) { + LaunchParams lp = Kernel9x9::get_launch_params( + batch_size * heads, + height, + width, + natten::flatten(kernel_size), + dilation_); + launch_cuda_kernel + <<>>(params); + return; + } else if (kernel_size_ == 11) { + LaunchParams lp = Kernel11x11::get_launch_params( + batch_size * heads, + height, + width, + natten::flatten(kernel_size), + dilation_); + launch_cuda_kernel + <<>>(params); + return; + } else if (kernel_size_ == 13) { + LaunchParams lp = Kernel13x13::get_launch_params( + batch_size * heads, + height, + width, + natten::flatten(kernel_size), + dilation_); + launch_cuda_kernel + <<>>(params); + return; + } + } + LaunchParams lp = Kernel::get_launch_params( + batch_size * heads, height * width, natten::flatten(kernel_size)); + launch_cuda_kernel<<>>(params); + } else { + LaunchParams lp = Kernel::get_launch_params( + batch_size * heads, height * width, natten::flatten(kernel_size)); + launch_cuda_kernel<<>>(params); + } } }; template struct PointwiseNeighborhood2DWithBias { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull, - PointwiseNeighborhood2DHalf>::type; + PointwiseNeighborhood2DFull, + PointwiseNeighborhood2DHalf>::type; using Kernel3x3 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull3x3, - PointwiseNeighborhood2DHalf3x3>::type; + PointwiseNeighborhood2DFull3x3, + PointwiseNeighborhood2DHalf3x3>::type; using Kernel5x5 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull5x5, - PointwiseNeighborhood2DHalf5x5>::type; + PointwiseNeighborhood2DFull5x5, + PointwiseNeighborhood2DHalf5x5>::type; using Kernel7x7 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull7x7, - PointwiseNeighborhood2DHalf7x7>::type; + PointwiseNeighborhood2DFull7x7, + PointwiseNeighborhood2DHalf7x7>::type; using Kernel9x9 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull9x9, - PointwiseNeighborhood2DHalf9x9>::type; + PointwiseNeighborhood2DFull9x9, + PointwiseNeighborhood2DHalf9x9>::type; using Kernel11x11 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull11x11, - PointwiseNeighborhood2DHalf11x11>::type; + PointwiseNeighborhood2DFull11x11, + PointwiseNeighborhood2DHalf11x11>::type; using Kernel13x13 = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood2DFull13x13, - PointwiseNeighborhood2DHalf13x13>::type; + PointwiseNeighborhood2DFull13x13, + PointwiseNeighborhood2DHalf13x13>::type; using Params = typename Kernel::Params; + static_assert( + !CausalMask::Dim0 && !CausalMask::Dim1, + "PN+Bias does not support causal masking."); + void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* query_ptr, void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t original_dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - if (dim == 32 && natten::kEnableTiledNA && cc >= 60) { - if (kernel_size == 3) { + const std::tuple& kernel_size, + const std::tuple& dilation) { + auto dim = Kernel::get_dim(original_dim); + auto params = Params( + reinterpret_cast(query_ptr), + reinterpret_cast(key_ptr), + reinterpret_cast(bias_ptr), + reinterpret_cast(attn_ptr), + height, + width, + heads, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + dim, + batch_size, + attn_stride_0, + attn_stride_1, + attn_stride_2, + attn_stride_3); + if (natten::kEnableTiledNA && all_dims_match(kernel_size) && + all_dims_match(dilation) && original_dim == 32 && cc >= 50) { + auto kernel_size_ = std::get<0>(kernel_size); + auto dilation_ = std::get<0>(dilation); + if (kernel_size_ == 3) { LaunchParams lp = Kernel3x3::get_launch_params( batch_size * heads, height, width, - kernel_size * kernel_size, - dilation); - dim = Kernel3x3::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(bias_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); + kernel_size_ * kernel_size_, + dilation_); launch_cuda_kernel<<>>(params); return; - } else if (kernel_size == 5) { + } else if (kernel_size_ == 5) { LaunchParams lp = Kernel5x5::get_launch_params( batch_size * heads, height, width, - kernel_size * kernel_size, - dilation); - dim = Kernel5x5::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(bias_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); + natten::flatten(kernel_size), + dilation_); launch_cuda_kernel<<>>(params); return; - } else if (kernel_size == 7) { + } else if (kernel_size_ == 7) { LaunchParams lp = Kernel7x7::get_launch_params( batch_size * heads, height, width, - kernel_size * kernel_size, - dilation); - dim = Kernel7x7::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(bias_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); + natten::flatten(kernel_size), + dilation_); launch_cuda_kernel<<>>(params); return; - } else if (kernel_size == 9) { + } else if (kernel_size_ == 9) { LaunchParams lp = Kernel9x9::get_launch_params( batch_size * heads, height, width, - kernel_size * kernel_size, - dilation); - dim = Kernel9x9::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(bias_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); + natten::flatten(kernel_size), + dilation_); launch_cuda_kernel<<>>(params); return; - } else if (kernel_size == 11) { + } else if (kernel_size_ == 11) { LaunchParams lp = Kernel11x11::get_launch_params( batch_size * heads, height, width, - kernel_size * kernel_size, - dilation); - dim = Kernel11x11::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(bias_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); + natten::flatten(kernel_size), + dilation_); launch_cuda_kernel <<>>(params); return; - } else if (kernel_size == 13) { + } else if (kernel_size_ == 13) { LaunchParams lp = Kernel13x13::get_launch_params( batch_size * heads, height, width, - kernel_size * kernel_size, - dilation); - dim = Kernel13x13::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(bias_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); + natten::flatten(kernel_size), + dilation_); launch_cuda_kernel <<>>(params); return; } } LaunchParams lp = Kernel::get_launch_params( - batch_size * heads, height * width, kernel_size * kernel_size); - dim = Kernel::get_dim(dim); - auto params = Params( - reinterpret_cast(query_ptr), - reinterpret_cast(key_ptr), - reinterpret_cast(bias_ptr), - reinterpret_cast(attn_ptr), - height, - width, - heads, - kernel_size, - dilation, - dim, - batch_size, - attn_stride_0, - attn_stride_1, - attn_stride_2, - attn_stride_3); + batch_size * heads, height * width, natten::flatten(kernel_size)); launch_cuda_kernel<<>>(params); } }; diff --git a/csrc/include/natten/cuda/naive/pointwise_neighborhood_3d.cuh b/csrc/include/natten/cuda/naive/pointwise_neighborhood_3d.cuh index bf87106..2aaa9a3 100644 --- a/csrc/include/natten/cuda/naive/pointwise_neighborhood_3d.cuh +++ b/csrc/include/natten/cuda/naive/pointwise_neighborhood_3d.cuh @@ -32,6 +32,8 @@ #include #include +#include +#include #include namespace natten { @@ -41,58 +43,63 @@ namespace naive { template struct PointwiseNeighborhood3DBase { struct Params { + bool is_grad; scalar_t* query; // query / d_out scalar_t* key; // key / value scalar_t* bias = nullptr; // optional: bias scalar_t* attn; // attn / d_attn - const int depth; - const int height; - const int width; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int depth_kernel_size_in; - const int depth_dilation_in; - const int dim; - const int batch_size; - const int64_t attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, + int32_t depth; + int32_t height; + int32_t width; + int32_t heads; + int32_t kernel_size_0, kernel_size_1, kernel_size_2; + int32_t dilation_0, dilation_1, dilation_2; + int32_t dim; + int32_t batch_size; + int64_t attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4; - const int64_t query_stride_0, query_stride_1, query_stride_2, query_stride_3, + int64_t query_stride_0, query_stride_1, query_stride_2, query_stride_3, query_stride_4; - const int64_t bias_stride_0, bias_stride_1, bias_stride_2; + int64_t bias_stride_0, bias_stride_1, bias_stride_2; __device__ __host__ Params() {} __device__ __host__ Params( + bool is_grad, scalar_t* query, scalar_t* key, scalar_t* attn, - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int depth_kernel_size_in, - const int depth_dilation_in, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3, - const int64_t attn_stride_4) - : query(query), + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int64_t attn_stride_4) + : is_grad(is_grad), + query(query), key(key), attn(attn), depth(depth), height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), - depth_kernel_size_in(depth_kernel_size_in), - depth_dilation_in(depth_dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + kernel_size_2(kernel_size_2), + dilation_0(dilation_0), + dilation_1(dilation_1), + dilation_2(dilation_2), dim(dim), batch_size(batch_size), bias_stride_2(0), @@ -115,22 +122,25 @@ struct PointwiseNeighborhood3DBase { scalar_t* key, // value / key scalar_t* bias, // relative positional bias tensor scalar_t* attn, // output / d_query - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int depth_kernel_size_in, - const int depth_dilation_in, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3, - const int64_t attn_stride_4) - : query(query), + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int64_t attn_stride_4) + : is_grad(false), + query(query), key(key), bias(bias), attn(attn), @@ -138,17 +148,19 @@ struct PointwiseNeighborhood3DBase { height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), - depth_kernel_size_in(depth_kernel_size_in), - depth_dilation_in(depth_dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + kernel_size_2(kernel_size_2), + dilation_0(dilation_0), + dilation_1(dilation_1), + dilation_2(dilation_2), dim(dim), batch_size(batch_size), - bias_stride_2(2 * kernel_size_in - 1), - bias_stride_1((2 * kernel_size_in - 1) * (2 * kernel_size_in - 1)), + bias_stride_2(2 * kernel_size_2 - 1), + bias_stride_1((2 * kernel_size_1 - 1) * (2 * kernel_size_2 - 1)), bias_stride_0( - (2 * kernel_size_in - 1) * (2 * kernel_size_in - 1) * - (2 * depth_kernel_size_in - 1)), + (2 * kernel_size_0 - 1) * (2 * kernel_size_1 - 1) * + (2 * kernel_size_2 - 1)), attn_stride_4(attn_stride_4), attn_stride_3(attn_stride_3), attn_stride_2(attn_stride_2), @@ -164,14 +176,19 @@ struct PointwiseNeighborhood3DBase { __device__ __host__ PointwiseNeighborhood3DBase() {} static LaunchParams get_launch_params( - int batch_dim, - int spatial_size, - int attention_span) { - int KERNELTHREADS = - min(CUDA_NUM_THREADS, attention_span /* == kernel_size^3 */); - int PIXELTHREADS = min(int(CUDA_NUM_THREADS / KERNELTHREADS), spatial_size); - int BATCHTHREADS = - min(64, max(1, CUDA_NUM_THREADS / (PIXELTHREADS * KERNELTHREADS))); + int32_t batch_dim, + int32_t spatial_size, + int32_t attention_span) { + // NOTE: was 1024 as of 01/30/2024, but since adding causal masks, + // runs out of registers with certain causal masks (F, T, T) with + // 1024 threads per CTA. + int32_t num_threads = 512; + int32_t KERNELTHREADS = + min(num_threads, attention_span /* == kernel_size^3 */); + int32_t PIXELTHREADS = + min(int32_t(num_threads / KERNELTHREADS), spatial_size); + int32_t BATCHTHREADS = + min(64, max(1, num_threads / (PIXELTHREADS * KERNELTHREADS))); dim3 grid( (spatial_size + PIXELTHREADS - 1) / PIXELTHREADS, (attention_span + KERNELTHREADS - 1) / KERNELTHREADS, @@ -181,88 +198,84 @@ struct PointwiseNeighborhood3DBase { } }; -template < - typename scalar_t, - int KS, - int NS, - int DILATION, - int DKS, - int DNS, - int DDILATION> +template struct PointwiseNeighborhood3DFull : PointwiseNeighborhood3DBase { using Base = PointwiseNeighborhood3DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = false; static constexpr bool IsHalfKernel = false; static constexpr bool UsesSmem = false; __device__ __host__ PointwiseNeighborhood3DFull() : Base() {} - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { return dim; } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int KERNEL_SIZE_D = (DKS > 1) ? DKS : p.depth_kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int NEIGHBORHOOD_SIZE_D = (DNS > 0) ? DNS : KERNEL_SIZE_D / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int dilation_d = (DDILATION > 0) ? DDILATION : p.depth_dilation_in; - const int z = blockIdx.z * blockDim.z + threadIdx.z; + auto mask_value = AttnMask::value(p.is_grad); + auto mask_0 = NeighborhoodMask( + p.depth, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.height, p.kernel_size_1, p.dilation_1); + auto mask_2 = NeighborhoodMask( + p.width, p.kernel_size_2, p.dilation_2); + int32_t z = blockIdx.z * blockDim.z + threadIdx.z; if (z < p.batch_size * p.heads) { - const int x = blockIdx.x * blockDim.x + threadIdx.x; + int32_t x = blockIdx.x * blockDim.x + threadIdx.x; if (x < p.depth * p.height * p.width) { - const int y = blockIdx.y * blockDim.y + threadIdx.y; - if (y < KERNEL_SIZE_D * KERNEL_SIZE * KERNEL_SIZE) { - int indtmp1 = y / KERNEL_SIZE; - const int kk = indtmp1 / KERNEL_SIZE; - const int kj = y - indtmp1 * KERNEL_SIZE; - const int ki = indtmp1 - kk * KERNEL_SIZE; + int32_t y = blockIdx.y * blockDim.y + threadIdx.y; + if (y < p.kernel_size_0 * p.kernel_size_1 * p.kernel_size_2) { + int32_t indtmp1 = y / p.kernel_size_2; + auto kk = indtmp1 / p.kernel_size_1; + auto kj = y - indtmp1 * p.kernel_size_2; + auto ki = indtmp1 - kk * p.kernel_size_1; indtmp1 = x / p.width; - const int k = indtmp1 / p.height; - const int j = x - indtmp1 * p.width; - const int i = indtmp1 - k * p.height; - - const int b = z / p.heads; - const int h = z - b * p.heads; - - const int ni = get_window_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nk = get_window_start( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); - + auto k = indtmp1 / p.height; + auto j = x - indtmp1 * p.width; + auto i = indtmp1 - k * p.height; + + auto b = z / p.heads; + auto h = z - b * p.heads; + + auto nk = mask_0.get_window_start(k); + auto ni = mask_1.get_window_start(i); + auto nj = mask_2.get_window_start(j); + auto ek = mask_0.get_window_end(k, nk); + auto ei = mask_1.get_window_end(i, ni); + auto ej = mask_2.get_window_end(j, nj); + + auto key_idx_k = kk * p.dilation_0 + nk; + auto key_idx_i = ki * p.dilation_1 + ni; + auto key_idx_j = kj * p.dilation_2 + nj; scalar_t updt = scalar_t(0); - const int64_t batchHeadOffset = - b * p.query_stride_0 + h * p.query_stride_1; - const int64_t queryOffset = batchHeadOffset + k * p.query_stride_2 + - i * p.query_stride_3 + j * p.query_stride_4; - const int64_t keyOffset = batchHeadOffset + - (kk * dilation_d + nk) * p.query_stride_2 + - (ki * dilation + ni) * p.query_stride_3 + - (kj * dilation + nj) * p.query_stride_4; -#pragma unroll - for (int dimOffset = 0; dimOffset < p.dim; ++dimOffset) - updt += - p.query[queryOffset + dimOffset] * p.key[keyOffset + dimOffset]; - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + if (key_idx_i < ei && key_idx_j < ej && key_idx_k < ek) { + int64_t batchHeadOffset = + b * p.query_stride_0 + h * p.query_stride_1; + int64_t queryOffset = batchHeadOffset + k * p.query_stride_2 + + i * p.query_stride_3 + j * p.query_stride_4; + int64_t keyOffset = batchHeadOffset + key_idx_k * p.query_stride_2 + + key_idx_i * p.query_stride_3 + key_idx_j * p.query_stride_4; + for (int32_t dimOffset = 0; dimOffset < p.dim; ++dimOffset) + updt += p.query[queryOffset + dimOffset] * + p.key[keyOffset + dimOffset]; + if (p.bias) { + auto pk = mask_0.get_pb_start(k); + auto pi = mask_1.get_pb_start(i); + auto pj = mask_2.get_pb_start(j); + int64_t biasIndex = h * p.bias_stride_0 + + (pk + kk) * p.bias_stride_1 + (pi + ki) * p.bias_stride_2 + + (pj + kj); + updt += p.bias[biasIndex]; + } + } else { + updt = mask_value; + } + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + k * p.attn_stride_2 + i * p.attn_stride_3 + j * p.attn_stride_4 + y; - if (p.bias) { - const int pi = get_pb_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = get_pb_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pk = get_pb_start( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); - const int64_t biasIndex = h * p.bias_stride_0 + - (pk + kk) * p.bias_stride_1 + (pi + ki) * p.bias_stride_2 + - (pj + kj); - updt += p.bias[biasIndex]; - } p.attn[index] = updt; } } @@ -270,17 +283,11 @@ struct PointwiseNeighborhood3DFull : PointwiseNeighborhood3DBase { } }; -template < - typename scalar_t, - int KS, - int NS, - int DILATION, - int DKS, - int DNS, - int DDILATION> +template struct PointwiseNeighborhood3DHalf : PointwiseNeighborhood3DBase { using Base = PointwiseNeighborhood3DBase; using Params = typename Base::Params; + using CausalMask = CausalMask_; static constexpr bool IsBF16Kernel = IsBF16::value; static constexpr bool IsHalfKernel = true; static constexpr bool UsesSmem = false; @@ -289,7 +296,7 @@ struct PointwiseNeighborhood3DHalf : PointwiseNeighborhood3DBase { using HalfHelper = typename HalfArray::Base; - static __host__ int get_dim(int dim) { + static __host__ int32_t get_dim(int32_t dim) { if (dim % 2 != 0) { std::cerr << "Naive NATTEN half-precision kernels only support 32-bit alignment. " @@ -301,71 +308,75 @@ struct PointwiseNeighborhood3DHalf : PointwiseNeighborhood3DBase { } __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int KERNEL_SIZE_D = (DKS > 1) ? DKS : p.depth_kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int NEIGHBORHOOD_SIZE_D = (DNS > 0) ? DNS : KERNEL_SIZE_D / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int dilation_d = (DDILATION > 0) ? DDILATION : p.depth_dilation_in; - const int z = blockIdx.z * blockDim.z + threadIdx.z; + auto mask_value = AttnMask::value(p.is_grad); + auto mask_0 = NeighborhoodMask( + p.depth, p.kernel_size_0, p.dilation_0); + auto mask_1 = NeighborhoodMask( + p.height, p.kernel_size_1, p.dilation_1); + auto mask_2 = NeighborhoodMask( + p.width, p.kernel_size_2, p.dilation_2); + int32_t z = blockIdx.z * blockDim.z + threadIdx.z; if (z < p.batch_size * p.heads) { - const int x = blockIdx.x * blockDim.x + threadIdx.x; + int32_t x = blockIdx.x * blockDim.x + threadIdx.x; if (x < p.depth * p.height * p.width) { - const int y = blockIdx.y * blockDim.y + threadIdx.y; - if (y < KERNEL_SIZE_D * KERNEL_SIZE * KERNEL_SIZE) { + int32_t y = blockIdx.y * blockDim.y + threadIdx.y; + if (y < p.kernel_size_0 * p.kernel_size_1 * p.kernel_size_2) { auto query2 = HalfHelper::typecast(p.query); auto key2 = HalfHelper::typecast(p.key); - int indtmp1 = y / KERNEL_SIZE; - const int kk = indtmp1 / KERNEL_SIZE; - const int kj = y - indtmp1 * KERNEL_SIZE; - const int ki = indtmp1 - kk * KERNEL_SIZE; + int32_t indtmp1 = y / p.kernel_size_2; + auto kk = indtmp1 / p.kernel_size_1; + auto kj = y - indtmp1 * p.kernel_size_2; + auto ki = indtmp1 - kk * p.kernel_size_1; indtmp1 = x / p.width; - const int k = indtmp1 / p.height; - const int j = x - indtmp1 * p.width; - const int i = indtmp1 - k * p.height; - - const int b = z / p.heads; - const int h = z - b * p.heads; - - const int ni = get_window_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nk = get_window_start( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); - - auto updt = HalfHelper::zero(); - const int64_t batchHeadOffset = - b * p.query_stride_0 + h * p.query_stride_1; - const int64_t queryOffset = batchHeadOffset + k * p.query_stride_2 + - i * p.query_stride_3 + j * p.query_stride_4; - const int64_t keyOffset = batchHeadOffset + - (kk * dilation_d + nk) * p.query_stride_2 + - (ki * dilation + ni) * p.query_stride_3 + - (kj * dilation + nj) * p.query_stride_4; -#pragma unroll - for (int dimOffset = 0; dimOffset < p.dim; ++dimOffset) - updt = HalfHelper::fma( - query2[queryOffset + dimOffset], - key2[keyOffset + dimOffset], - updt); - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + auto k = indtmp1 / p.height; + auto j = x - indtmp1 * p.width; + auto i = indtmp1 - k * p.height; + + auto b = z / p.heads; + auto h = z - b * p.heads; + + auto nk = mask_0.get_window_start(k); + auto ni = mask_1.get_window_start(i); + auto nj = mask_2.get_window_start(j); + auto ek = mask_0.get_window_end(k, nk); + auto ei = mask_1.get_window_end(i, ni); + auto ej = mask_2.get_window_end(j, nj); + + auto key_idx_k = kk * p.dilation_0 + nk; + auto key_idx_i = ki * p.dilation_1 + ni; + auto key_idx_j = kj * p.dilation_2 + nj; + scalar_t acc = HalfHelper::zero(); + + if (key_idx_i < ei && key_idx_j < ej && key_idx_k < ek) { + auto updt = HalfHelper::zeros(); + int64_t batchHeadOffset = + b * p.query_stride_0 + h * p.query_stride_1; + int64_t queryOffset = batchHeadOffset + k * p.query_stride_2 + + i * p.query_stride_3 + j * p.query_stride_4; + int64_t keyOffset = batchHeadOffset + key_idx_k * p.query_stride_2 + + key_idx_i * p.query_stride_3 + key_idx_j * p.query_stride_4; + for (int32_t dimOffset = 0; dimOffset < p.dim; ++dimOffset) + updt = HalfHelper::fma( + query2[queryOffset + dimOffset], + key2[keyOffset + dimOffset], + updt); + acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); + if (p.bias) { + auto pk = mask_0.get_pb_start(k); + auto pi = mask_1.get_pb_start(i); + auto pj = mask_2.get_pb_start(j); + int64_t biasIndex = h * p.bias_stride_0 + + (pk + kk) * p.bias_stride_1 + (pi + ki) * p.bias_stride_2 + + (pj + kj); + acc = HalfHelper::add(acc, p.bias[biasIndex]); + } + } else { + acc = mask_value; + } + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + k * p.attn_stride_2 + i * p.attn_stride_3 + j * p.attn_stride_4 + y; - scalar_t acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); - if (p.bias) { - const int pi = get_pb_start( - i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = get_pb_start( - j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pk = get_pb_start( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); - const int64_t biasIndex = h * p.bias_stride_0 + - (pk + kk) * p.bias_stride_1 + (pi + ki) * p.bias_stride_2 + - (pj + kj); - acc = HalfHelper::add(acc, p.bias[biasIndex]); - } p.attn[index] = acc; } } @@ -376,60 +387,41 @@ struct PointwiseNeighborhood3DHalf : PointwiseNeighborhood3DBase { template struct PointwiseNeighborhood3D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DKS = Args::DepthKernelSize; - static constexpr int DNS = Args::DepthNeighborhoodSize; - static constexpr int DILATION = Args::Dilation; - static constexpr int DDILATION = Args::DepthDilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood3DFull< - scalar_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>, - PointwiseNeighborhood3DHalf< - scalar_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>>::type; + PointwiseNeighborhood3DFull, + PointwiseNeighborhood3DHalf>::type; using Params = typename Kernel::Params; void operator()( - const int cc, + int32_t cc, cudaStream_t stream, + bool is_grad, void* query_ptr, void* key_ptr, void* attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); LaunchParams lp = Kernel::Base::get_launch_params( batch_size * heads, depth * height * width, - kernel_size_depth * kernel_size * kernel_size); + natten::flatten(kernel_size)); auto params = Params( + is_grad, reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), reinterpret_cast(attn_ptr), @@ -437,10 +429,12 @@ struct PointwiseNeighborhood3D { height, width, heads, - kernel_size, - dilation, - kernel_size_depth, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), dim, batch_size, attn_stride_0, @@ -455,60 +449,43 @@ struct PointwiseNeighborhood3D { template struct PointwiseNeighborhood3DWithBias { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DKS = Args::DepthKernelSize; - static constexpr int DNS = Args::DepthNeighborhoodSize; - static constexpr int DILATION = Args::Dilation; - static constexpr int DDILATION = Args::DepthDilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - PointwiseNeighborhood3DFull< - scalar_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>, - PointwiseNeighborhood3DHalf< - scalar_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>>::type; + PointwiseNeighborhood3DFull, + PointwiseNeighborhood3DHalf>::type; using Params = typename Kernel::Params; + static_assert( + !CausalMask::Dim0 && !CausalMask::Dim1 && !CausalMask::Dim2, + "PN+Bias does not support causal masking."); + void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* query_ptr, void* key_ptr, void* bias_ptr, void* attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { + const std::tuple& kernel_size, + const std::tuple& dilation) { dim = Kernel::get_dim(dim); LaunchParams lp = Kernel::Base::get_launch_params( batch_size * heads, depth * height * width, - kernel_size_depth * kernel_size * kernel_size); + natten::flatten(kernel_size)); auto params = Params( reinterpret_cast(query_ptr), reinterpret_cast(key_ptr), @@ -518,10 +495,12 @@ struct PointwiseNeighborhood3DWithBias { height, width, heads, - kernel_size, - dilation, - kernel_size_depth, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), dim, batch_size, attn_stride_0, diff --git a/csrc/include/natten/cuda/naive/rel_pos_bias_1d.cuh b/csrc/include/natten/cuda/naive/rel_pos_bias_1d.cuh index 8dda269..ae1a2d4 100644 --- a/csrc/include/natten/cuda/naive/rel_pos_bias_1d.cuh +++ b/csrc/include/natten/cuda/naive/rel_pos_bias_1d.cuh @@ -28,6 +28,7 @@ #include #include +#include #include // TODO: We're still using ATen's atomic add! @@ -45,41 +46,41 @@ struct RelPosBiasGradient1DBase { struct Params { acc_t* d_bias; scalar_t* d_attn; - const int length; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int batch_size; - const int num_threads; - const int64_t problem_size; - const int64_t attn_stride_0, attn_stride_1, attn_stride_2; - const int64_t bias_stride_0; + int32_t length; + int32_t heads; + int32_t kernel_size; + int32_t dilation; + int32_t batch_size; + int32_t num_threads; + int64_t problem_size; + int64_t attn_stride_0, attn_stride_1, attn_stride_2; + int64_t bias_stride_0; __device__ __host__ Params() {} __device__ __host__ Params( acc_t* d_bias, scalar_t* d_attn, - const int length, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t problem_size, - const int num_threads) + int32_t length, + int32_t heads, + int32_t kernel_size, + int32_t dilation, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t problem_size, + int32_t num_threads) : d_bias(d_bias), d_attn(d_attn), length(length), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size(kernel_size), + dilation(dilation), batch_size(batch_size), problem_size(problem_size), num_threads(num_threads), - bias_stride_0(2 * kernel_size_in - 1), + bias_stride_0(2 * kernel_size - 1), attn_stride_2(attn_stride_2), attn_stride_1(attn_stride_1), attn_stride_0(attn_stride_0) {} @@ -87,14 +88,14 @@ struct RelPosBiasGradient1DBase { __device__ __host__ RelPosBiasGradient1DBase() {} - static LaunchParams get_launch_params(int n_threads) { + static LaunchParams get_launch_params(int32_t n_threads) { dim3 grid(GET_BLOCKS(n_threads, 64)); dim3 block(64); return LaunchParams(grid, block); } }; -template +template struct RelPosBiasGradient1DFull : RelPosBiasGradient1DBase { using Base = RelPosBiasGradient1DBase; using Params = typename Base::Params; @@ -105,32 +106,30 @@ struct RelPosBiasGradient1DFull : RelPosBiasGradient1DBase { __device__ __host__ RelPosBiasGradient1DFull() : Base() {} __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto kernel_size_half = p.kernel_size / 2; + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.num_threads) { - int indtmp1 = linearIndex / KERNEL_SIZE; - const int ki = linearIndex - indtmp1 * KERNEL_SIZE; - const int h = indtmp1 / p.length; - const int i = indtmp1 - h * p.length; - const int pi = - get_pb_start(i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); + int32_t indtmp1 = linearIndex / p.kernel_size; + auto ki = linearIndex - indtmp1 * p.kernel_size; + auto h = indtmp1 / p.length; + auto i = indtmp1 - h * p.length; + auto pi = get_pb_start( + i, p.length, p.kernel_size, kernel_size_half, p.dilation); acc_t d_rpb_update = acc_t(0); int64_t attnOffset = h * p.attn_stride_1 + i * p.attn_stride_2 + ki; #pragma unroll - for (int b = 0; b < p.batch_size; ++b) { + for (int32_t b = 0; b < p.batch_size; ++b) { d_rpb_update += static_cast(p.d_attn[attnOffset]); attnOffset += p.attn_stride_0; } - const int64_t index = h * p.bias_stride_0 + (pi + ki); + int64_t index = h * p.bias_stride_0 + (pi + ki); at::native::fastAtomicAdd( p.d_bias, index, p.problem_size, d_rpb_update, true); } } }; -template +template struct RelPosBiasGradient1DHalf : RelPosBiasGradient1DBase { using Base = RelPosBiasGradient1DBase; using Params = typename Base::Params; @@ -143,25 +142,23 @@ struct RelPosBiasGradient1DHalf : RelPosBiasGradient1DBase { using HalfHelper = typename HalfArray::Base; __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto kernel_size_half = p.kernel_size / 2; + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.num_threads) { - int indtmp1 = linearIndex / KERNEL_SIZE; - const int ki = linearIndex - indtmp1 * KERNEL_SIZE; - const int h = indtmp1 / p.length; - const int i = indtmp1 - h * p.length; - const int pi = - get_pb_start(i, p.length, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); + int32_t indtmp1 = linearIndex / p.kernel_size; + auto ki = linearIndex - indtmp1 * p.kernel_size; + auto h = indtmp1 / p.length; + auto i = indtmp1 - h * p.length; + auto pi = get_pb_start( + i, p.length, p.kernel_size, kernel_size_half, p.dilation); acc_t d_rpb_update = acc_t(0); int64_t attnOffset = h * p.attn_stride_1 + i * p.attn_stride_2 + ki; #pragma unroll - for (int b = 0; b < p.batch_size; ++b) { + for (int32_t b = 0; b < p.batch_size; ++b) { d_rpb_update += HalfHelper::to_float(p.d_attn[attnOffset]); attnOffset += p.attn_stride_0; } - const int64_t index = h * p.bias_stride_0 + (pi + ki); + int64_t index = h * p.bias_stride_0 + (pi + ki); at::native::fastAtomicAdd( p.d_bias, index, p.problem_size, d_rpb_update, true); } @@ -171,42 +168,42 @@ struct RelPosBiasGradient1DHalf : RelPosBiasGradient1DBase { template struct RelPosBiasGradient1D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using acc_t = typename std::conditional= 4, scalar_t, float>::type; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - RelPosBiasGradient1DFull, - RelPosBiasGradient1DHalf>::type; + RelPosBiasGradient1DFull, + RelPosBiasGradient1DHalf>::type; using Params = typename Kernel::Params; + static_assert(!CausalMask::Dim0, "PN+Bias does not support causal masking."); + void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* d_bias_ptr, void* d_attn_ptr, - int batch_size, - int heads, - int length, - int dim, + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, - int kernel_size, - int dilation) { - int num_threads = heads * length * kernel_size; - int64_t problem_size = heads * (2 * kernel_size - 1); + const std::tuple& kernel_size, + const std::tuple& dilation) { + int32_t num_threads = heads * length * natten::flatten(kernel_size); + int64_t problem_size = heads * (2 * std::get<0>(kernel_size) - 1); LaunchParams lp = Kernel::Base::get_launch_params(num_threads); auto params = Params( reinterpret_cast(d_bias_ptr), reinterpret_cast(d_attn_ptr), length, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<0>(dilation), batch_size, attn_stride_0, attn_stride_1, diff --git a/csrc/include/natten/cuda/naive/rel_pos_bias_2d.cuh b/csrc/include/natten/cuda/naive/rel_pos_bias_2d.cuh index 184894e..4a67622 100644 --- a/csrc/include/natten/cuda/naive/rel_pos_bias_2d.cuh +++ b/csrc/include/natten/cuda/naive/rel_pos_bias_2d.cuh @@ -28,6 +28,7 @@ #include #include +#include #include // TODO: We're still using ATen's atomic add! @@ -45,46 +46,50 @@ struct RelPosBiasGradient2DBase { struct Params { acc_t* d_bias; scalar_t* d_attn; - const int height; - const int width; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int batch_size; - const int num_threads; - const int64_t problem_size; - const int64_t attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3; - const int64_t bias_stride_0, bias_stride_1; + int32_t height; + int32_t width; + int32_t heads; + int32_t kernel_size_0, kernel_size_1; + int32_t dilation_0, dilation_1; + int32_t batch_size; + int32_t num_threads; + int64_t problem_size; + int64_t attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3; + int64_t bias_stride_0, bias_stride_1; __device__ __host__ Params() {} __device__ __host__ Params( acc_t* d_bias, scalar_t* d_attn, - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3, - const int64_t problem_size, - const int num_threads) + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int64_t problem_size, + int32_t num_threads) : d_bias(d_bias), d_attn(d_attn), height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + dilation_0(dilation_0), + dilation_1(dilation_1), batch_size(batch_size), problem_size(problem_size), num_threads(num_threads), - bias_stride_1(2 * kernel_size_in - 1), - bias_stride_0((2 * kernel_size_in - 1) * (2 * kernel_size_in - 1)), + bias_stride_1(2 * kernel_size_1 - 1), + bias_stride_0((2 * kernel_size_1 - 1) * (2 * kernel_size_0 - 1)), attn_stride_3(attn_stride_3), attn_stride_2(attn_stride_2), attn_stride_1(attn_stride_1), @@ -93,14 +98,14 @@ struct RelPosBiasGradient2DBase { __device__ __host__ RelPosBiasGradient2DBase() {} - static LaunchParams get_launch_params(int n_threads) { + static LaunchParams get_launch_params(int32_t n_threads) { dim3 grid(GET_BLOCKS(n_threads, 64)); dim3 block(64); return LaunchParams(grid, block); } }; -template +template struct RelPosBiasGradient2DFull : RelPosBiasGradient2DBase { using Base = RelPosBiasGradient2DBase; using Params = typename Base::Params; @@ -111,35 +116,34 @@ struct RelPosBiasGradient2DFull : RelPosBiasGradient2DBase { __device__ __host__ RelPosBiasGradient2DFull() : Base() {} __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto kernel_size_half_0 = p.kernel_size_0 / 2; + auto kernel_size_half_1 = p.kernel_size_1 / 2; + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.num_threads) { - int indtmp1 = linearIndex / KERNEL_SIZE; - const int kj = linearIndex - indtmp1 * KERNEL_SIZE; - int indtmp2 = indtmp1 / KERNEL_SIZE; - const int ki = indtmp1 - indtmp2 * KERNEL_SIZE; + int32_t indtmp1 = linearIndex / p.kernel_size_1; + auto kj = linearIndex - indtmp1 * p.kernel_size_1; + int32_t indtmp2 = indtmp1 / p.kernel_size_0; + auto ki = indtmp1 - indtmp2 * p.kernel_size_0; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; - const int h = indtmp2; - const int pi = - get_pb_start(i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = - get_pb_start(j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); + auto i = indtmp1 - indtmp2 * p.height; + auto& h = indtmp2; + auto pi = get_pb_start( + i, p.height, p.kernel_size_0, kernel_size_half_0, p.dilation_0); + auto pj = get_pb_start( + j, p.width, p.kernel_size_1, kernel_size_half_1, p.dilation_1); acc_t d_rpb_update = acc_t(0); int64_t attnOffset = h * p.attn_stride_1 + i * p.attn_stride_2 + - j * p.attn_stride_3 + (ki * KERNEL_SIZE + kj); + j * p.attn_stride_3 + (ki * p.kernel_size_1 + kj); #pragma unroll - for (int b = 0; b < p.batch_size; ++b) { + for (int32_t b = 0; b < p.batch_size; ++b) { d_rpb_update += static_cast(p.d_attn[attnOffset]); attnOffset += p.attn_stride_0; } - const int64_t index = + int64_t index = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); at::native::fastAtomicAdd( p.d_bias, index, p.problem_size, d_rpb_update, true); @@ -147,7 +151,7 @@ struct RelPosBiasGradient2DFull : RelPosBiasGradient2DBase { } }; -template +template struct RelPosBiasGradient2DHalf : RelPosBiasGradient2DBase { using Base = RelPosBiasGradient2DBase; using Params = typename Base::Params; @@ -160,35 +164,34 @@ struct RelPosBiasGradient2DHalf : RelPosBiasGradient2DBase { using HalfHelper = typename HalfArray::Base; __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto kernel_size_half_0 = p.kernel_size_0 / 2; + auto kernel_size_half_1 = p.kernel_size_1 / 2; + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.num_threads) { - int indtmp1 = linearIndex / KERNEL_SIZE; - const int kj = linearIndex - indtmp1 * KERNEL_SIZE; - int indtmp2 = indtmp1 / KERNEL_SIZE; - const int ki = indtmp1 - indtmp2 * KERNEL_SIZE; + int32_t indtmp1 = linearIndex / p.kernel_size_1; + auto kj = linearIndex - indtmp1 * p.kernel_size_1; + int32_t indtmp2 = indtmp1 / p.kernel_size_0; + auto ki = indtmp1 - indtmp2 * p.kernel_size_0; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; - const int h = indtmp2; - const int pi = - get_pb_start(i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = - get_pb_start(j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); + auto i = indtmp1 - indtmp2 * p.height; + auto& h = indtmp2; + auto pi = get_pb_start( + i, p.height, p.kernel_size_0, kernel_size_half_0, p.dilation_0); + auto pj = get_pb_start( + j, p.width, p.kernel_size_1, kernel_size_half_1, p.dilation_1); acc_t d_rpb_update = acc_t(0); int64_t attnOffset = h * p.attn_stride_1 + i * p.attn_stride_2 + - j * p.attn_stride_3 + (ki * KERNEL_SIZE + kj); + j * p.attn_stride_3 + (ki * p.kernel_size_1 + kj); #pragma unroll - for (int b = 0; b < p.batch_size; ++b) { + for (int32_t b = 0; b < p.batch_size; ++b) { d_rpb_update += HalfHelper::to_float(p.d_attn[attnOffset]); attnOffset += p.attn_stride_0; } - const int64_t index = + int64_t index = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); at::native::fastAtomicAdd( p.d_bias, index, p.problem_size, d_rpb_update, true); @@ -199,36 +202,39 @@ struct RelPosBiasGradient2DHalf : RelPosBiasGradient2DBase { template struct RelPosBiasGradient2D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DILATION = Args::Dilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using acc_t = typename std::conditional= 4, scalar_t, float>::type; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - RelPosBiasGradient2DFull, - RelPosBiasGradient2DHalf>::type; + RelPosBiasGradient2DFull, + RelPosBiasGradient2DHalf>::type; using Params = typename Kernel::Params; + static_assert( + !CausalMask::Dim0 && !CausalMask::Dim1, + "PN+Bias does not support causal masking."); + void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* d_bias_ptr, void* d_attn_ptr, - int batch_size, - int heads, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, - int kernel_size, - int dilation) { - int num_threads = heads * height * width * kernel_size * kernel_size; - int64_t problem_size = heads * (2 * kernel_size - 1) * (2 * kernel_size - 1); + const std::tuple& kernel_size, + const std::tuple& dilation) { + int32_t num_threads = heads * height * width * natten::flatten(kernel_size); + int64_t problem_size = heads * (2 * std::get<0>(kernel_size) - 1) * + (2 * std::get<1>(kernel_size) - 1); LaunchParams lp = Kernel::Base::get_launch_params(num_threads); auto params = Params( reinterpret_cast(d_bias_ptr), @@ -236,8 +242,10 @@ struct RelPosBiasGradient2D { height, width, heads, - kernel_size, - dilation, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), batch_size, attn_stride_0, attn_stride_1, diff --git a/csrc/include/natten/cuda/naive/rel_pos_bias_3d.cuh b/csrc/include/natten/cuda/naive/rel_pos_bias_3d.cuh index 8a44b79..d72167b 100644 --- a/csrc/include/natten/cuda/naive/rel_pos_bias_3d.cuh +++ b/csrc/include/natten/cuda/naive/rel_pos_bias_3d.cuh @@ -28,6 +28,7 @@ #include #include +#include #include // TODO: We're still using ATen's atomic add! @@ -45,60 +46,62 @@ struct RelPosBiasGradient3DBase { struct Params { acc_t* d_bias; scalar_t* d_attn; - const int depth; - const int height; - const int width; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int depth_kernel_size_in; - const int depth_dilation_in; - const int batch_size; - const int num_threads; - const int64_t problem_size; - const int64_t attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, + int32_t depth; + int32_t height; + int32_t width; + int32_t heads; + int32_t kernel_size_0, kernel_size_1, kernel_size_2; + int32_t dilation_0, dilation_1, dilation_2; + int32_t batch_size; + int32_t num_threads; + int64_t problem_size; + int64_t attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3, attn_stride_4; - const int64_t bias_stride_0, bias_stride_1, bias_stride_2; + int64_t bias_stride_0, bias_stride_1, bias_stride_2; __device__ __host__ Params() {} __device__ __host__ Params( acc_t* d_bias, scalar_t* d_attn, - const int depth, - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int depth_kernel_size_in, - const int depth_dilation_in, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3, - const int64_t attn_stride_4, - const int64_t problem_size, - const int num_threads) + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t kernel_size_2, + int32_t dilation_0, + int32_t dilation_1, + int32_t dilation_2, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3, + int64_t attn_stride_4, + int64_t problem_size, + int32_t num_threads) : d_bias(d_bias), d_attn(d_attn), depth(depth), height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), - depth_kernel_size_in(depth_kernel_size_in), - depth_dilation_in(depth_dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + kernel_size_2(kernel_size_2), + dilation_0(dilation_0), + dilation_1(dilation_1), + dilation_2(dilation_2), batch_size(batch_size), problem_size(problem_size), num_threads(num_threads), - bias_stride_2(2 * kernel_size_in - 1), - bias_stride_1((2 * kernel_size_in - 1) * (2 * kernel_size_in - 1)), + bias_stride_2(2 * kernel_size_2 - 1), + bias_stride_1((2 * kernel_size_1 - 1) * (2 * kernel_size_2 - 1)), bias_stride_0( - (2 * kernel_size_in - 1) * (2 * kernel_size_in - 1) * - (2 * depth_kernel_size_in - 1)), + (2 * kernel_size_0 - 1) * (2 * kernel_size_1 - 1) * + (2 * kernel_size_2 - 1)), attn_stride_4(attn_stride_4), attn_stride_3(attn_stride_3), attn_stride_2(attn_stride_2), @@ -108,22 +111,14 @@ struct RelPosBiasGradient3DBase { __device__ __host__ RelPosBiasGradient3DBase() {} - static LaunchParams get_launch_params(int n_threads) { + static LaunchParams get_launch_params(int32_t n_threads) { dim3 grid(GET_BLOCKS(n_threads, 128)); dim3 block(128); return LaunchParams(grid, block); } }; -template < - typename scalar_t, - typename acc_t, - int KS, - int NS, - int DILATION, - int DKS, - int DNS, - int DDILATION> +template struct RelPosBiasGradient3DFull : RelPosBiasGradient3DBase { using Base = RelPosBiasGradient3DBase; using Params = typename Base::Params; @@ -134,47 +129,45 @@ struct RelPosBiasGradient3DFull : RelPosBiasGradient3DBase { __device__ __host__ RelPosBiasGradient3DFull() : Base() {} __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int KERNEL_SIZE_D = (DKS > 1) ? DKS : p.depth_kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int NEIGHBORHOOD_SIZE_D = (DNS > 0) ? DNS : KERNEL_SIZE_D / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int dilation_d = (DDILATION > 0) ? DDILATION : p.depth_dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto kernel_size_half_0 = p.kernel_size_0 / 2; + auto kernel_size_half_1 = p.kernel_size_1 / 2; + auto kernel_size_half_2 = p.kernel_size_2 / 2; + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.num_threads) { - int indtmp1 = linearIndex / KERNEL_SIZE; - const int kj = linearIndex - indtmp1 * KERNEL_SIZE; - int indtmp2 = indtmp1 / KERNEL_SIZE; - const int ki = indtmp1 - indtmp2 * KERNEL_SIZE; + int32_t indtmp1 = linearIndex / p.kernel_size_2; + auto kj = linearIndex - indtmp1 * p.kernel_size_2; + int32_t indtmp2 = indtmp1 / p.kernel_size_1; + auto ki = indtmp1 - indtmp2 * p.kernel_size_1; indtmp1 = indtmp2; - indtmp2 = indtmp1 / KERNEL_SIZE_D; - const int kk = indtmp1 - indtmp2 * KERNEL_SIZE_D; + indtmp2 = indtmp1 / p.kernel_size_0; + auto kk = indtmp1 - indtmp2 * p.kernel_size_0; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.depth; - const int k = indtmp1 - indtmp2 * p.depth; - const int h = indtmp2; - const int pi = - get_pb_start(i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = - get_pb_start(j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pk = get_pb_start( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); + auto k = indtmp1 - indtmp2 * p.depth; + auto& h = indtmp2; + auto pk = get_pb_start( + k, p.depth, p.kernel_size_0, kernel_size_half_0, p.dilation_0); + auto pi = get_pb_start( + i, p.height, p.kernel_size_1, kernel_size_half_1, p.dilation_1); + auto pj = get_pb_start( + j, p.width, p.kernel_size_2, kernel_size_half_2, p.dilation_2); acc_t d_rpb_update = acc_t(0); int64_t attnOffset = h * p.attn_stride_1 + k * p.attn_stride_2 + i * p.attn_stride_3 + j * p.attn_stride_4 + - ((kk * KERNEL_SIZE * KERNEL_SIZE) + (ki * KERNEL_SIZE) + kj); + ((kk * p.kernel_size_1 * p.kernel_size_2) + (ki * p.kernel_size_2) + + kj); #pragma unroll - for (int b = 0; b < p.batch_size; ++b) { + for (int32_t b = 0; b < p.batch_size; ++b) { d_rpb_update += static_cast(p.d_attn[attnOffset]); attnOffset += p.attn_stride_0; } - const int64_t index = h * p.bias_stride_0 + (pk + kk) * p.bias_stride_1 + + int64_t index = h * p.bias_stride_0 + (pk + kk) * p.bias_stride_1 + (pi + ki) * p.bias_stride_2 + (pj + kj); at::native::fastAtomicAdd( p.d_bias, index, p.problem_size, d_rpb_update, true); @@ -182,15 +175,7 @@ struct RelPosBiasGradient3DFull : RelPosBiasGradient3DBase { } }; -template < - typename scalar_t, - typename acc_t, - int KS, - int NS, - int DILATION, - int DKS, - int DNS, - int DDILATION> +template struct RelPosBiasGradient3DHalf : RelPosBiasGradient3DBase { using Base = RelPosBiasGradient3DBase; using Params = typename Base::Params; @@ -203,47 +188,45 @@ struct RelPosBiasGradient3DHalf : RelPosBiasGradient3DBase { using HalfHelper = typename HalfArray::Base; __device__ void launch(Params p) { - const int KERNEL_SIZE = (KS > 1) ? KS : p.kernel_size_in; - const int KERNEL_SIZE_D = (DKS > 1) ? DKS : p.depth_kernel_size_in; - const int NEIGHBORHOOD_SIZE = (NS > 0) ? NS : KERNEL_SIZE / 2; - const int NEIGHBORHOOD_SIZE_D = (DNS > 0) ? DNS : KERNEL_SIZE_D / 2; - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; - const int dilation_d = (DDILATION > 0) ? DDILATION : p.depth_dilation_in; - const int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; + auto kernel_size_half_0 = p.kernel_size_0 / 2; + auto kernel_size_half_1 = p.kernel_size_1 / 2; + auto kernel_size_half_2 = p.kernel_size_2 / 2; + int64_t linearIndex = blockIdx.x * blockDim.x + threadIdx.x; if (linearIndex < p.num_threads) { - int indtmp1 = linearIndex / KERNEL_SIZE; - const int kj = linearIndex - indtmp1 * KERNEL_SIZE; - int indtmp2 = indtmp1 / KERNEL_SIZE; - const int ki = indtmp1 - indtmp2 * KERNEL_SIZE; + int32_t indtmp1 = linearIndex / p.kernel_size_2; + auto kj = linearIndex - indtmp1 * p.kernel_size_2; + int32_t indtmp2 = indtmp1 / p.kernel_size_1; + auto ki = indtmp1 - indtmp2 * p.kernel_size_1; indtmp1 = indtmp2; - indtmp2 = indtmp1 / KERNEL_SIZE_D; - const int kk = indtmp1 - indtmp2 * KERNEL_SIZE_D; + indtmp2 = indtmp1 / p.kernel_size_0; + auto kk = indtmp1 - indtmp2 * p.kernel_size_0; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.width; - const int j = indtmp1 - indtmp2 * p.width; + auto j = indtmp1 - indtmp2 * p.width; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.height; - const int i = indtmp1 - indtmp2 * p.height; + auto i = indtmp1 - indtmp2 * p.height; indtmp1 = indtmp2; indtmp2 = indtmp1 / p.depth; - const int k = indtmp1 - indtmp2 * p.depth; - const int h = indtmp2; - const int pi = - get_pb_start(i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = - get_pb_start(j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pk = get_pb_start( - k, p.depth, KERNEL_SIZE_D, NEIGHBORHOOD_SIZE_D, dilation_d); + auto k = indtmp1 - indtmp2 * p.depth; + auto& h = indtmp2; + auto pk = get_pb_start( + k, p.depth, p.kernel_size_0, kernel_size_half_0, p.dilation_0); + auto pi = get_pb_start( + i, p.height, p.kernel_size_1, kernel_size_half_1, p.dilation_1); + auto pj = get_pb_start( + j, p.width, p.kernel_size_2, kernel_size_half_2, p.dilation_2); acc_t d_rpb_update = acc_t(0); int64_t attnOffset = h * p.attn_stride_1 + k * p.attn_stride_2 + i * p.attn_stride_3 + j * p.attn_stride_4 + - ((kk * KERNEL_SIZE * KERNEL_SIZE) + (ki * KERNEL_SIZE) + kj); + ((kk * p.kernel_size_1 * p.kernel_size_2) + (ki * p.kernel_size_2) + + kj); #pragma unroll - for (int b = 0; b < p.batch_size; ++b) { + for (int32_t b = 0; b < p.batch_size; ++b) { d_rpb_update += HalfHelper::to_float(p.d_attn[attnOffset]); attnOffset += p.attn_stride_0; } - const int64_t index = h * p.bias_stride_0 + (pk + kk) * p.bias_stride_1 + + int64_t index = h * p.bias_stride_0 + (pk + kk) * p.bias_stride_1 + (pi + ki) * p.bias_stride_2 + (pj + kj); at::native::fastAtomicAdd( p.d_bias, index, p.problem_size, d_rpb_update, true); @@ -254,60 +237,42 @@ struct RelPosBiasGradient3DHalf : RelPosBiasGradient3DBase { template struct RelPosBiasGradient3D { using Args = Args_; - static constexpr int KS = Args::KernelSize; - static constexpr int NS = Args::NeighborhoodSize; - static constexpr int DKS = Args::DepthKernelSize; - static constexpr int DNS = Args::DepthNeighborhoodSize; - static constexpr int DILATION = Args::Dilation; - static constexpr int DDILATION = Args::DepthDilation; using scalar_t = typename Args::Dtype; + using CausalMask = typename Args::CausalMask; using acc_t = typename std::conditional= 4, scalar_t, float>::type; using Kernel = typename std::conditional< sizeof(scalar_t) >= 4, - RelPosBiasGradient3DFull< - scalar_t, - acc_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>, - RelPosBiasGradient3DHalf< - scalar_t, - acc_t, - KS, - NS, - DILATION, - DKS, - DNS, - DDILATION>>::type; + RelPosBiasGradient3DFull, + RelPosBiasGradient3DHalf>::type; using Params = typename Kernel::Params; + static_assert( + !CausalMask::Dim0 && !CausalMask::Dim1 && !CausalMask::Dim2, + "PN+Bias does not support causal masking."); + void operator()( - const int cc, + int32_t cc, cudaStream_t stream, void* d_bias_ptr, void* d_attn_ptr, - int batch_size, - int heads, - int depth, - int height, - int width, - int dim, + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, int64_t attn_stride_0, int64_t attn_stride_1, int64_t attn_stride_2, int64_t attn_stride_3, int64_t attn_stride_4, - int kernel_size, - int kernel_size_depth, - int dilation, - int dilation_depth) { - int num_threads = heads * depth * height * width * kernel_size_depth * - kernel_size * kernel_size; - int64_t problem_size = heads * (2 * kernel_size_depth - 1) * (2 * kernel_size - 1) * (2 * kernel_size - 1); + const std::tuple& kernel_size, + const std::tuple& dilation) { + int32_t num_threads = + heads * depth * height * width * natten::flatten(kernel_size); + int64_t problem_size = heads * (2 * std::get<0>(kernel_size) - 1) * + (2 * std::get<1>(kernel_size) - 1) * (2 * std::get<2>(kernel_size) - 1); LaunchParams lp = Kernel::Base::get_launch_params(num_threads); auto params = Params( reinterpret_cast(d_bias_ptr), @@ -316,10 +281,12 @@ struct RelPosBiasGradient3D { height, width, heads, - kernel_size, - dilation, - kernel_size_depth, - dilation_depth, + std::get<0>(kernel_size), + std::get<1>(kernel_size), + std::get<2>(kernel_size), + std::get<0>(dilation), + std::get<1>(dilation), + std::get<2>(dilation), batch_size, attn_stride_0, attn_stride_1, diff --git a/csrc/include/natten/cuda/naive/tiled/base.cuh b/csrc/include/natten/cuda/naive/tiled/base.cuh index 5ed4ad0..d8e948b 100644 --- a/csrc/include/natten/cuda/naive/tiled/base.cuh +++ b/csrc/include/natten/cuda/naive/tiled/base.cuh @@ -45,46 +45,53 @@ namespace naive { template struct PointwiseNeighborhood2DBase { struct Params { + bool is_grad; scalar_t* query; // query / d_out scalar_t* key; // key / value scalar_t* bias = nullptr; // optional: bias scalar_t* attn; // attn / d_attn - const int height; - const int width; - const int heads; - const int kernel_size_in; - const int dilation_in; - const int dim; - const int batch_size; - const int64_t attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3; - const int64_t query_stride_0, query_stride_1, query_stride_2, query_stride_3; - const int64_t bias_stride_0, bias_stride_1; + int32_t height; + int32_t width; + int32_t heads; + int32_t kernel_size_0, kernel_size_1; + int32_t dilation_0, dilation_1; + int32_t dim; + int32_t batch_size; + int64_t attn_stride_0, attn_stride_1, attn_stride_2, attn_stride_3; + int64_t query_stride_0, query_stride_1, query_stride_2, query_stride_3; + int64_t bias_stride_0, bias_stride_1; __device__ __host__ Params() {} __device__ __host__ Params( + bool is_grad, scalar_t* query, scalar_t* key, scalar_t* attn, - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3) - : query(query), + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3) + : is_grad(is_grad), + query(query), key(key), attn(attn), height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + dilation_0(dilation_0), + dilation_1(dilation_1), dim(dim), batch_size(batch_size), bias_stride_1(0), @@ -104,30 +111,35 @@ struct PointwiseNeighborhood2DBase { scalar_t* key, // value / key scalar_t* bias, // relative positional bias tensor scalar_t* attn, // output / d_query - const int height, - const int width, - const int heads, - const int kernel_size_in, - const int dilation_in, - const int dim, - const int batch_size, - const int64_t attn_stride_0, - const int64_t attn_stride_1, - const int64_t attn_stride_2, - const int64_t attn_stride_3) - : query(query), + int32_t height, + int32_t width, + int32_t heads, + int32_t kernel_size_0, + int32_t kernel_size_1, + int32_t dilation_0, + int32_t dilation_1, + int32_t dim, + int32_t batch_size, + int64_t attn_stride_0, + int64_t attn_stride_1, + int64_t attn_stride_2, + int64_t attn_stride_3) + : is_grad(false), + query(query), key(key), bias(bias), attn(attn), height(height), width(width), heads(heads), - kernel_size_in(kernel_size_in), - dilation_in(dilation_in), + kernel_size_0(kernel_size_0), + kernel_size_1(kernel_size_1), + dilation_0(dilation_0), + dilation_1(dilation_1), dim(dim), batch_size(batch_size), - bias_stride_1(2 * kernel_size_in - 1), - bias_stride_0((2 * kernel_size_in - 1) * (2 * kernel_size_in - 1)), + bias_stride_1(2 * kernel_size_1 - 1), + bias_stride_0((2 * kernel_size_0 - 1) * (2 * kernel_size_1 - 1)), attn_stride_3(attn_stride_3), attn_stride_2(attn_stride_2), attn_stride_1(attn_stride_1), @@ -141,13 +153,14 @@ struct PointwiseNeighborhood2DBase { __device__ __host__ PointwiseNeighborhood2DBase() {} static LaunchParams get_launch_params( - int batch_dim, - int spatial_size, - int attention_span) { - int KERNELTHREADS = + int32_t batch_dim, + int32_t spatial_size, + int32_t attention_span) { + int32_t KERNELTHREADS = min(CUDA_NUM_THREADS, attention_span /* == kernel_size^2 */); - int PIXELTHREADS = min(int(CUDA_NUM_THREADS / KERNELTHREADS), spatial_size); - int BATCHTHREADS = + int32_t PIXELTHREADS = + min(int32_t(CUDA_NUM_THREADS / KERNELTHREADS), spatial_size); + int32_t BATCHTHREADS = min(64, max(1, CUDA_NUM_THREADS / (PIXELTHREADS * KERNELTHREADS))); dim3 grid( (spatial_size + PIXELTHREADS - 1) / PIXELTHREADS, diff --git a/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_11x11_13x13.cuh b/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_11x11_13x13.cuh index 9add001..1d83382 100644 --- a/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_11x11_13x13.cuh +++ b/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_11x11_13x13.cuh @@ -53,16 +53,15 @@ namespace naive { template < typename scalar_t, typename memscalar_t, - int TILEX, - int TILEY, - int KTILEX, - int KTILEY, - int XTHREADS, - int YTHREADS, - int BATCHTHREADS, - int KERNEL_SIZE, - int NEIGHBORHOOD_SIZE, - int DILATION> + int32_t TILEX, + int32_t TILEY, + int32_t KTILEX, + int32_t KTILEY, + int32_t XTHREADS, + int32_t YTHREADS, + int32_t BATCHTHREADS, + int32_t KERNEL_SIZE, + int32_t NEIGHBORHOOD_SIZE> struct PointwiseNeighborhood2DFull11x11_13x13 : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; @@ -73,40 +72,37 @@ struct PointwiseNeighborhood2DFull11x11_13x13 __device__ __host__ PointwiseNeighborhood2DFull11x11_13x13() : Base() {} - static __host__ int get_dim(int dim) { - return 32; - } - __device__ void launch(Params p) { - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; // Because batch heads have stride 1 per threadblock, we can just use // blockIdx since blockDim will be 1 and threadIdx will always be 0. const - // int z = blockIdx.z * blockDim.z + threadIdx.z; - const int z = blockIdx.z; - const int b = z / p.heads; - const int h = z - b * p.heads; + // int32_t z = blockIdx.z * blockDim.z + threadIdx.z; + // TODO: remove when/if tiled kernels allow varying dilations + auto dilation = p.dilation_0; + int32_t z = blockIdx.z; + int32_t b = z / p.heads; + int32_t h = z - b * p.heads; // Not needed again because it will always be true. // if (z < batch_size * heads) // { - const int lti = threadIdx.y * (TILEY * KERNEL_SIZE) + threadIdx.x; - const int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; - const int si = int(blockIdx.y / dilation) * (TILEX * dilation) + + int32_t lti = threadIdx.y * (TILEY * KERNEL_SIZE) + threadIdx.x; + int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; + int32_t si = int32_t(blockIdx.y / dilation) * (TILEX * dilation) + (blockIdx.y % dilation); - const int sj = int(blockIdx.x / dilation) * (TILEY * dilation) + + int32_t sj = int32_t(blockIdx.x / dilation) * (TILEY * dilation) + (blockIdx.x % dilation); - const int sni = get_window_start( + int32_t sni = get_window_start( si, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int snj = + int32_t snj = get_window_start(sj, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); __shared__ memscalar_t tile[TILEX * TILEY][DIM_32 + 3]; __shared__ memscalar_t kTile[KTILEX * KTILEY][DIM_32 + 3]; /* query tile */ - const int qtx = lti / DIM_32; - const int qty = lti - qtx * DIM_32; + int32_t qtx = lti / DIM_32; + int32_t qty = lti - qtx * DIM_32; if (qtx < TILEX * TILEY) { - int qi = qtx / TILEY; - const int qj = (qtx - qi * TILEY) * dilation + sj; + int32_t qi = qtx / TILEY; + int32_t qj = (qtx - qi * TILEY) * dilation + sj; qi = qi * dilation + si; if (qi < p.height && qj < p.width) tile[qtx][qty] = p.query @@ -114,48 +110,48 @@ struct PointwiseNeighborhood2DFull11x11_13x13 qj * p.query_stride_3 + qty]; } /* key tile */ - const int ktx = lti / KSTRIDE_32; - const int kty = (lti - ktx * KSTRIDE_32) * KITERS_32; + int32_t ktx = lti / KSTRIDE_32; + int32_t kty = (lti - ktx * KSTRIDE_32) * KITERS_32; if (ktx < KTILEX * KTILEY) { - int bi = ktx / KTILEY; - const int bj = (ktx - bi * KTILEY) * dilation + snj; + int32_t bi = ktx / KTILEY; + int32_t bj = (ktx - bi * KTILEY) * dilation + snj; bi = bi * dilation + sni; if (bi < p.height && bj < p.width) { - const int64_t keyOffset = batchHeadOffset + bi * p.query_stride_2 + + int64_t keyOffset = batchHeadOffset + bi * p.query_stride_2 + bj * p.query_stride_3 + kty; #pragma unroll - for (int ti = 0; ti < KITERS_32; ++ti) + for (int32_t ti = 0; ti < KITERS_32; ++ti) kTile[ktx][kty + ti] = p.key[keyOffset + ti]; } } __syncthreads(); - const int ii = threadIdx.y / KERNEL_SIZE; - const int ki = threadIdx.y - ii * KERNEL_SIZE; - const int jj = threadIdx.x / KERNEL_SIZE; - const int kj = threadIdx.x - jj * KERNEL_SIZE; - const int i = si + ii * dilation, j = sj + jj * dilation; + int32_t ii = threadIdx.y / KERNEL_SIZE; + int32_t ki = threadIdx.y - ii * KERNEL_SIZE; + int32_t jj = threadIdx.x / KERNEL_SIZE; + int32_t kj = threadIdx.x - jj * KERNEL_SIZE; + int32_t i = si + ii * dilation, j = sj + jj * dilation; if (i < p.height && j < p.width) { - const int ni = get_window_start( + int32_t ni = get_window_start( i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( + int32_t nj = get_window_start( j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); scalar_t updt = scalar_t(0); - const int queryIdx = ii * TILEY + jj; - const int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILEY + - int((nj + kj * dilation - snj) / dilation); + int32_t queryIdx = ii * TILEY + jj; + int32_t keyIdx = int32_t((ni + ki * dilation - sni) / dilation) * KTILEY + + int32_t((nj + kj * dilation - snj) / dilation); #pragma unroll - for (int dimOffset = 0; dimOffset < DIM_32; ++dimOffset) + for (int32_t dimOffset = 0; dimOffset < DIM_32; ++dimOffset) updt += tile[queryIdx][dimOffset] * kTile[keyIdx][dimOffset]; - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + j * p.attn_stride_3 + ki * KERNEL_SIZE + kj; if (p.bias) { - const int pi = + int32_t pi = get_pb_start(i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = + int32_t pj = get_pb_start(j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t biasIndex = + int64_t biasIndex = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); updt += p.bias[biasIndex]; } @@ -165,13 +161,13 @@ struct PointwiseNeighborhood2DFull11x11_13x13 } static LaunchParams get_launch_params( - int batch_dim, - int height, - int width, - int attention_span, - int dilation) { - int xsize = width * KERNEL_SIZE; - int ysize = height * KERNEL_SIZE; + int32_t batch_dim, + int32_t height, + int32_t width, + int32_t attention_span, + int32_t dilation) { + int32_t xsize = width * KERNEL_SIZE; + int32_t ysize = height * KERNEL_SIZE; const dim3 grid( (xsize + XTHREADS * dilation - 1) / XTHREADS, (ysize + YTHREADS * dilation - 1) / YTHREADS, @@ -184,16 +180,15 @@ struct PointwiseNeighborhood2DFull11x11_13x13 template < typename scalar_t, typename memscalar_t, - int TILEX, - int TILEY, - int KTILEX, - int KTILEY, - int XTHREADS, - int YTHREADS, - int BATCHTHREADS, - int KERNEL_SIZE, - int NEIGHBORHOOD_SIZE, - int DILATION> + int32_t TILEX, + int32_t TILEY, + int32_t KTILEX, + int32_t KTILEY, + int32_t XTHREADS, + int32_t YTHREADS, + int32_t BATCHTHREADS, + int32_t KERNEL_SIZE, + int32_t NEIGHBORHOOD_SIZE> struct PointwiseNeighborhood2DHalf11x11_13x13 : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; @@ -207,31 +202,28 @@ struct PointwiseNeighborhood2DHalf11x11_13x13 using HalfHelper = typename HalfArray::Base; using HalfType = typename HalfHelper::ElementVector; - static __host__ int get_dim(int dim) { - return 16; - } - __device__ void launch(Params p) { - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; // Because batch heads have stride 1 per threadblock, we can just use // blockIdx since blockDim will be 1 and threadIdx will always be 0. const - // int z = blockIdx.z * blockDim.z + threadIdx.z; - const int z = blockIdx.z; - const int b = z / p.heads; - const int h = z - b * p.heads; + // int32_t z = blockIdx.z * blockDim.z + threadIdx.z; + // TODO: remove when/if tiled kernels allow varying dilations + auto dilation = p.dilation_0; + int32_t z = blockIdx.z; + int32_t b = z / p.heads; + int32_t h = z - b * p.heads; // Not needed again because it will always be true. // if (z < batch_size * heads) // { - const int lti = threadIdx.y * (TILEY * KERNEL_SIZE) + threadIdx.x; - const int stride2 = DIMHALF_32 * p.width; - const int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; - const int si = int(blockIdx.y / dilation) * (TILEX * dilation) + + int32_t lti = threadIdx.y * (TILEY * KERNEL_SIZE) + threadIdx.x; + int32_t stride2 = DIMHALF_32 * p.width; + int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; + int32_t si = int32_t(blockIdx.y / dilation) * (TILEX * dilation) + (blockIdx.y % dilation); - const int sj = int(blockIdx.x / dilation) * (TILEY * dilation) + + int32_t sj = int32_t(blockIdx.x / dilation) * (TILEY * dilation) + (blockIdx.x % dilation); - const int sni = get_window_start( + int32_t sni = get_window_start( si, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int snj = + int32_t snj = get_window_start(sj, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); __shared__ HalfType tile[TILEX * TILEY][DIM_32 + 3]; __shared__ HalfType kTile[KTILEX * KTILEY][DIM_32 + 3]; @@ -239,68 +231,68 @@ struct PointwiseNeighborhood2DHalf11x11_13x13 auto key2 = HalfHelper::typecast(p.key); /* query tile */ - const int qtx = lti / DIM_32; - const int qtyp = lti - qtx * DIM_32; - const int qdi = qtyp / KHALFITERS_32; - const int qdj = qtyp - qdi * KHALFITERS_32; - const int qty = qdi * KITERS_32 + qdj; + int32_t qtx = lti / DIM_32; + int32_t qtyp = lti - qtx * DIM_32; + int32_t qdi = qtyp / KHALFITERS_32; + int32_t qdj = qtyp - qdi * KHALFITERS_32; + int32_t qty = qdi * KITERS_32 + qdj; if (qtx < TILEX * TILEY && qtyp < DIMHALF_32) { - int qi = qtx / TILEY; - const int qj = (qtx - qi * TILEY) * dilation + sj; + int32_t qi = qtx / TILEY; + int32_t qj = (qtx - qi * TILEY) * dilation + sj; qi = qi * dilation + si; if (qi < p.height && qj < p.width) tile[qtx][qty] = query2[batchHeadOffset + qi * stride2 + qj * DIMHALF_32 + qtyp]; } /* key tile */ - const int ktx = lti / KSTRIDE_32; - const int kty = (lti - ktx * KSTRIDE_32) * KHALFITERS_32; + int32_t ktx = lti / KSTRIDE_32; + int32_t kty = (lti - ktx * KSTRIDE_32) * KHALFITERS_32; if (ktx < KTILEX * KTILEY) { - int bi = ktx / KTILEY; - const int bj = (ktx - bi * KTILEY) * dilation + snj; + int32_t bi = ktx / KTILEY; + int32_t bj = (ktx - bi * KTILEY) * dilation + snj; bi = bi * dilation + sni; if (bi < p.height && bj < p.width) { - const int64_t keyOffset = + int64_t keyOffset = batchHeadOffset + bi * stride2 + bj * DIMHALF_32 + kty; #pragma unroll - for (int ti = 0; ti < KHALFITERS_32; ++ti) + for (int32_t ti = 0; ti < KHALFITERS_32; ++ti) kTile[ktx][kty * 2 + ti] = key2[keyOffset + ti]; } } __syncthreads(); - const int ii = threadIdx.y / KERNEL_SIZE; - const int ki = threadIdx.y - ii * KERNEL_SIZE; - const int jj = threadIdx.x / KERNEL_SIZE; - const int kj = threadIdx.x - jj * KERNEL_SIZE; - const int i = si + ii * dilation, j = sj + jj * dilation; + int32_t ii = threadIdx.y / KERNEL_SIZE; + int32_t ki = threadIdx.y - ii * KERNEL_SIZE; + int32_t jj = threadIdx.x / KERNEL_SIZE; + int32_t kj = threadIdx.x - jj * KERNEL_SIZE; + int32_t i = si + ii * dilation, j = sj + jj * dilation; if (i < p.height && j < p.width) { - const int ni = get_window_start( + int32_t ni = get_window_start( i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( + int32_t nj = get_window_start( j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - auto updt = HalfHelper::zero(); - const int queryIdx = ii * TILEY + jj; - const int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILEY + - int((nj + kj * dilation - snj) / dilation); + auto updt = HalfHelper::zeros(); + int32_t queryIdx = ii * TILEY + jj; + int32_t keyIdx = int32_t((ni + ki * dilation - sni) / dilation) * KTILEY + + int32_t((nj + kj * dilation - snj) / dilation); #pragma unroll - for (int di = 0; di < KSTRIDE_32; ++di) + for (int32_t di = 0; di < KSTRIDE_32; ++di) #pragma unroll - for (int dj = 0; dj < KHALFITERS_32; ++dj) + for (int32_t dj = 0; dj < KHALFITERS_32; ++dj) updt = HalfHelper::fma( tile[queryIdx][di * KITERS_32 + dj], kTile[keyIdx][di * KITERS_32 + dj], updt); - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + j * p.attn_stride_3 + ki * KERNEL_SIZE + kj; scalar_t acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); if (p.bias) { - const int pi = + int32_t pi = get_pb_start(i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = + int32_t pj = get_pb_start(j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t biasIndex = + int64_t biasIndex = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); acc = HalfHelper::add(acc, p.bias[biasIndex]); } @@ -310,13 +302,13 @@ struct PointwiseNeighborhood2DHalf11x11_13x13 } static LaunchParams get_launch_params( - int batch_dim, - int height, - int width, - int attention_span, - int dilation) { - int xsize = width * KERNEL_SIZE; - int ysize = height * KERNEL_SIZE; + int32_t batch_dim, + int32_t height, + int32_t width, + int32_t attention_span, + int32_t dilation) { + int32_t xsize = width * KERNEL_SIZE; + int32_t ysize = height * KERNEL_SIZE; const dim3 grid( (xsize + XTHREADS * dilation - 1) / XTHREADS, (ysize + YTHREADS * dilation - 1) / YTHREADS, @@ -326,7 +318,7 @@ struct PointwiseNeighborhood2DHalf11x11_13x13 } }; -template +template struct PointwiseNeighborhood2DFull11x11 : PointwiseNeighborhood2DFull11x11_13x13< scalar_t, @@ -339,8 +331,7 @@ struct PointwiseNeighborhood2DFull11x11 YTHREADS_11, BATCHTHREADS_11, 11, - 5, - DILATION> { + 5> { using Base = PointwiseNeighborhood2DFull11x11_13x13< scalar_t, scalar_t, @@ -352,13 +343,12 @@ struct PointwiseNeighborhood2DFull11x11 YTHREADS_11, BATCHTHREADS_11, 11, - 5, - DILATION>; + 5>; __device__ __host__ PointwiseNeighborhood2DFull11x11() : Base() {} }; -template +template struct PointwiseNeighborhood2DHalf11x11 : PointwiseNeighborhood2DHalf11x11_13x13< scalar_t, @@ -371,8 +361,7 @@ struct PointwiseNeighborhood2DHalf11x11 YTHREADS_11, BATCHTHREADS_11, 11, - 5, - DILATION> { + 5> { using Base = PointwiseNeighborhood2DHalf11x11_13x13< scalar_t, scalar_t, @@ -384,13 +373,12 @@ struct PointwiseNeighborhood2DHalf11x11 YTHREADS_11, BATCHTHREADS_11, 11, - 5, - DILATION>; + 5>; __device__ __host__ PointwiseNeighborhood2DHalf11x11() : Base() {} }; -template +template struct PointwiseNeighborhood2DFull13x13 : PointwiseNeighborhood2DFull11x11_13x13< scalar_t, @@ -403,8 +391,7 @@ struct PointwiseNeighborhood2DFull13x13 YTHREADS_13, BATCHTHREADS_13, 13, - 6, - DILATION> { + 6> { using Base = PointwiseNeighborhood2DFull11x11_13x13< scalar_t, float, @@ -416,13 +403,12 @@ struct PointwiseNeighborhood2DFull13x13 YTHREADS_13, BATCHTHREADS_13, 13, - 6, - DILATION>; + 6>; __device__ __host__ PointwiseNeighborhood2DFull13x13() : Base() {} }; -template +template struct PointwiseNeighborhood2DHalf13x13 : PointwiseNeighborhood2DHalf11x11_13x13< scalar_t, @@ -435,8 +421,7 @@ struct PointwiseNeighborhood2DHalf13x13 YTHREADS_13, BATCHTHREADS_13, 13, - 6, - DILATION> { + 6> { using Base = PointwiseNeighborhood2DHalf11x11_13x13< scalar_t, float, @@ -448,8 +433,7 @@ struct PointwiseNeighborhood2DHalf13x13 YTHREADS_13, BATCHTHREADS_13, 13, - 6, - DILATION>; + 6>; __device__ __host__ PointwiseNeighborhood2DHalf13x13() : Base() {} }; diff --git a/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_3x3.cuh b/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_3x3.cuh index b044470..089763b 100644 --- a/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_3x3.cuh +++ b/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_3x3.cuh @@ -50,7 +50,7 @@ namespace naive { /////////////////////////////////////////////////////////////////////////////// /////////////// 3x3 -template +template struct PointwiseNeighborhood2DFull3x3 : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; using Params = typename Base::Params; @@ -60,92 +60,90 @@ struct PointwiseNeighborhood2DFull3x3 : PointwiseNeighborhood2DBase { __device__ __host__ PointwiseNeighborhood2DFull3x3() : Base() {} - static __host__ int get_dim(int dim) { - return 32; - } - __device__ void launch(Params p) { - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; // Because batch heads have stride 1 per threadblock, we can just use // blockIdx since blockDim will be 1 and threadIdx will always be 0. const - // int z = blockIdx.z * blockDim.z + threadIdx.z; - const int z = blockIdx.z; - const int b = z / p.heads; - const int h = z - b * p.heads; + // int32_t z = blockIdx.z * blockDim.z + threadIdx.z; + // TODO: remove when/if tiled kernels allow varying dilations + auto dilation = p.dilation_0; + int32_t z = blockIdx.z; + int32_t b = z / p.heads; + int32_t h = z - b * p.heads; // Not needed again because it will always be true. // if (z < batch_size * heads) // { - const int lti = threadIdx.y * (TILE_3 * KERNEL_SIZE_3) + threadIdx.x; - const int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; - const int si = int(blockIdx.y / dilation) * (TILE_3 * dilation) + + int32_t lti = threadIdx.y * (TILE_3 * KERNEL_SIZE_3) + threadIdx.x; + int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; + int32_t si = int32_t(blockIdx.y / dilation) * (TILE_3 * dilation) + (blockIdx.y % dilation); - const int sj = int(blockIdx.x / dilation) * (TILE_3 * dilation) + + int32_t sj = int32_t(blockIdx.x / dilation) * (TILE_3 * dilation) + (blockIdx.x % dilation); - const int sni = get_window_start( + int32_t sni = get_window_start( si, p.height, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); - const int snj = get_window_start( + int32_t snj = get_window_start( sj, p.width, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); __shared__ scalar_t tile[TILE_3 * TILE_3][DIM_32 + 3]; __shared__ scalar_t kTile[KTILE_3 * KTILE_3][DIM_32 + 3]; /* query tile */ - const int qtx = lti / QSTRIDE_3; - const int qty = (lti - qtx * QSTRIDE_3) * QITERS_3; + int32_t qtx = lti / QSTRIDE_3; + int32_t qty = (lti - qtx * QSTRIDE_3) * QITERS_3; if (qtx < TILE_3 * TILE_3) { - int qi = qtx / TILE_3; - const int qj = (qtx - qi * TILE_3) * dilation + sj; + int32_t qi = qtx / TILE_3; + int32_t qj = (qtx - qi * TILE_3) * dilation + sj; qi = qi * dilation + si; if (qi < p.height && qj < p.width) { #pragma unroll - for (int ti = 0; ti < QITERS_3; ++ti) + for (int32_t ti = 0; ti < QITERS_3; ++ti) tile[qtx][qty + ti] = p.query [batchHeadOffset + qi * p.query_stride_2 + qj * p.query_stride_3 + qty + ti]; } } /* key tile */ - const int ktx = lti / KSTRIDE_32; - const int kty = (lti - ktx * KSTRIDE_32) * KITERS_32; + int32_t ktx = lti / KSTRIDE_32; + int32_t kty = (lti - ktx * KSTRIDE_32) * KITERS_32; if (ktx < KTILE_3 * KTILE_3) { - int bi = ktx / KTILE_3; - const int bj = (ktx - bi * KTILE_3) * dilation + snj; + int32_t bi = ktx / KTILE_3; + int32_t bj = (ktx - bi * KTILE_3) * dilation + snj; bi = bi * dilation + sni; if (bi < p.height && bj < p.width) { - const int64_t keyOffset = batchHeadOffset + bi * p.query_stride_2 + + int64_t keyOffset = batchHeadOffset + bi * p.query_stride_2 + bj * p.query_stride_3 + kty; #pragma unroll - for (int ti = 0; ti < KITERS_32; ++ti) + for (int32_t ti = 0; ti < KITERS_32; ++ti) kTile[ktx][kty + ti] = p.key[keyOffset + ti]; } } __syncthreads(); - const int ii = threadIdx.y / KERNEL_SIZE_3; - const int ki = threadIdx.y - ii * KERNEL_SIZE_3; - const int jj = threadIdx.x / KERNEL_SIZE_3; - const int kj = threadIdx.x - jj * KERNEL_SIZE_3; - const int i = si + ii * dilation, j = sj + jj * dilation; + int32_t ii = threadIdx.y / KERNEL_SIZE_3; + int32_t ki = threadIdx.y - ii * KERNEL_SIZE_3; + int32_t jj = threadIdx.x / KERNEL_SIZE_3; + int32_t kj = threadIdx.x - jj * KERNEL_SIZE_3; + int32_t i = si + ii * dilation, j = sj + jj * dilation; if (i < p.height && j < p.width) { - const int ni = get_window_start( + int32_t ni = get_window_start( i, p.height, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); - const int nj = get_window_start( + int32_t nj = get_window_start( j, p.width, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); scalar_t updt = scalar_t(0); - const int queryIdx = ii * TILE_3 + jj; - const int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILE_3 + - int((nj + kj * dilation - snj) / dilation); + int32_t queryIdx = ii * TILE_3 + jj; + int32_t keyIdx = + int32_t((ni + ki * dilation - sni) / dilation) * KTILE_3 + + int32_t((nj + kj * dilation - snj) / dilation); #pragma unroll - for (int dimOffset = 0; dimOffset < DIM_32; ++dimOffset) + for (int32_t dimOffset = 0; dimOffset < DIM_32; ++dimOffset) updt += tile[queryIdx][dimOffset] * kTile[keyIdx][dimOffset]; - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + j * p.attn_stride_3 + ki * KERNEL_SIZE_3 + kj; if (p.bias) { - const int pi = get_pb_start( + int32_t pi = get_pb_start( i, p.height, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); - const int pj = get_pb_start( + int32_t pj = get_pb_start( j, p.width, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); - const int64_t biasIndex = + int64_t biasIndex = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); updt += p.bias[biasIndex]; } @@ -155,16 +153,16 @@ struct PointwiseNeighborhood2DFull3x3 : PointwiseNeighborhood2DBase { } static LaunchParams get_launch_params( - int batch_dim, - int height, - int width, - int attention_span, - int dilation) { - int xsize = width * KERNEL_SIZE_3; - int ysize = height * KERNEL_SIZE_3; - int XTHREADS = XYTHREADS_3; - int YTHREADS = XYTHREADS_3; - int BATCHTHREADS = BATCHTHREADS_3; + int32_t batch_dim, + int32_t height, + int32_t width, + int32_t attention_span, + int32_t dilation) { + int32_t xsize = width * KERNEL_SIZE_3; + int32_t ysize = height * KERNEL_SIZE_3; + int32_t XTHREADS = XYTHREADS_3; + int32_t YTHREADS = XYTHREADS_3; + int32_t BATCHTHREADS = BATCHTHREADS_3; const dim3 grid( (xsize + XTHREADS * dilation - 1) / XTHREADS, (ysize + YTHREADS * dilation - 1) / YTHREADS, @@ -174,7 +172,7 @@ struct PointwiseNeighborhood2DFull3x3 : PointwiseNeighborhood2DBase { } }; -template +template struct PointwiseNeighborhood2DHalf3x3 : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; using Params = typename Base::Params; @@ -187,31 +185,28 @@ struct PointwiseNeighborhood2DHalf3x3 : PointwiseNeighborhood2DBase { using HalfHelper = typename HalfArray::Base; using HalfType = typename HalfHelper::ElementVector; - static __host__ int get_dim(int dim) { - return 16; - } - __device__ void launch(Params p) { - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; // Because batch heads have stride 1 per threadblock, we can just use // blockIdx since blockDim will be 1 and threadIdx will always be 0. const - // int z = blockIdx.z * blockDim.z + threadIdx.z; - const int z = blockIdx.z; - const int b = z / p.heads; - const int h = z - b * p.heads; + // int32_t z = blockIdx.z * blockDim.z + threadIdx.z; + // TODO: remove when/if tiled kernels allow varying dilations + auto dilation = p.dilation_0; + int32_t z = blockIdx.z; + int32_t b = z / p.heads; + int32_t h = z - b * p.heads; // Not needed again because it will always be true. // if (z < batch_size * heads) // { - const int lti = threadIdx.y * (TILE_3 * KERNEL_SIZE_3) + threadIdx.x; - const int stride2 = DIMHALF_32 * p.width; - const int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; - const int si = int(blockIdx.y / dilation) * (TILE_3 * dilation) + + int32_t lti = threadIdx.y * (TILE_3 * KERNEL_SIZE_3) + threadIdx.x; + int32_t stride2 = DIMHALF_32 * p.width; + int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; + int32_t si = int32_t(blockIdx.y / dilation) * (TILE_3 * dilation) + (blockIdx.y % dilation); - const int sj = int(blockIdx.x / dilation) * (TILE_3 * dilation) + + int32_t sj = int32_t(blockIdx.x / dilation) * (TILE_3 * dilation) + (blockIdx.x % dilation); - const int sni = get_window_start( + int32_t sni = get_window_start( si, p.height, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); - const int snj = get_window_start( + int32_t snj = get_window_start( sj, p.width, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); __shared__ HalfType tile[TILE_3 * TILE_3][DIM_32 + 3]; __shared__ HalfType kTile[KTILE_3 * KTILE_3][DIM_32 + 3]; @@ -219,64 +214,65 @@ struct PointwiseNeighborhood2DHalf3x3 : PointwiseNeighborhood2DBase { auto key2 = HalfHelper::typecast(p.key); /* query tile */ - const int qtx = lti / QSTRIDE_3_HALF; - const int qty = (lti - qtx * QSTRIDE_3_HALF) * QITERS_3_HALF; + int32_t qtx = lti / QSTRIDE_3_HALF; + int32_t qty = (lti - qtx * QSTRIDE_3_HALF) * QITERS_3_HALF; if (qtx < TILE_3 * TILE_3) { - int qi = qtx / TILE_3; - const int qj = (qtx - qi * TILE_3) * dilation + sj; + int32_t qi = qtx / TILE_3; + int32_t qj = (qtx - qi * TILE_3) * dilation + sj; qi = qi * dilation + si; if (qi < p.height && qj < p.width) { #pragma unroll - for (int ti = 0; ti < QITERS_3_HALF; ++ti) + for (int32_t ti = 0; ti < QITERS_3_HALF; ++ti) tile[qtx][qty + ti] = query2 [batchHeadOffset + qi * stride2 + qj * DIMHALF_32 + qty + ti]; } } /* key tile */ - const int ktx = lti / KSTRIDE_32; - const int kty = (lti - ktx * KSTRIDE_32) * KHALFITERS_32; + int32_t ktx = lti / KSTRIDE_32; + int32_t kty = (lti - ktx * KSTRIDE_32) * KHALFITERS_32; if (ktx < KTILE_3 * KTILE_3) { - int bi = ktx / KTILE_3; - const int bj = (ktx - bi * KTILE_3) * dilation + snj; + int32_t bi = ktx / KTILE_3; + int32_t bj = (ktx - bi * KTILE_3) * dilation + snj; bi = bi * dilation + sni; if (bi < p.height && bj < p.width) { - const int64_t keyOffset = + int64_t keyOffset = batchHeadOffset + bi * stride2 + bj * DIMHALF_32 + kty; #pragma unroll - for (int ti = 0; ti < KHALFITERS_32; ++ti) + for (int32_t ti = 0; ti < KHALFITERS_32; ++ti) kTile[ktx][kty + ti] = key2[keyOffset + ti]; } } __syncthreads(); - const int ii = threadIdx.y / KERNEL_SIZE_3; - const int ki = threadIdx.y - ii * KERNEL_SIZE_3; - const int jj = threadIdx.x / KERNEL_SIZE_3; - const int kj = threadIdx.x - jj * KERNEL_SIZE_3; - const int i = si + ii * dilation, j = sj + jj * dilation; + int32_t ii = threadIdx.y / KERNEL_SIZE_3; + int32_t ki = threadIdx.y - ii * KERNEL_SIZE_3; + int32_t jj = threadIdx.x / KERNEL_SIZE_3; + int32_t kj = threadIdx.x - jj * KERNEL_SIZE_3; + int32_t i = si + ii * dilation, j = sj + jj * dilation; if (i < p.height && j < p.width) { - const int ni = get_window_start( + int32_t ni = get_window_start( i, p.height, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); - const int nj = get_window_start( + int32_t nj = get_window_start( j, p.width, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); - auto updt = HalfHelper::zero(); - const int queryIdx = ii * TILE_3 + jj; - const int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILE_3 + - int((nj + kj * dilation - snj) / dilation); + auto updt = HalfHelper::zeros(); + int32_t queryIdx = ii * TILE_3 + jj; + int32_t keyIdx = + int32_t((ni + ki * dilation - sni) / dilation) * KTILE_3 + + int32_t((nj + kj * dilation - snj) / dilation); #pragma unroll - for (int dimOffset = 0; dimOffset < DIMHALF_32; ++dimOffset) + for (int32_t dimOffset = 0; dimOffset < DIMHALF_32; ++dimOffset) updt = HalfHelper::fma( tile[queryIdx][dimOffset], kTile[keyIdx][dimOffset], updt); - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + j * p.attn_stride_3 + ki * KERNEL_SIZE_3 + kj; scalar_t acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); if (p.bias) { - const int pi = get_pb_start( + int32_t pi = get_pb_start( i, p.height, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); - const int pj = get_pb_start( + int32_t pj = get_pb_start( j, p.width, KERNEL_SIZE_3, NEIGHBORHOOD_SIZE_3, dilation); - const int64_t biasIndex = + int64_t biasIndex = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); acc = HalfHelper::add(acc, p.bias[biasIndex]); } @@ -286,16 +282,16 @@ struct PointwiseNeighborhood2DHalf3x3 : PointwiseNeighborhood2DBase { } static LaunchParams get_launch_params( - int batch_dim, - int height, - int width, - int attention_span, - int dilation) { - int xsize = width * KERNEL_SIZE_3; - int ysize = height * KERNEL_SIZE_3; - int XTHREADS = XYTHREADS_3; - int YTHREADS = XYTHREADS_3; - int BATCHTHREADS = BATCHTHREADS_3; + int32_t batch_dim, + int32_t height, + int32_t width, + int32_t attention_span, + int32_t dilation) { + int32_t xsize = width * KERNEL_SIZE_3; + int32_t ysize = height * KERNEL_SIZE_3; + int32_t XTHREADS = XYTHREADS_3; + int32_t YTHREADS = XYTHREADS_3; + int32_t BATCHTHREADS = BATCHTHREADS_3; const dim3 grid( (xsize + XTHREADS * dilation - 1) / XTHREADS, (ysize + YTHREADS * dilation - 1) / YTHREADS, diff --git a/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_5x5.cuh b/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_5x5.cuh index 3063bec..8a3a63d 100644 --- a/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_5x5.cuh +++ b/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_5x5.cuh @@ -50,7 +50,7 @@ namespace naive { /////////////////////////////////////////////////////////////////////////////// /////////////// 5x5 -template +template struct PointwiseNeighborhood2DFull5x5 : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; using Params = typename Base::Params; @@ -60,40 +60,37 @@ struct PointwiseNeighborhood2DFull5x5 : PointwiseNeighborhood2DBase { __device__ __host__ PointwiseNeighborhood2DFull5x5() : Base() {} - static __host__ int get_dim(int dim) { - return 32; - } - __device__ void launch(Params p) { - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; // Because batch heads have stride 1 per threadblock, we can just use // blockIdx since blockDim will be 1 and threadIdx will always be 0. const // int z = blockIdx.z * blockDim.z + threadIdx.z; - const int z = blockIdx.z; - const int b = z / p.heads; - const int h = z - b * p.heads; + // TODO: remove when/if tiled kernels allow varying dilations + auto dilation = p.dilation_0; + int z = blockIdx.z; + int b = z / p.heads; + int h = z - b * p.heads; // Not needed again because it will always be true. // if (z < batch_size * heads) // { - const int lti = threadIdx.y * (TILE_5 * KERNEL_SIZE_5) + threadIdx.x; - const int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; - const int si = int(blockIdx.y / dilation) * (TILE_5 * dilation) + + int lti = threadIdx.y * (TILE_5 * KERNEL_SIZE_5) + threadIdx.x; + int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; + int si = int(blockIdx.y / dilation) * (TILE_5 * dilation) + (blockIdx.y % dilation); - const int sj = int(blockIdx.x / dilation) * (TILE_5 * dilation) + + int sj = int(blockIdx.x / dilation) * (TILE_5 * dilation) + (blockIdx.x % dilation); - const int sni = get_window_start( + int sni = get_window_start( si, p.height, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); - const int snj = get_window_start( + int snj = get_window_start( sj, p.width, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); __shared__ scalar_t tile[TILE_5 * TILE_5][DIM_32 + 3]; __shared__ scalar_t kTile[KTILE_5 * KTILE_5][DIM_32 + 3]; /* query tile */ - const int qtx = lti / QSTRIDE_5; - const int qty = (lti - qtx * QSTRIDE_5) * QITERS_5; + int qtx = lti / QSTRIDE_5; + int qty = (lti - qtx * QSTRIDE_5) * QITERS_5; if (qtx < TILE_5 * TILE_5) { int qi = qtx / TILE_5; - const int qj = (qtx - qi * TILE_5) * dilation + sj; + int qj = (qtx - qi * TILE_5) * dilation + sj; qi = qi * dilation + si; if (qi < p.height && qj < p.width) { #pragma unroll @@ -104,14 +101,14 @@ struct PointwiseNeighborhood2DFull5x5 : PointwiseNeighborhood2DBase { } } /* key tile */ - const int ktx = lti / KSTRIDE_32; - const int kty = (lti - ktx * KSTRIDE_32) * KITERS_32; + int ktx = lti / KSTRIDE_32; + int kty = (lti - ktx * KSTRIDE_32) * KITERS_32; if (ktx < KTILE_5 * KTILE_5) { int bi = ktx / KTILE_5; - const int bj = (ktx - bi * KTILE_5) * dilation + snj; + int bj = (ktx - bi * KTILE_5) * dilation + snj; bi = bi * dilation + sni; if (bi < p.height && bj < p.width) { - const int64_t keyOffset = batchHeadOffset + bi * p.query_stride_2 + + int64_t keyOffset = batchHeadOffset + bi * p.query_stride_2 + bj * p.query_stride_3 + kty; #pragma unroll for (int ti = 0; ti < KITERS_32; ++ti) @@ -119,33 +116,33 @@ struct PointwiseNeighborhood2DFull5x5 : PointwiseNeighborhood2DBase { } } __syncthreads(); - const int ii = threadIdx.y / KERNEL_SIZE_5; - const int ki = threadIdx.y - ii * KERNEL_SIZE_5; - const int jj = threadIdx.x / KERNEL_SIZE_5; - const int kj = threadIdx.x - jj * KERNEL_SIZE_5; - const int i = si + ii * dilation, j = sj + jj * dilation; + int ii = threadIdx.y / KERNEL_SIZE_5; + int ki = threadIdx.y - ii * KERNEL_SIZE_5; + int jj = threadIdx.x / KERNEL_SIZE_5; + int kj = threadIdx.x - jj * KERNEL_SIZE_5; + int i = si + ii * dilation, j = sj + jj * dilation; if (i < p.height && j < p.width) { - const int ni = get_window_start( + int ni = get_window_start( i, p.height, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); - const int nj = get_window_start( + int nj = get_window_start( j, p.width, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); scalar_t updt = scalar_t(0); - const int queryIdx = ii * TILE_5 + jj; - const int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILE_5 + + int queryIdx = ii * TILE_5 + jj; + int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILE_5 + int((nj + kj * dilation - snj) / dilation); #pragma unroll for (int dimOffset = 0; dimOffset < DIM_32; ++dimOffset) updt += tile[queryIdx][dimOffset] * kTile[keyIdx][dimOffset]; - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + j * p.attn_stride_3 + ki * KERNEL_SIZE_5 + kj; if (p.bias) { - const int pi = get_pb_start( + int pi = get_pb_start( i, p.height, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); - const int pj = get_pb_start( + int pj = get_pb_start( j, p.width, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); - const int64_t biasIndex = + int64_t biasIndex = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); updt += p.bias[biasIndex]; } @@ -174,7 +171,7 @@ struct PointwiseNeighborhood2DFull5x5 : PointwiseNeighborhood2DBase { } }; -template +template struct PointwiseNeighborhood2DHalf5x5 : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; using Params = typename Base::Params; @@ -187,31 +184,28 @@ struct PointwiseNeighborhood2DHalf5x5 : PointwiseNeighborhood2DBase { using HalfHelper = typename HalfArray::Base; using HalfType = typename HalfHelper::ElementVector; - static __host__ int get_dim(int dim) { - return 16; - } - __device__ void launch(Params p) { - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; // Because batch heads have stride 1 per threadblock, we can just use // blockIdx since blockDim will be 1 and threadIdx will always be 0. const // int z = blockIdx.z * blockDim.z + threadIdx.z; - const int z = blockIdx.z; - const int b = z / p.heads; - const int h = z - b * p.heads; + // TODO: remove when/if tiled kernels allow varying dilations + auto dilation = p.dilation_0; + int z = blockIdx.z; + int b = z / p.heads; + int h = z - b * p.heads; // Not needed again because it will always be true. // if (z < batch_size * heads) // { - const int lti = threadIdx.y * (TILE_5 * KERNEL_SIZE_5) + threadIdx.x; - const int stride2 = DIMHALF_32 * p.width; - const int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; - const int si = int(blockIdx.y / dilation) * (TILE_5 * dilation) + + int lti = threadIdx.y * (TILE_5 * KERNEL_SIZE_5) + threadIdx.x; + int stride2 = DIMHALF_32 * p.width; + int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; + int si = int(blockIdx.y / dilation) * (TILE_5 * dilation) + (blockIdx.y % dilation); - const int sj = int(blockIdx.x / dilation) * (TILE_5 * dilation) + + int sj = int(blockIdx.x / dilation) * (TILE_5 * dilation) + (blockIdx.x % dilation); - const int sni = get_window_start( + int sni = get_window_start( si, p.height, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); - const int snj = get_window_start( + int snj = get_window_start( sj, p.width, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); __shared__ HalfType tile[TILE_5 * TILE_5][DIM_32 + 3]; __shared__ HalfType kTile[KTILE_5 * KTILE_5][DIM_32 + 3]; @@ -219,11 +213,11 @@ struct PointwiseNeighborhood2DHalf5x5 : PointwiseNeighborhood2DBase { auto key2 = HalfHelper::typecast(p.key); /* query tile */ - const int qtx = lti / DIMHALF_32; - const int qty = lti - qtx * DIMHALF_32; + int qtx = lti / DIMHALF_32; + int qty = lti - qtx * DIMHALF_32; if (qtx < TILE_5 * TILE_5) { int qi = qtx / TILE_5; - const int qj = (qtx - qi * TILE_5) * dilation + sj; + int qj = (qtx - qi * TILE_5) * dilation + sj; qi = qi * dilation + si; if (qi < p.height && qj < p.width) { tile[qtx][qty] = @@ -231,14 +225,14 @@ struct PointwiseNeighborhood2DHalf5x5 : PointwiseNeighborhood2DBase { } } /* key tile */ - const int ktx = lti / KSTRIDE_32; - const int kty = (lti - ktx * KSTRIDE_32) * KHALFITERS_32; + int ktx = lti / KSTRIDE_32; + int kty = (lti - ktx * KSTRIDE_32) * KHALFITERS_32; if (ktx < KTILE_5 * KTILE_5) { int bi = ktx / KTILE_5; - const int bj = (ktx - bi * KTILE_5) * dilation + snj; + int bj = (ktx - bi * KTILE_5) * dilation + snj; bi = bi * dilation + sni; if (bi < p.height && bj < p.width) { - const int64_t keyOffset = + int64_t keyOffset = batchHeadOffset + bi * stride2 + bj * DIMHALF_32 + kty; #pragma unroll for (int ti = 0; ti < KHALFITERS_32; ++ti) @@ -246,19 +240,19 @@ struct PointwiseNeighborhood2DHalf5x5 : PointwiseNeighborhood2DBase { } } __syncthreads(); - const int ii = threadIdx.y / KERNEL_SIZE_5; - const int ki = threadIdx.y - ii * KERNEL_SIZE_5; - const int jj = threadIdx.x / KERNEL_SIZE_5; - const int kj = threadIdx.x - jj * KERNEL_SIZE_5; - const int i = si + ii * dilation, j = sj + jj * dilation; + int ii = threadIdx.y / KERNEL_SIZE_5; + int ki = threadIdx.y - ii * KERNEL_SIZE_5; + int jj = threadIdx.x / KERNEL_SIZE_5; + int kj = threadIdx.x - jj * KERNEL_SIZE_5; + int i = si + ii * dilation, j = sj + jj * dilation; if (i < p.height && j < p.width) { - const int ni = get_window_start( + int ni = get_window_start( i, p.height, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); - const int nj = get_window_start( + int nj = get_window_start( j, p.width, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); - auto updt = HalfHelper::zero(); - const int queryIdx = ii * TILE_5 + jj; - const int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILE_5 + + auto updt = HalfHelper::zeros(); + int queryIdx = ii * TILE_5 + jj; + int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILE_5 + int((nj + kj * dilation - snj) / dilation); #pragma unroll @@ -266,15 +260,15 @@ struct PointwiseNeighborhood2DHalf5x5 : PointwiseNeighborhood2DBase { updt = HalfHelper::fma( tile[queryIdx][dimOffset], kTile[keyIdx][dimOffset], updt); - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + j * p.attn_stride_3 + ki * KERNEL_SIZE_5 + kj; scalar_t acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); if (p.bias) { - const int pi = get_pb_start( + int pi = get_pb_start( i, p.height, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); - const int pj = get_pb_start( + int pj = get_pb_start( j, p.width, KERNEL_SIZE_5, NEIGHBORHOOD_SIZE_5, dilation); - const int64_t biasIndex = + int64_t biasIndex = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); acc = HalfHelper::add(acc, p.bias[biasIndex]); } diff --git a/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_7x7_9x9.cuh b/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_7x7_9x9.cuh index 9ddf2f6..0386c8b 100644 --- a/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_7x7_9x9.cuh +++ b/csrc/include/natten/cuda/naive/tiled/pointwise_neighborhood_2d_tiled_7x7_9x9.cuh @@ -52,13 +52,12 @@ namespace naive { /////////////// 7x7 and 9x9 template < typename scalar_t, - int TILE, - int KTILE, - int XYTHREADS, - int BATCHTHREADS, - int KERNEL_SIZE, - int NEIGHBORHOOD_SIZE, - int DILATION> + int32_t TILE, + int32_t KTILE, + int32_t XYTHREADS, + int32_t BATCHTHREADS, + int32_t KERNEL_SIZE, + int32_t NEIGHBORHOOD_SIZE> struct PointwiseNeighborhood2DFull7x7_9x9 : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; @@ -69,40 +68,37 @@ struct PointwiseNeighborhood2DFull7x7_9x9 __device__ __host__ PointwiseNeighborhood2DFull7x7_9x9() : Base() {} - static __host__ int get_dim(int dim) { - return 32; - } - __device__ void launch(Params p) { - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; // Because batch heads have stride 1 per threadblock, we can just use // blockIdx since blockDim will be 1 and threadIdx will always be 0. const - // int z = blockIdx.z * blockDim.z + threadIdx.z; - const int z = blockIdx.z; - const int b = z / p.heads; - const int h = z - b * p.heads; + // int32_t z = blockIdx.z * blockDim.z + threadIdx.z; + // TODO: remove when/if tiled kernels allow varying dilations + auto dilation = p.dilation_0; + int32_t z = blockIdx.z; + int32_t b = z / p.heads; + int32_t h = z - b * p.heads; // Not needed again because it will always be true. // if (z < batch_size * heads) // { - const int lti = threadIdx.y * (TILE * KERNEL_SIZE) + threadIdx.x; - const int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; - const int si = int(blockIdx.y / dilation) * (TILE * dilation) + + int32_t lti = threadIdx.y * (TILE * KERNEL_SIZE) + threadIdx.x; + int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; + int32_t si = int32_t(blockIdx.y / dilation) * (TILE * dilation) + (blockIdx.y % dilation); - const int sj = int(blockIdx.x / dilation) * (TILE * dilation) + + int32_t sj = int32_t(blockIdx.x / dilation) * (TILE * dilation) + (blockIdx.x % dilation); - const int sni = get_window_start( + int32_t sni = get_window_start( si, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int snj = + int32_t snj = get_window_start(sj, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); __shared__ scalar_t tile[TILE * TILE][DIM_32 + 3]; __shared__ scalar_t kTile[KTILE * KTILE][DIM_32 + 3]; /* query tile */ - const int qtx = lti / DIM_32; - const int qty = lti - qtx * DIM_32; + int32_t qtx = lti / DIM_32; + int32_t qty = lti - qtx * DIM_32; if (qtx < TILE * TILE) { - int qi = qtx / TILE; - const int qj = (qtx - qi * TILE) * dilation + sj; + int32_t qi = qtx / TILE; + int32_t qj = (qtx - qi * TILE) * dilation + sj; qi = qi * dilation + si; if (qi < p.height && qj < p.width) tile[qtx][qty] = p.query @@ -110,48 +106,48 @@ struct PointwiseNeighborhood2DFull7x7_9x9 qj * p.query_stride_3 + qty]; } /* key tile */ - const int ktx = lti / KSTRIDE_32; - const int kty = (lti - ktx * KSTRIDE_32) * KITERS_32; + int32_t ktx = lti / KSTRIDE_32; + int32_t kty = (lti - ktx * KSTRIDE_32) * KITERS_32; if (ktx < KTILE * KTILE) { - int bi = ktx / KTILE; - const int bj = (ktx - bi * KTILE) * dilation + snj; + int32_t bi = ktx / KTILE; + int32_t bj = (ktx - bi * KTILE) * dilation + snj; bi = bi * dilation + sni; if (bi < p.height && bj < p.width) { - const int64_t keyOffset = batchHeadOffset + bi * p.query_stride_2 + + int64_t keyOffset = batchHeadOffset + bi * p.query_stride_2 + bj * p.query_stride_3 + kty; #pragma unroll - for (int ti = 0; ti < KITERS_32; ++ti) + for (int32_t ti = 0; ti < KITERS_32; ++ti) kTile[ktx][kty + ti] = p.key[keyOffset + ti]; } } __syncthreads(); - const int ii = threadIdx.y / KERNEL_SIZE; - const int ki = threadIdx.y - ii * KERNEL_SIZE; - const int jj = threadIdx.x / KERNEL_SIZE; - const int kj = threadIdx.x - jj * KERNEL_SIZE; - const int i = si + ii * dilation, j = sj + jj * dilation; + int32_t ii = threadIdx.y / KERNEL_SIZE; + int32_t ki = threadIdx.y - ii * KERNEL_SIZE; + int32_t jj = threadIdx.x / KERNEL_SIZE; + int32_t kj = threadIdx.x - jj * KERNEL_SIZE; + int32_t i = si + ii * dilation, j = sj + jj * dilation; if (i < p.height && j < p.width) { - const int ni = get_window_start( + int32_t ni = get_window_start( i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( + int32_t nj = get_window_start( j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); scalar_t updt = scalar_t(0); - const int queryIdx = ii * TILE + jj; - const int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILE + - int((nj + kj * dilation - snj) / dilation); + int32_t queryIdx = ii * TILE + jj; + int32_t keyIdx = int32_t((ni + ki * dilation - sni) / dilation) * KTILE + + int32_t((nj + kj * dilation - snj) / dilation); #pragma unroll - for (int dimOffset = 0; dimOffset < DIM_32; ++dimOffset) + for (int32_t dimOffset = 0; dimOffset < DIM_32; ++dimOffset) updt += tile[queryIdx][dimOffset] * kTile[keyIdx][dimOffset]; - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + j * p.attn_stride_3 + ki * KERNEL_SIZE + kj; if (p.bias) { - const int pi = + int32_t pi = get_pb_start(i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = + int32_t pj = get_pb_start(j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t biasIndex = + int64_t biasIndex = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); updt += p.bias[biasIndex]; } @@ -161,15 +157,15 @@ struct PointwiseNeighborhood2DFull7x7_9x9 } static LaunchParams get_launch_params( - int batch_dim, - int height, - int width, - int attention_span, - int dilation) { - int xsize = width * KERNEL_SIZE; - int ysize = height * KERNEL_SIZE; - int XTHREADS = XYTHREADS; - int YTHREADS = XYTHREADS; + int32_t batch_dim, + int32_t height, + int32_t width, + int32_t attention_span, + int32_t dilation) { + int32_t xsize = width * KERNEL_SIZE; + int32_t ysize = height * KERNEL_SIZE; + int32_t XTHREADS = XYTHREADS; + int32_t YTHREADS = XYTHREADS; const dim3 grid( (xsize + XTHREADS * dilation - 1) / XTHREADS, (ysize + YTHREADS * dilation - 1) / YTHREADS, @@ -181,13 +177,12 @@ struct PointwiseNeighborhood2DFull7x7_9x9 template < typename scalar_t, - int TILE, - int KTILE, - int XYTHREADS, - int BATCHTHREADS, - int KERNEL_SIZE, - int NEIGHBORHOOD_SIZE, - int DILATION> + int32_t TILE, + int32_t KTILE, + int32_t XYTHREADS, + int32_t BATCHTHREADS, + int32_t KERNEL_SIZE, + int32_t NEIGHBORHOOD_SIZE> struct PointwiseNeighborhood2DHalf7x7_9x9 : PointwiseNeighborhood2DBase { using Base = PointwiseNeighborhood2DBase; @@ -201,31 +196,28 @@ struct PointwiseNeighborhood2DHalf7x7_9x9 using HalfHelper = typename HalfArray::Base; using HalfType = typename HalfHelper::ElementVector; - static __host__ int get_dim(int dim) { - return 16; - } - __device__ void launch(Params p) { - const int dilation = (DILATION > 0) ? DILATION : p.dilation_in; // Because batch heads have stride 1 per threadblock, we can just use // blockIdx since blockDim will be 1 and threadIdx will always be 0. const - // int z = blockIdx.z * blockDim.z + threadIdx.z; - const int z = blockIdx.z; - const int b = z / p.heads; - const int h = z - b * p.heads; + // int32_t z = blockIdx.z * blockDim.z + threadIdx.z; + // TODO: remove when/if tiled kernels allow varying dilations + auto dilation = p.dilation_0; + int32_t z = blockIdx.z; + int32_t b = z / p.heads; + int32_t h = z - b * p.heads; // Not needed again because it will always be true. // if (z < batch_size * heads) // { - const int lti = threadIdx.y * (TILE * KERNEL_SIZE) + threadIdx.x; - const int stride2 = DIMHALF_32 * p.width; - const int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; - const int si = int(blockIdx.y / dilation) * (TILE * dilation) + + int32_t lti = threadIdx.y * (TILE * KERNEL_SIZE) + threadIdx.x; + int32_t stride2 = DIMHALF_32 * p.width; + int64_t batchHeadOffset = b * p.query_stride_0 + h * p.query_stride_1; + int32_t si = int32_t(blockIdx.y / dilation) * (TILE * dilation) + (blockIdx.y % dilation); - const int sj = int(blockIdx.x / dilation) * (TILE * dilation) + + int32_t sj = int32_t(blockIdx.x / dilation) * (TILE * dilation) + (blockIdx.x % dilation); - const int sni = get_window_start( + int32_t sni = get_window_start( si, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int snj = + int32_t snj = get_window_start(sj, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); __shared__ HalfType tile[TILE * TILE][DIM_32 + 3]; __shared__ HalfType kTile[KTILE * KTILE][DIM_32 + 3]; @@ -233,68 +225,68 @@ struct PointwiseNeighborhood2DHalf7x7_9x9 auto key2 = HalfHelper::typecast(p.key); /* query tile */ - const int qtx = lti / DIM_32; - const int qtyp = lti - qtx * DIM_32; - const int qdi = qtyp / KHALFITERS_32; - const int qdj = qtyp - qdi * KHALFITERS_32; - const int qty = qdi * KITERS_32 + qdj; + int32_t qtx = lti / DIM_32; + int32_t qtyp = lti - qtx * DIM_32; + int32_t qdi = qtyp / KHALFITERS_32; + int32_t qdj = qtyp - qdi * KHALFITERS_32; + int32_t qty = qdi * KITERS_32 + qdj; if (qtx < TILE * TILE && qtyp < DIMHALF_32) { - int qi = qtx / TILE; - const int qj = (qtx - qi * TILE) * dilation + sj; + int32_t qi = qtx / TILE; + int32_t qj = (qtx - qi * TILE) * dilation + sj; qi = qi * dilation + si; if (qi < p.height && qj < p.width) tile[qtx][qty] = query2[batchHeadOffset + qi * stride2 + qj * DIMHALF_32 + qtyp]; } /* key tile */ - const int ktx = lti / KSTRIDE_32; - const int kty = (lti - ktx * KSTRIDE_32) * KHALFITERS_32; + int32_t ktx = lti / KSTRIDE_32; + int32_t kty = (lti - ktx * KSTRIDE_32) * KHALFITERS_32; if (ktx < KTILE * KTILE) { - int bi = ktx / KTILE; - const int bj = (ktx - bi * KTILE) * dilation + snj; + int32_t bi = ktx / KTILE; + int32_t bj = (ktx - bi * KTILE) * dilation + snj; bi = bi * dilation + sni; if (bi < p.height && bj < p.width) { - const int64_t keyOffset = + int64_t keyOffset = batchHeadOffset + bi * stride2 + bj * DIMHALF_32 + kty; #pragma unroll - for (int ti = 0; ti < KHALFITERS_32; ++ti) + for (int32_t ti = 0; ti < KHALFITERS_32; ++ti) kTile[ktx][kty * 2 + ti] = key2[keyOffset + ti]; } } __syncthreads(); - const int ii = threadIdx.y / KERNEL_SIZE; - const int ki = threadIdx.y - ii * KERNEL_SIZE; - const int jj = threadIdx.x / KERNEL_SIZE; - const int kj = threadIdx.x - jj * KERNEL_SIZE; - const int i = si + ii * dilation, j = sj + jj * dilation; + int32_t ii = threadIdx.y / KERNEL_SIZE; + int32_t ki = threadIdx.y - ii * KERNEL_SIZE; + int32_t jj = threadIdx.x / KERNEL_SIZE; + int32_t kj = threadIdx.x - jj * KERNEL_SIZE; + int32_t i = si + ii * dilation, j = sj + jj * dilation; if (i < p.height && j < p.width) { - const int ni = get_window_start( + int32_t ni = get_window_start( i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int nj = get_window_start( + int32_t nj = get_window_start( j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - auto updt = HalfHelper::zero(); - const int queryIdx = ii * TILE + jj; - const int keyIdx = int((ni + ki * dilation - sni) / dilation) * KTILE + - int((nj + kj * dilation - snj) / dilation); + auto updt = HalfHelper::zeros(); + int32_t queryIdx = ii * TILE + jj; + int32_t keyIdx = int32_t((ni + ki * dilation - sni) / dilation) * KTILE + + int32_t((nj + kj * dilation - snj) / dilation); #pragma unroll - for (int di = 0; di < KSTRIDE_32; ++di) + for (int32_t di = 0; di < KSTRIDE_32; ++di) #pragma unroll - for (int dj = 0; dj < KHALFITERS_32; ++dj) + for (int32_t dj = 0; dj < KHALFITERS_32; ++dj) updt = HalfHelper::fma( tile[queryIdx][di * KITERS_32 + dj], kTile[keyIdx][di * KITERS_32 + dj], updt); - const int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + + int64_t index = b * p.attn_stride_0 + h * p.attn_stride_1 + i * p.attn_stride_2 + j * p.attn_stride_3 + ki * KERNEL_SIZE + kj; scalar_t acc = HalfHelper::cast_back(HalfHelper::add(updt.x, updt.y)); if (p.bias) { - const int pi = + int32_t pi = get_pb_start(i, p.height, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int pj = + int32_t pj = get_pb_start(j, p.width, KERNEL_SIZE, NEIGHBORHOOD_SIZE, dilation); - const int64_t biasIndex = + int64_t biasIndex = h * p.bias_stride_0 + (pi + ki) * p.bias_stride_1 + (pj + kj); acc = HalfHelper::add(acc, p.bias[biasIndex]); } @@ -304,15 +296,15 @@ struct PointwiseNeighborhood2DHalf7x7_9x9 } static LaunchParams get_launch_params( - int batch_dim, - int height, - int width, - int attention_span, - int dilation) { - int xsize = width * KERNEL_SIZE; - int ysize = height * KERNEL_SIZE; - int XTHREADS = XYTHREADS; - int YTHREADS = XYTHREADS; + int32_t batch_dim, + int32_t height, + int32_t width, + int32_t attention_span, + int32_t dilation) { + int32_t xsize = width * KERNEL_SIZE; + int32_t ysize = height * KERNEL_SIZE; + int32_t XTHREADS = XYTHREADS; + int32_t YTHREADS = XYTHREADS; const dim3 grid( (xsize + XTHREADS * dilation - 1) / XTHREADS, (ysize + YTHREADS * dilation - 1) / YTHREADS, @@ -322,7 +314,7 @@ struct PointwiseNeighborhood2DHalf7x7_9x9 } }; -template +template struct PointwiseNeighborhood2DFull7x7 : PointwiseNeighborhood2DFull7x7_9x9< scalar_t, TILE_7, @@ -330,8 +322,7 @@ struct PointwiseNeighborhood2DFull7x7 : PointwiseNeighborhood2DFull7x7_9x9< XYTHREADS_7, BATCHTHREADS_7, 7, - 3, - DILATION> { + 3> { using Base = PointwiseNeighborhood2DFull7x7_9x9< scalar_t, TILE_7, @@ -339,13 +330,12 @@ struct PointwiseNeighborhood2DFull7x7 : PointwiseNeighborhood2DFull7x7_9x9< XYTHREADS_7, BATCHTHREADS_7, 7, - 3, - DILATION>; + 3>; __device__ __host__ PointwiseNeighborhood2DFull7x7() : Base() {} }; -template +template struct PointwiseNeighborhood2DHalf7x7 : PointwiseNeighborhood2DHalf7x7_9x9< scalar_t, TILE_7, @@ -353,8 +343,7 @@ struct PointwiseNeighborhood2DHalf7x7 : PointwiseNeighborhood2DHalf7x7_9x9< XYTHREADS_7, BATCHTHREADS_7, 7, - 3, - DILATION> { + 3> { using Base = PointwiseNeighborhood2DHalf7x7_9x9< scalar_t, TILE_7, @@ -362,13 +351,12 @@ struct PointwiseNeighborhood2DHalf7x7 : PointwiseNeighborhood2DHalf7x7_9x9< XYTHREADS_7, BATCHTHREADS_7, 7, - 3, - DILATION>; + 3>; __device__ __host__ PointwiseNeighborhood2DHalf7x7() : Base() {} }; -template +template struct PointwiseNeighborhood2DFull9x9 : PointwiseNeighborhood2DFull7x7_9x9< scalar_t, TILE_9, @@ -376,8 +364,7 @@ struct PointwiseNeighborhood2DFull9x9 : PointwiseNeighborhood2DFull7x7_9x9< XYTHREADS_9, BATCHTHREADS_9, 9, - 4, - DILATION> { + 4> { using Base = PointwiseNeighborhood2DFull7x7_9x9< scalar_t, TILE_9, @@ -385,13 +372,12 @@ struct PointwiseNeighborhood2DFull9x9 : PointwiseNeighborhood2DFull7x7_9x9< XYTHREADS_9, BATCHTHREADS_9, 9, - 4, - DILATION>; + 4>; __device__ __host__ PointwiseNeighborhood2DFull9x9() : Base() {} }; -template +template struct PointwiseNeighborhood2DHalf9x9 : PointwiseNeighborhood2DHalf7x7_9x9< scalar_t, TILE_9, @@ -399,8 +385,7 @@ struct PointwiseNeighborhood2DHalf9x9 : PointwiseNeighborhood2DHalf7x7_9x9< XYTHREADS_9, BATCHTHREADS_9, 9, - 4, - DILATION> { + 4> { using Base = PointwiseNeighborhood2DHalf7x7_9x9< scalar_t, TILE_9, @@ -408,8 +393,7 @@ struct PointwiseNeighborhood2DHalf9x9 : PointwiseNeighborhood2DHalf7x7_9x9< XYTHREADS_9, BATCHTHREADS_9, 9, - 4, - DILATION>; + 4>; __device__ __host__ PointwiseNeighborhood2DHalf9x9() : Base() {} }; diff --git a/csrc/include/natten/cuda/utils/cuda.h b/csrc/include/natten/cuda/utils/cuda.h new file mode 100644 index 0000000..8ce4b17 --- /dev/null +++ b/csrc/include/natten/cuda/utils/cuda.h @@ -0,0 +1,35 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + *all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **************************************************************************************************/ + +#pragma once + +#define NATTEN_CUDA_CHECK(status) \ + [&] { \ + cudaError_t error = status; \ + if (error != cudaSuccess) { \ + std::cerr << "NATTEN failure: CUDA runtime error: " \ + << cudaGetErrorString(error) << " at: " << __LINE__ \ + << std::endl; \ + exit(EXIT_FAILURE); \ + } \ + }(); diff --git a/csrc/include/natten/cuda/gemm/utils.cuh b/csrc/include/natten/cuda/utils/cutlass.h similarity index 97% rename from csrc/include/natten/cuda/gemm/utils.cuh rename to csrc/include/natten/cuda/utils/cutlass.h index 19690a5..70872a5 100644 --- a/csrc/include/natten/cuda/gemm/utils.cuh +++ b/csrc/include/natten/cuda/utils/cutlass.h @@ -33,9 +33,11 @@ * **************************************************************************************************/ +#pragma once + #include -#define CUTLASS_CHECK(status) \ +#define NATTEN_CUTLASS_CHECK(status) \ [&] { \ cutlass::Status error = status; \ if (error != cutlass::Status::kSuccess) { \ diff --git a/csrc/include/natten/naive_argpack.h b/csrc/include/natten/naive_argpack.h index 2d421bd..91c9fec 100644 --- a/csrc/include/natten/naive_argpack.h +++ b/csrc/include/natten/naive_argpack.h @@ -26,21 +26,37 @@ namespace natten { namespace naive { -template -struct ArgumentPack { - static constexpr int KernelSize = (KernelSize_ <= 0) ? -1 : KernelSize_; - static constexpr int DepthKernelSize = -1; +// TODO: - static_assert(KernelSize <= 0 || (KernelSize > 1 && KernelSize % 2 == 1)); - - static constexpr int NeighborhoodSize = - (KernelSize <= 0) ? -1 : KernelSize / 2; - static constexpr int DepthNeighborhoodSize = -1; +template +struct ArgumentPack1D { + using Dtype = scalar_t; + struct CausalMask { + static constexpr bool Dim0 = CausalMask0_; + }; +}; - static constexpr int Dilation = (Dilation_ <= 0) ? -1 : Dilation_; - static constexpr int DepthDilation = -1; +template +struct ArgumentPack2D { + using Dtype = scalar_t; + struct CausalMask { + static constexpr bool Dim0 = CausalMask0_; + static constexpr bool Dim1 = CausalMask1_; + }; +}; +template < + typename scalar_t, + bool CausalMask0_, + bool CausalMask1_, + bool CausalMask2_> +struct ArgumentPack3D { using Dtype = scalar_t; + struct CausalMask { + static constexpr bool Dim0 = CausalMask0_; + static constexpr bool Dim1 = CausalMask1_; + static constexpr bool Dim2 = CausalMask2_; + }; }; } // namespace naive diff --git a/csrc/include/natten/natten.h b/csrc/include/natten/natten.h new file mode 100644 index 0000000..cafce5a --- /dev/null +++ b/csrc/include/natten/natten.h @@ -0,0 +1,130 @@ +/*************************************************************************************************** + * Copyright (c) 2022-2024 Ali Hassani. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + *all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **************************************************************************************************/ + +#pragma once + +namespace natten { + +#define NATTEN_FAILURE(msg) \ + std::cerr << #msg << std::endl; \ + exit(EXIT_FAILURE); + +#define NATTEN_CHECK(cond, msg) \ + if (!(cond)) { \ + std::cerr << #msg << std::endl; \ + exit(EXIT_FAILURE); \ + } + +// Causal mask helpers +template +bool any_true(TupleType v); + +template <> +inline bool any_true(std::tuple v) { + return std::get<0>(v); +} + +template <> +inline bool any_true(std::tuple v) { + return std::get<0>(v) || std::get<1>(v); +} + +template <> +inline bool any_true(std::tuple v) { + return std::get<0>(v) || std::get<1>(v) || std::get<2>(v); +} + +// Kernel size helpers +template +int32_t flatten(TupleType v); + +template <> +inline int32_t flatten(std::tuple v) { + return std::get<0>(v); +} + +template <> +inline int32_t flatten(std::tuple v) { + return std::get<0>(v) * std::get<1>(v); +} + +template <> +inline int32_t flatten(std::tuple v) { + return std::get<0>(v) * std::get<1>(v) * std::get<2>(v); +} + +template +bool all_dims_match(TupleType v); + +template <> +inline bool all_dims_match(std::tuple v) { + return true; +} + +template <> +inline bool all_dims_match(std::tuple v) { + return std::get<0>(v) == std::get<1>(v); +} + +template <> +inline bool all_dims_match(std::tuple v) { + return std::get<0>(v) == std::get<1>(v) && std::get<1>(v) == std::get<2>(v); +} + +// Runtime accessors + +template +int32_t get_from_tuple(TupleType v, size_t index); + +template <> +inline int32_t get_from_tuple(std::tuple v, size_t index) { + NATTEN_CHECK(index == 0, "Got invalid index for tuple of size 1."); + return std::get<0>(v); +} + +template <> +inline int32_t get_from_tuple(std::tuple v, size_t index) { + NATTEN_CHECK( + index == 0 || index == 1, "Got invalid index for tuple of size 2."); + if (index == 0) { + return std::get<0>(v); + } + return std::get<1>(v); +} + +template <> +inline int32_t get_from_tuple( + std::tuple v, + size_t index) { + NATTEN_CHECK( + index == 0 || index == 1 || index == 2, + "Got invalid index for tuple of size 3."); + if (index == 0) { + return std::get<0>(v); + } else if (index == 1) { + return std::get<1>(v); + } + return std::get<2>(v); +} + +} // namespace natten diff --git a/csrc/include/natten/pytorch/cpu/na1d.h b/csrc/include/natten/pytorch/cpu/na1d.h index ef956d9..bd829eb 100644 --- a/csrc/include/natten/pytorch/cpu/na1d.h +++ b/csrc/include/natten/pytorch/cpu/na1d.h @@ -27,21 +27,41 @@ #pragma once #include +#include + namespace natten { namespace pytorch { namespace cpu { +void na1d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t length, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size); + void na1d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_qk_backward( const at::Tensor& d_attn, @@ -50,23 +70,25 @@ void na1d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_av_backward( const at::Tensor& d_out, @@ -74,12 +96,13 @@ void na1d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); } // namespace cpu } // namespace pytorch diff --git a/csrc/include/natten/pytorch/cpu/na2d.h b/csrc/include/natten/pytorch/cpu/na2d.h index ea628e7..ee73cb8 100644 --- a/csrc/include/natten/pytorch/cpu/na2d.h +++ b/csrc/include/natten/pytorch/cpu/na2d.h @@ -27,22 +27,43 @@ #pragma once #include +#include + namespace natten { namespace pytorch { namespace cpu { +void na2d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size); + void na2d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_qk_backward( const at::Tensor& d_attn, @@ -51,25 +72,27 @@ void na2d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_av_backward( const at::Tensor& d_out, @@ -77,13 +100,14 @@ void na2d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); } // namespace cpu } // namespace pytorch diff --git a/csrc/include/natten/pytorch/cpu/na3d.h b/csrc/include/natten/pytorch/cpu/na3d.h index 39e23a0..44589fd 100644 --- a/csrc/include/natten/pytorch/cpu/na3d.h +++ b/csrc/include/natten/pytorch/cpu/na3d.h @@ -27,25 +27,45 @@ #pragma once #include +#include + namespace natten { namespace pytorch { namespace cpu { +void na3d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size); + void na3d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_qk_backward( const at::Tensor& d_attn, @@ -54,31 +74,29 @@ void na3d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_av_backward( const at::Tensor& d_out, @@ -86,16 +104,15 @@ void na3d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); } // namespace cpu } // namespace pytorch diff --git a/csrc/include/natten/pytorch/cuda/helpers.cuh b/csrc/include/natten/pytorch/cuda/helpers.cuh index 686c4ed..97836a8 100644 --- a/csrc/include/natten/pytorch/cuda/helpers.cuh +++ b/csrc/include/natten/pytorch/cuda/helpers.cuh @@ -30,14 +30,15 @@ cudaDeviceProp* device_props = \ at::cuda::getDeviceProperties(device_index); \ const int cc = device_props->major * 10 + device_props->minor; \ + const size_t max_smem = device_props->sharedMemPerBlockOptin; \ if (c10_dtype == torch::kFloat) { \ - fn_name(cc, stream, __VA_ARGS__); \ + fn_name(cc, max_smem, stream, __VA_ARGS__); \ } else if (c10_dtype == torch::kDouble) { \ - fn_name(cc, stream, __VA_ARGS__); \ + fn_name(cc, max_smem, stream, __VA_ARGS__); \ } else if (c10_dtype == torch::kFloat16 && cc >= 60) { \ - fn_name(cc, stream, __VA_ARGS__); \ + fn_name(cc, max_smem, stream, __VA_ARGS__); \ } else if (c10_dtype == torch::kBFloat16 && cc >= 80) { \ - fn_name(cc, stream, __VA_ARGS__); \ + fn_name(cc, max_smem, stream, __VA_ARGS__); \ } else { \ std::cerr << "NATTEN (CUDA) does not support data type " << c10_dtype \ << " on device with index " << device_index << " (SM " << cc \ diff --git a/csrc/include/natten/pytorch/cuda/na1d.cuh b/csrc/include/natten/pytorch/cuda/na1d.cuh index 083e9fb..cb9ea1f 100644 --- a/csrc/include/natten/pytorch/cuda/na1d.cuh +++ b/csrc/include/natten/pytorch/cuda/na1d.cuh @@ -27,21 +27,41 @@ #pragma once #include +#include + namespace natten { namespace pytorch { namespace cuda { +void na1d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t length, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size); + void na1d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_qk_backward( const at::Tensor& d_attn, @@ -50,23 +70,25 @@ void na1d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_av_backward( const at::Tensor& d_out, @@ -74,12 +96,13 @@ void na1d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); } // namespace cuda } // namespace pytorch diff --git a/csrc/include/natten/pytorch/cuda/na2d.cuh b/csrc/include/natten/pytorch/cuda/na2d.cuh index e42529d..92cc3b8 100644 --- a/csrc/include/natten/pytorch/cuda/na2d.cuh +++ b/csrc/include/natten/pytorch/cuda/na2d.cuh @@ -27,22 +27,43 @@ #pragma once #include +#include + namespace natten { namespace pytorch { namespace cuda { +void na2d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size); + void na2d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_qk_backward( const at::Tensor& d_attn, @@ -51,25 +72,27 @@ void na2d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_av_backward( const at::Tensor& d_out, @@ -77,13 +100,14 @@ void na2d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation); + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); } // namespace cuda } // namespace pytorch diff --git a/csrc/include/natten/pytorch/cuda/na3d.cuh b/csrc/include/natten/pytorch/cuda/na3d.cuh index c9acb0a..6e1e818 100644 --- a/csrc/include/natten/pytorch/cuda/na3d.cuh +++ b/csrc/include/natten/pytorch/cuda/na3d.cuh @@ -27,25 +27,45 @@ #pragma once #include +#include + namespace natten { namespace pytorch { namespace cuda { +void na3d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size); + void na3d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_qk_backward( const at::Tensor& d_attn, @@ -54,31 +74,29 @@ void na3d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_av_backward( const at::Tensor& d_out, @@ -86,16 +104,15 @@ void na3d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); } // namespace cuda } // namespace pytorch diff --git a/csrc/include/natten/pytorch/helpers.h b/csrc/include/natten/pytorch/helpers.h index 64999eb..59432e2 100644 --- a/csrc/include/natten/pytorch/helpers.h +++ b/csrc/include/natten/pytorch/helpers.h @@ -24,8 +24,9 @@ #pragma once #include -#define CHECK_CONTIGUOUS(x) \ - TORCH_CHECK(x.is_contiguous(), #x " must be contiguous") +#define CHECK_CONTIGUOUS(x) \ + TORCH_CHECK(!x.is_sparse(), #x " must be a dense tensor"); \ + TORCH_CHECK(x.is_contiguous(), #x " must be contiguous"); #ifdef NATTEN_WITH_CUDA #define DISPATCH_DEVICE(c10_type, kernel_name, ...) \ @@ -59,7 +60,7 @@ namespace natten { namespace pytorch { -inline void CheckArgs(int kernel_size, int dilation) { +inline void CheckArgs(int32_t kernel_size, int32_t dilation) { TORCH_CHECK( kernel_size > 1 && kernel_size % 2 == 1, "Kernel size must be an odd number greater than 1, got ", @@ -72,7 +73,31 @@ inline void CheckArgs(int kernel_size, int dilation) { "."); } -inline void CheckArgsAgainstDim(int dim, int kernel_size, int dilation) { +inline void CheckArgs( + const std::tuple& kernel_size, + const std::tuple& dilation) { + CheckArgs(std::get<0>(kernel_size), std::get<0>(dilation)); +} + +inline void CheckArgs( + const std::tuple& kernel_size, + const std::tuple& dilation) { + CheckArgs(std::get<0>(kernel_size), std::get<0>(dilation)); + CheckArgs(std::get<1>(kernel_size), std::get<1>(dilation)); +} + +inline void CheckArgs( + const std::tuple& kernel_size, + const std::tuple& dilation) { + CheckArgs(std::get<0>(kernel_size), std::get<0>(dilation)); + CheckArgs(std::get<1>(kernel_size), std::get<1>(dilation)); + CheckArgs(std::get<2>(kernel_size), std::get<2>(dilation)); +} + +inline void CheckArgsAgainstDim( + int32_t dim, + int32_t kernel_size, + int32_t dilation) { TORCH_CHECK( kernel_size * dilation <= dim, "Input axes must be less than or equal to the product of kernel size and dilation. " @@ -85,6 +110,36 @@ inline void CheckArgsAgainstDim(int dim, int kernel_size, int dilation) { "."); } +inline void CheckArgsAgainstDim( + const std::tuple& dim, + const std::tuple& kernel_size, + const std::tuple& dilation) { + CheckArgsAgainstDim( + std::get<0>(dim), std::get<0>(kernel_size), std::get<0>(dilation)); +} + +inline void CheckArgsAgainstDim( + const std::tuple& dim, + const std::tuple& kernel_size, + const std::tuple& dilation) { + CheckArgsAgainstDim( + std::get<0>(dim), std::get<0>(kernel_size), std::get<0>(dilation)); + CheckArgsAgainstDim( + std::get<1>(dim), std::get<1>(kernel_size), std::get<1>(dilation)); +} + +inline void CheckArgsAgainstDim( + const std::tuple& dim, + const std::tuple& kernel_size, + const std::tuple& dilation) { + CheckArgsAgainstDim( + std::get<0>(dim), std::get<0>(kernel_size), std::get<0>(dilation)); + CheckArgsAgainstDim( + std::get<1>(dim), std::get<1>(kernel_size), std::get<1>(dilation)); + CheckArgsAgainstDim( + std::get<2>(dim), std::get<2>(kernel_size), std::get<2>(dilation)); +} + inline void CheckIfPropertiesMatch(const at::Tensor& a, const at::Tensor& b) { TORCH_CHECK( a.device().is_cuda() == b.device().is_cuda(), @@ -124,11 +179,11 @@ void CheckIfTensorShapesMatch(const at::Tensor& a, const at::Tensor& b) { } } -template +template void CheckAttnShape( const at::Tensor& input, const at::Tensor& attn, - int kernel_size) { + KernelType kernel_size) { static_assert(NaDim >= 1 && NaDim < 4); TORCH_CHECK(attn.dim() == NaDim + 3, "Expected ", NaDim + 3, "-D tensors."); for (size_t i = 0; i < NaDim + 2; ++i) { @@ -141,7 +196,7 @@ void CheckAttnShape( " != ", input.size(i)); } - auto expected_kernel_size = std::pow(kernel_size, NaDim); + auto expected_kernel_size = natten::flatten(kernel_size); TORCH_CHECK( attn.size(NaDim + 2) == expected_kernel_size, "Expected attention dim was ", @@ -150,11 +205,12 @@ void CheckAttnShape( attn.size(NaDim + 2)); } -template +template void CheckBias( const at::Tensor& input, const at::Tensor& bias, - int kernel_size) { + int32_t num_heads, + KernelType kernel_size) { static_assert(NaDim >= 1 && NaDim < 4); TORCH_CHECK( input.scalar_type() == bias.scalar_type(), @@ -163,80 +219,9 @@ void CheckBias( bias.device().is_cuda() == input.device().is_cuda(), "Expected positional bias to be on the same device as the inputs."); CHECK_CONTIGUOUS(bias); - TORCH_CHECK( - bias.size(0) == input.size(1), - "Expected bias.shape[0] == input.shape[1] == heads."); + TORCH_CHECK(bias.size(0) == num_heads, "Expected bias.shape[0] == heads."); for (size_t i = 0; i < NaDim; ++i) { - auto expected_bias_dim = kernel_size * 2 - 1; - TORCH_CHECK( - bias.size(i + 1) == expected_bias_dim, - "Invalid bias shape at dim ", - i + 1, - "; " - "expected ", - expected_bias_dim, - ", got ", - bias.size(i + 1), - "."); - } -} - -// TODO: I resent this; please do it the right way. -template -void CheckAttnShape( - const at::Tensor& input, - const at::Tensor& attn, - int kernel_size, - int kernel_size_d) { - static_assert(NaDim == 3); - TORCH_CHECK(attn.dim() == NaDim + 3, "Expected ", NaDim + 3, "-D tensors."); - for (size_t i = 0; i < NaDim + 2; ++i) { - TORCH_CHECK( - input.size(i) == attn.size(i), - "Tensor shape mismatch at dimension ", - i, - ": ", - input.size(i), - " != ", - input.size(i)); - } - auto expected_kernel_size = kernel_size * kernel_size * kernel_size_d; - TORCH_CHECK( - attn.size(NaDim + 2) == expected_kernel_size, - "Expected attention dim was ", - expected_kernel_size, - ", got ", - attn.size(NaDim + 2)); -} - -template -void CheckBias( - const at::Tensor& input, - const at::Tensor& bias, - int kernel_size, - int kernel_size_d) { - static_assert(NaDim == 3); - TORCH_CHECK( - input.scalar_type() == bias.scalar_type(), - "Inputs and bias must match in dtype."); - TORCH_CHECK( - bias.device().is_cuda() == input.device().is_cuda(), - "Expected positional bias to be on the same device as the inputs."); - CHECK_CONTIGUOUS(bias); - TORCH_CHECK( - bias.size(0) == input.size(1), - "Expected bias.shape[0] == input.shape[1] == heads."); - - auto expected_bias_dim_0 = kernel_size_d * 2 - 1; - TORCH_CHECK( - bias.size(1) == expected_bias_dim_0, - "Invalid bias shape at dim 1; expected ", - expected_bias_dim_0, - ", got ", - bias.size(1), - "."); - for (size_t i = 1; i < NaDim; ++i) { - auto expected_bias_dim = kernel_size * 2 - 1; + auto expected_bias_dim = natten::get_from_tuple(kernel_size, i) * 2 - 1; TORCH_CHECK( bias.size(i + 1) == expected_bias_dim, "Invalid bias shape at dim ", diff --git a/csrc/include/natten/pytorch/na1d.h b/csrc/include/natten/pytorch/na1d.h index 0e866ee..5fd678b 100644 --- a/csrc/include/natten/pytorch/na1d.h +++ b/csrc/include/natten/pytorch/na1d.h @@ -27,16 +27,32 @@ #pragma once #include +#include + namespace natten { namespace pytorch { +void na1d_forward( + at::Tensor& out, + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + const at::optional& rpb, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size); + void na1d_qk_forward( at::Tensor& attn, const at::Tensor& query, const at::Tensor& key, const at::optional& bias, - const int kernel_size, - const int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_qk_backward( at::Tensor& d_query, @@ -45,15 +61,17 @@ void na1d_qk_backward( const at::Tensor& d_attn, const at::Tensor& query, const at::Tensor& key, - const int kernel_size, - const int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_av_forward( at::Tensor& out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na1d_av_backward( at::Tensor& d_attn, @@ -61,8 +79,9 @@ void na1d_av_backward( const at::Tensor& d_out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); } // namespace pytorch } // namespace natten diff --git a/csrc/include/natten/pytorch/na2d.h b/csrc/include/natten/pytorch/na2d.h index 8c480ee..8f39cec 100644 --- a/csrc/include/natten/pytorch/na2d.h +++ b/csrc/include/natten/pytorch/na2d.h @@ -27,16 +27,32 @@ #pragma once #include +#include + namespace natten { namespace pytorch { +void na2d_forward( + at::Tensor& out, + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + const at::optional& rpb, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size); + void na2d_qk_forward( at::Tensor& attn, const at::Tensor& query, const at::Tensor& key, const at::optional& bias, - const int kernel_size, - const int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_qk_backward( at::Tensor& d_query, @@ -45,15 +61,17 @@ void na2d_qk_backward( const at::Tensor& d_attn, const at::Tensor& query, const at::Tensor& key, - const int kernel_size, - const int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_av_forward( at::Tensor& out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na2d_av_backward( at::Tensor& d_attn, @@ -61,8 +79,9 @@ void na2d_av_backward( const at::Tensor& d_out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); } // namespace pytorch } // namespace natten diff --git a/csrc/include/natten/pytorch/na3d.h b/csrc/include/natten/pytorch/na3d.h index ee4f16d..ac1a6c3 100644 --- a/csrc/include/natten/pytorch/na3d.h +++ b/csrc/include/natten/pytorch/na3d.h @@ -27,18 +27,32 @@ #pragma once #include +#include + namespace natten { namespace pytorch { +void na3d_forward( + at::Tensor& out, + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + const at::optional& rpb, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size); + void na3d_qk_forward( at::Tensor& attn, const at::Tensor& query, const at::Tensor& key, const at::optional& bias, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_qk_backward( at::Tensor& d_query, @@ -47,19 +61,17 @@ void na3d_qk_backward( const at::Tensor& d_attn, const at::Tensor& query, const at::Tensor& key, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_av_forward( at::Tensor& out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); void na3d_av_backward( at::Tensor& d_attn, @@ -67,10 +79,9 @@ void na3d_av_backward( const at::Tensor& d_out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation); + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal); } // namespace pytorch } // namespace natten diff --git a/csrc/natten.cpp b/csrc/natten.cpp index ddd6e81..461123c 100644 --- a/csrc/natten.cpp +++ b/csrc/natten.cpp @@ -32,6 +32,15 @@ namespace natten { PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def( + "na1d_forward", &natten::pytorch::na1d_forward, "NA1D forward (fused)"); + + m.def( + "na2d_forward", &natten::pytorch::na2d_forward, "NA2D forward (fused)"); + + m.def( + "na3d_forward", &natten::pytorch::na3d_forward, "NA3D forward (fused)"); + m.def( "na1d_qk_forward", &natten::pytorch::na1d_qk_forward, "NA1D QK forward"); m.def( diff --git a/csrc/src/pytorch/cpu/na1d.cpp b/csrc/src/pytorch/cpu/na1d.cpp index aa83d98..fbdf303 100644 --- a/csrc/src/pytorch/cpu/na1d.cpp +++ b/csrc/src/pytorch/cpu/na1d.cpp @@ -27,25 +27,47 @@ #include #include -#include "natten/cpu/na1d.h" -#include "natten/dtypes.h" -#include "natten/pytorch/cpu/helpers.h" +#include +#include +#include +#include namespace natten { namespace pytorch { namespace cpu { +void na1d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t length, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { + // TODO: implement CPU reference + NATTEN_FAILURE("Fused kernels are not available on CPU yet."); +} + void na1d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( query.scalar_type(), natten::cpu::na1d_qk_forward, @@ -61,7 +83,8 @@ void na1d_qk_forward( attn.stride(1), attn.stride(2), kernel_size, - dilation); + dilation, + is_causal); } void na1d_qk_backward( @@ -71,12 +94,13 @@ void na1d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_attn.scalar_type(), natten::cpu::na1d_qk_backward, @@ -95,19 +119,21 @@ void na1d_qk_backward( d_attn.stride(1), d_attn.stride(2), kernel_size, - dilation); + dilation, + is_causal); } void na1d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( attn.scalar_type(), natten::cpu::na1d_av_forward, @@ -122,7 +148,8 @@ void na1d_av_forward( attn.stride(1), attn.stride(2), kernel_size, - dilation); + dilation, + is_causal); } void na1d_av_backward( @@ -131,12 +158,13 @@ void na1d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_out.scalar_type(), natten::cpu::na1d_av_backward, @@ -153,7 +181,8 @@ void na1d_av_backward( attn.stride(1), attn.stride(2), kernel_size, - dilation); + dilation, + is_causal); } } // namespace cpu diff --git a/csrc/src/pytorch/cpu/na2d.cpp b/csrc/src/pytorch/cpu/na2d.cpp index b30ac3c..dc8e796 100644 --- a/csrc/src/pytorch/cpu/na2d.cpp +++ b/csrc/src/pytorch/cpu/na2d.cpp @@ -27,26 +27,49 @@ #include #include -#include "natten/cpu/na2d.h" -#include "natten/dtypes.h" -#include "natten/pytorch/cpu/helpers.h" +#include +#include +#include +#include namespace natten { namespace pytorch { namespace cpu { +void na2d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { + // TODO: implement CPU reference + NATTEN_FAILURE("Fused kernels are not available on CPU yet."); +} + void na2d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( query.scalar_type(), natten::cpu::na2d_qk_forward, @@ -64,7 +87,8 @@ void na2d_qk_forward( attn.stride(2), attn.stride(3), kernel_size, - dilation); + dilation, + is_causal); } void na2d_qk_backward( @@ -74,13 +98,14 @@ void na2d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_attn.scalar_type(), natten::cpu::na2d_qk_backward, @@ -101,20 +126,22 @@ void na2d_qk_backward( d_attn.stride(2), d_attn.stride(3), kernel_size, - dilation); + dilation, + is_causal); } void na2d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( attn.scalar_type(), natten::cpu::na2d_av_forward, @@ -131,7 +158,8 @@ void na2d_av_forward( attn.stride(2), attn.stride(3), kernel_size, - dilation); + dilation, + is_causal); } void na2d_av_backward( @@ -140,13 +168,14 @@ void na2d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_out.scalar_type(), natten::cpu::na2d_av_backward, @@ -165,7 +194,8 @@ void na2d_av_backward( attn.stride(2), attn.stride(3), kernel_size, - dilation); + dilation, + is_causal); } } // namespace cpu diff --git a/csrc/src/pytorch/cpu/na3d.cpp b/csrc/src/pytorch/cpu/na3d.cpp index 2d48a14..6c899cd 100644 --- a/csrc/src/pytorch/cpu/na3d.cpp +++ b/csrc/src/pytorch/cpu/na3d.cpp @@ -27,29 +27,51 @@ #include #include -#include "natten/cpu/na3d.h" -#include "natten/dtypes.h" -#include "natten/pytorch/cpu/helpers.h" +#include +#include +#include +#include namespace natten { namespace pytorch { namespace cpu { +void na3d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { + // TODO: implement CPU reference + NATTEN_FAILURE("Fused kernels are not available on CPU yet."); +} + void na3d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation) { + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( query.scalar_type(), natten::cpu::na3d_qk_forward, @@ -70,8 +92,7 @@ void na3d_qk_forward( attn.stride(4), kernel_size, dilation, - depth_kernel_size, - depth_dilation); + is_causal); } void na3d_qk_backward( @@ -81,16 +102,15 @@ void na3d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation) { + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_attn.scalar_type(), natten::cpu::na3d_qk_backward, @@ -114,24 +134,22 @@ void na3d_qk_backward( d_attn.stride(4), kernel_size, dilation, - depth_kernel_size, - depth_dilation); + is_causal); } void na3d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation) { + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( attn.scalar_type(), natten::cpu::na3d_av_forward, @@ -151,8 +169,7 @@ void na3d_av_forward( attn.stride(4), kernel_size, dilation, - depth_kernel_size, - depth_dilation); + is_causal); } void na3d_av_backward( @@ -161,16 +178,15 @@ void na3d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation) { + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_out.scalar_type(), natten::cpu::na3d_av_backward, @@ -192,8 +208,7 @@ void na3d_av_backward( attn.stride(4), kernel_size, dilation, - depth_kernel_size, - depth_dilation); + is_causal); } } // namespace cpu diff --git a/csrc/src/pytorch/cuda/na1d.cu b/csrc/src/pytorch/cuda/na1d.cu index 1c6a188..21b5991 100644 --- a/csrc/src/pytorch/cuda/na1d.cu +++ b/csrc/src/pytorch/cuda/na1d.cu @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -36,20 +37,59 @@ namespace natten { namespace pytorch { namespace cuda { +void na1d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t length, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { + DISPATCH_DTYPE( + query.device().index(), + at::cuda::getCurrentCUDAStream(query.device().index()), + query.scalar_type(), + natten::cuda::na1d_forward, + static_cast(query.data_ptr()), + static_cast(key.data_ptr()), + static_cast(value.data_ptr()), + static_cast(out.data_ptr()), + rpb.has_value() ? static_cast(rpb.value().data_ptr()) : nullptr, + batch_size, + length, + heads, + dim, + kernel_size, + dilation, + is_causal, + attn_scale, + query_tile_size, + key_tile_size); +} + void na1d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( query.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(query.device().index()), query.scalar_type(), natten::cuda::na1d_qk_forward, static_cast(query.data_ptr()), @@ -64,7 +104,8 @@ void na1d_qk_forward( attn.stride(1), attn.stride(2), kernel_size, - dilation); + dilation, + is_causal); } void na1d_qk_backward( @@ -74,15 +115,16 @@ void na1d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_attn.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(query.device().index()), d_attn.scalar_type(), natten::cuda::na1d_qk_backward, static_cast(query.data_ptr()), @@ -100,22 +142,24 @@ void na1d_qk_backward( d_attn.stride(1), d_attn.stride(2), kernel_size, - dilation); + dilation, + is_causal); } void na1d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( attn.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(attn.device().index()), attn.scalar_type(), natten::cuda::na1d_av_forward, static_cast(attn.data_ptr()), @@ -129,7 +173,8 @@ void na1d_av_forward( attn.stride(1), attn.stride(2), kernel_size, - dilation); + dilation, + is_causal); } void na1d_av_backward( @@ -138,15 +183,16 @@ void na1d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int length, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t length, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_out.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(attn.device().index()), d_out.scalar_type(), natten::cuda::na1d_av_backward, static_cast(attn.data_ptr()), @@ -162,7 +208,8 @@ void na1d_av_backward( attn.stride(1), attn.stride(2), kernel_size, - dilation); + dilation, + is_causal); } } // namespace cuda diff --git a/csrc/src/pytorch/cuda/na2d.cu b/csrc/src/pytorch/cuda/na2d.cu index bfa5031..aea1cb0 100644 --- a/csrc/src/pytorch/cuda/na2d.cu +++ b/csrc/src/pytorch/cuda/na2d.cu @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -36,21 +37,62 @@ namespace natten { namespace pytorch { namespace cuda { +void na2d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { + DISPATCH_DTYPE( + query.device().index(), + at::cuda::getCurrentCUDAStream(query.device().index()), + query.scalar_type(), + natten::cuda::na2d_forward, + static_cast(query.data_ptr()), + static_cast(key.data_ptr()), + static_cast(value.data_ptr()), + static_cast(out.data_ptr()), + rpb.has_value() ? static_cast(rpb.value().data_ptr()) : nullptr, + batch_size, + height, + width, + heads, + dim, + kernel_size, + dilation, + is_causal, + attn_scale, + query_tile_size, + key_tile_size); +} + void na2d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( query.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(query.device().index()), query.scalar_type(), natten::cuda::na2d_qk_forward, static_cast(query.data_ptr()), @@ -67,7 +109,8 @@ void na2d_qk_forward( attn.stride(2), attn.stride(3), kernel_size, - dilation); + dilation, + is_causal); } void na2d_qk_backward( @@ -77,16 +120,17 @@ void na2d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_attn.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(query.device().index()), d_attn.scalar_type(), natten::cuda::na2d_qk_backward, static_cast(query.data_ptr()), @@ -106,23 +150,25 @@ void na2d_qk_backward( d_attn.stride(2), d_attn.stride(3), kernel_size, - dilation); + dilation, + is_causal); } void na2d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( attn.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(attn.device().index()), attn.scalar_type(), natten::cuda::na2d_av_forward, static_cast(attn.data_ptr()), @@ -138,7 +184,8 @@ void na2d_av_forward( attn.stride(2), attn.stride(3), kernel_size, - dilation); + dilation, + is_causal); } void na2d_av_backward( @@ -147,16 +194,17 @@ void na2d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation) { + int32_t batch_size, + int32_t heads, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_out.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(attn.device().index()), d_out.scalar_type(), natten::cuda::na2d_av_backward, static_cast(attn.data_ptr()), @@ -174,7 +222,8 @@ void na2d_av_backward( attn.stride(2), attn.stride(3), kernel_size, - dilation); + dilation, + is_causal); } } // namespace cuda diff --git a/csrc/src/pytorch/cuda/na3d.cu b/csrc/src/pytorch/cuda/na3d.cu index ac17349..ce6b6b5 100644 --- a/csrc/src/pytorch/cuda/na3d.cu +++ b/csrc/src/pytorch/cuda/na3d.cu @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -36,24 +37,65 @@ namespace natten { namespace pytorch { namespace cuda { +void na3d_forward( + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + at::Tensor& out, + const at::optional& rpb, + int32_t batch_size, + int32_t depth, + int32_t height, + int32_t width, + int32_t heads, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { + DISPATCH_DTYPE( + query.device().index(), + at::cuda::getCurrentCUDAStream(query.device().index()), + query.scalar_type(), + natten::cuda::na3d_forward, + static_cast(query.data_ptr()), + static_cast(key.data_ptr()), + static_cast(value.data_ptr()), + static_cast(out.data_ptr()), + rpb.has_value() ? static_cast(rpb.value().data_ptr()) : nullptr, + batch_size, + depth, + height, + width, + heads, + dim, + kernel_size, + dilation, + is_causal, + attn_scale, + query_tile_size, + key_tile_size); +} + void na3d_qk_forward( const at::Tensor& query, const at::Tensor& key, const at::optional& bias, at::Tensor& attn, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation) { + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( query.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(query.device().index()), query.scalar_type(), natten::cuda::na3d_qk_forward, static_cast(query.data_ptr()), @@ -73,8 +115,7 @@ void na3d_qk_forward( attn.stride(4), kernel_size, dilation, - depth_kernel_size, - depth_dilation); + is_causal); } void na3d_qk_backward( @@ -84,19 +125,18 @@ void na3d_qk_backward( at::Tensor& d_query, at::Tensor& d_key, at::optional& d_bias, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation) { + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_attn.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(query.device().index()), d_attn.scalar_type(), natten::cuda::na3d_qk_backward, static_cast(query.data_ptr()), @@ -119,27 +159,25 @@ void na3d_qk_backward( d_attn.stride(4), kernel_size, dilation, - depth_kernel_size, - depth_dilation); + is_causal); } void na3d_av_forward( const at::Tensor& attn, const at::Tensor& value, at::Tensor& output, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation) { + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( attn.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(attn.device().index()), attn.scalar_type(), natten::cuda::na3d_av_forward, static_cast(attn.data_ptr()), @@ -158,8 +196,7 @@ void na3d_av_forward( attn.stride(4), kernel_size, dilation, - depth_kernel_size, - depth_dilation); + is_causal); } void na3d_av_backward( @@ -168,19 +205,18 @@ void na3d_av_backward( const at::Tensor& value, at::Tensor& d_attn, at::Tensor& d_value, - const int batch_size, - const int heads, - const int depth, - const int height, - const int width, - const int dim, - const int kernel_size, - const int dilation, - const int depth_kernel_size, - const int depth_dilation) { + int32_t batch_size, + int32_t heads, + int32_t depth, + int32_t height, + int32_t width, + int32_t dim, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { DISPATCH_DTYPE( d_out.device().index(), - at::cuda::getCurrentCUDAStream(), + at::cuda::getCurrentCUDAStream(attn.device().index()), d_out.scalar_type(), natten::cuda::na3d_av_backward, static_cast(attn.data_ptr()), @@ -201,8 +237,7 @@ void na3d_av_backward( attn.stride(4), kernel_size, dilation, - depth_kernel_size, - depth_dilation); + is_causal); } } // namespace cuda diff --git a/csrc/src/pytorch/na1d.cpp b/csrc/src/pytorch/na1d.cpp index 3f82865..597530d 100644 --- a/csrc/src/pytorch/na1d.cpp +++ b/csrc/src/pytorch/na1d.cpp @@ -24,39 +24,92 @@ \brief Neighborhood Attention 1D Torch interface */ -#include "natten/pytorch/cpu/na1d.h" #include #include + +#include +#include #ifdef NATTEN_WITH_CUDA -#include "natten/pytorch/cuda/na1d.cuh" +#include #endif - -#include "natten/pytorch/helpers.h" +#include namespace natten { namespace pytorch { +void na1d_forward( + at::Tensor& out, + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + const at::optional& rpb, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { + CHECK_CONTIGUOUS(query); + CHECK_CONTIGUOUS(key); + CHECK_CONTIGUOUS(value); + CheckArgs(kernel_size, dilation); + CheckIfPropertiesMatch(query, key, value); + CheckIfTensorShapesMatch<1>(query, key); + CheckIfTensorShapesMatch<1>(query, value); + CheckIfTensorShapesMatch<1>(out, value); + int32_t batch_size = query.size(0); + int32_t length = query.size(1); + int32_t heads = query.size(2); + int32_t dim = query.size(3); + CheckArgsAgainstDim({length}, kernel_size, dilation); + if (rpb.has_value()) { + CheckBias<1>(query, rpb.value(), heads, kernel_size); + } + DISPATCH_DEVICE( + query.device(), + na1d_forward, + query, + key, + value, + out, + rpb, + batch_size, + length, + heads, + dim, + kernel_size, + dilation, + is_causal, + attn_scale, + query_tile_size, + key_tile_size); +} + void na1d_qk_forward( at::Tensor& attn, const at::Tensor& query, const at::Tensor& key, const at::optional& bias, - const int kernel_size, - const int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal) || !bias.has_value(), + "Neighborhood attention with causal masking does not support positional biases yet."); CHECK_CONTIGUOUS(query); CHECK_CONTIGUOUS(key); CheckArgs(kernel_size, dilation); CheckIfPropertiesMatch(query, key, attn); CheckIfTensorShapesMatch<1>(query, key); CheckAttnShape<1>(query, attn, kernel_size); + int32_t batch_size = query.size(0); + int32_t heads = query.size(1); + int32_t length = query.size(2); + int32_t dim = query.size(3); + CheckArgsAgainstDim({length}, kernel_size, dilation); if (bias.has_value()) { - CheckBias<1>(query, bias.value(), kernel_size); + CheckBias<1>(query, bias.value(), heads, kernel_size); } - int batch_size = query.size(0); - int heads = query.size(1); - int length = query.size(2); - int dim = query.size(3); - CheckArgsAgainstDim(length, kernel_size, dilation); DISPATCH_DEVICE( query.device(), na1d_qk_forward, @@ -69,7 +122,8 @@ void na1d_qk_forward( length, dim, kernel_size, - dilation); + dilation, + is_causal); } void na1d_qk_backward( @@ -79,8 +133,12 @@ void na1d_qk_backward( const at::Tensor& d_attn, const at::Tensor& query, const at::Tensor& key, - const int kernel_size, - const int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal) || !d_bias.has_value(), + "Neighborhood attention with causal masking does not support positional biases yet."); CHECK_CONTIGUOUS(d_query); CHECK_CONTIGUOUS(d_key); CHECK_CONTIGUOUS(query); @@ -92,14 +150,14 @@ void na1d_qk_backward( CheckIfTensorShapesMatch<1>(d_query, d_key); CheckIfTensorShapesMatch<1>(query, d_key); CheckAttnShape<1>(query, d_attn, kernel_size); + int32_t batch_size = query.size(0); + int32_t heads = query.size(1); + int32_t length = query.size(2); + int32_t dim = query.size(3); + CheckArgsAgainstDim({length}, kernel_size, dilation); if (d_bias.has_value()) { - CheckBias<1>(query, d_bias.value(), kernel_size); + CheckBias<1>(query, d_bias.value(), heads, kernel_size); } - int batch_size = query.size(0); - int heads = query.size(1); - int length = query.size(2); - int dim = query.size(3); - CheckArgsAgainstDim(length, kernel_size, dilation); DISPATCH_DEVICE( d_attn.device(), na1d_qk_backward, @@ -114,26 +172,28 @@ void na1d_qk_backward( length, dim, kernel_size, - dilation); + dilation, + is_causal); } void na1d_av_forward( at::Tensor& out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { CHECK_CONTIGUOUS(out); CHECK_CONTIGUOUS(value); CheckArgs(kernel_size, dilation); CheckIfPropertiesMatch(out, value, attn); CheckIfTensorShapesMatch<1>(out, value); CheckAttnShape<1>(value, attn, kernel_size); - int batch_size = value.size(0); - int heads = value.size(1); - int length = value.size(2); - int dim = value.size(3); - CheckArgsAgainstDim(length, kernel_size, dilation); + int32_t batch_size = value.size(0); + int32_t heads = value.size(1); + int32_t length = value.size(2); + int32_t dim = value.size(3); + CheckArgsAgainstDim({length}, kernel_size, dilation); DISPATCH_DEVICE( attn.device(), na1d_av_forward, @@ -145,7 +205,8 @@ void na1d_av_forward( length, dim, kernel_size, - dilation); + dilation, + is_causal); } void na1d_av_backward( @@ -154,8 +215,9 @@ void na1d_av_backward( const at::Tensor& d_out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { CHECK_CONTIGUOUS(d_out); CHECK_CONTIGUOUS(d_value); CHECK_CONTIGUOUS(value); @@ -166,11 +228,11 @@ void na1d_av_backward( CheckIfTensorShapesMatch<1>(attn, d_attn); CheckIfTensorShapesMatch<1>(value, d_out); CheckAttnShape<1>(value, attn, kernel_size); - int batch_size = value.size(0); - int heads = value.size(1); - int length = value.size(2); - int dim = value.size(3); - CheckArgsAgainstDim(length, kernel_size, dilation); + int32_t batch_size = value.size(0); + int32_t heads = value.size(1); + int32_t length = value.size(2); + int32_t dim = value.size(3); + CheckArgsAgainstDim({length}, kernel_size, dilation); DISPATCH_DEVICE( attn.device(), na1d_av_backward, @@ -184,7 +246,8 @@ void na1d_av_backward( length, dim, kernel_size, - dilation); + dilation, + is_causal); } } // namespace pytorch diff --git a/csrc/src/pytorch/na2d.cpp b/csrc/src/pytorch/na2d.cpp index 37382f1..d1bc8e5 100644 --- a/csrc/src/pytorch/na2d.cpp +++ b/csrc/src/pytorch/na2d.cpp @@ -24,41 +24,95 @@ \brief Neighborhood Attention 2D Torch interface */ -#include "natten/pytorch/cpu/na2d.h" #include #include + +#include +#include #ifdef NATTEN_WITH_CUDA -#include "natten/pytorch/cuda/na2d.cuh" +#include #endif - -#include "natten/pytorch/helpers.h" +#include namespace natten { namespace pytorch { +void na2d_forward( + at::Tensor& out, + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + const at::optional& rpb, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { + CHECK_CONTIGUOUS(query); + CHECK_CONTIGUOUS(key); + CHECK_CONTIGUOUS(value); + CheckArgs(kernel_size, dilation); + CheckIfPropertiesMatch(query, key, value); + CheckIfTensorShapesMatch<2>(query, key); + CheckIfTensorShapesMatch<2>(query, value); + CheckIfTensorShapesMatch<2>(out, value); + int32_t batch_size = query.size(0); + int32_t height = query.size(1); + int32_t width = query.size(2); + int32_t heads = query.size(3); + int32_t dim = query.size(4); + CheckArgsAgainstDim({height, width}, kernel_size, dilation); + if (rpb.has_value()) { + CheckBias<2>(query, rpb.value(), heads, kernel_size); + } + DISPATCH_DEVICE( + query.device(), + na2d_forward, + query, + key, + value, + out, + rpb, + batch_size, + height, + width, + heads, + dim, + kernel_size, + dilation, + is_causal, + attn_scale, + query_tile_size, + key_tile_size); +} + void na2d_qk_forward( at::Tensor& attn, const at::Tensor& query, const at::Tensor& key, const at::optional& bias, - const int kernel_size, - const int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal) || !bias.has_value(), + "Neighborhood attention with causal masking does not support positional biases yet."); CHECK_CONTIGUOUS(query); CHECK_CONTIGUOUS(key); CheckArgs(kernel_size, dilation); CheckIfPropertiesMatch(query, key, attn); CheckIfTensorShapesMatch<2>(query, key); CheckAttnShape<2>(query, attn, kernel_size); + int32_t batch_size = query.size(0); + int32_t heads = query.size(1); + int32_t height = query.size(2); + int32_t width = query.size(3); + int32_t dim = query.size(4); + CheckArgsAgainstDim({height, width}, kernel_size, dilation); if (bias.has_value()) { - CheckBias<2>(query, bias.value(), kernel_size); + CheckBias<2>(query, bias.value(), heads, kernel_size); } - int batch_size = query.size(0); - int heads = query.size(1); - int height = query.size(2); - int width = query.size(3); - int dim = query.size(4); - CheckArgsAgainstDim(height, kernel_size, dilation); - CheckArgsAgainstDim(width, kernel_size, dilation); DISPATCH_DEVICE( query.device(), na2d_qk_forward, @@ -72,7 +126,8 @@ void na2d_qk_forward( width, dim, kernel_size, - dilation); + dilation, + is_causal); } void na2d_qk_backward( @@ -82,8 +137,12 @@ void na2d_qk_backward( const at::Tensor& d_attn, const at::Tensor& query, const at::Tensor& key, - const int kernel_size, - const int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal) || !d_bias.has_value(), + "Neighborhood attention with causal masking does not support positional biases yet."); CHECK_CONTIGUOUS(d_query); CHECK_CONTIGUOUS(d_key); CHECK_CONTIGUOUS(query); @@ -95,16 +154,15 @@ void na2d_qk_backward( CheckIfTensorShapesMatch<2>(d_query, d_key); CheckIfTensorShapesMatch<2>(query, d_key); CheckAttnShape<2>(query, d_attn, kernel_size); + int32_t batch_size = query.size(0); + int32_t heads = query.size(1); + int32_t height = query.size(2); + int32_t width = query.size(3); + int32_t dim = query.size(4); + CheckArgsAgainstDim({height, width}, kernel_size, dilation); if (d_bias.has_value()) { - CheckBias<2>(query, d_bias.value(), kernel_size); + CheckBias<2>(query, d_bias.value(), heads, kernel_size); } - int batch_size = query.size(0); - int heads = query.size(1); - int height = query.size(2); - int width = query.size(3); - int dim = query.size(4); - CheckArgsAgainstDim(height, kernel_size, dilation); - CheckArgsAgainstDim(width, kernel_size, dilation); DISPATCH_DEVICE( d_attn.device(), na2d_qk_backward, @@ -120,28 +178,29 @@ void na2d_qk_backward( width, dim, kernel_size, - dilation); + dilation, + is_causal); } void na2d_av_forward( at::Tensor& out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { CHECK_CONTIGUOUS(out); CHECK_CONTIGUOUS(value); CheckArgs(kernel_size, dilation); CheckIfPropertiesMatch(out, value, attn); CheckIfTensorShapesMatch<2>(out, value); CheckAttnShape<2>(value, attn, kernel_size); - int batch_size = value.size(0); - int heads = value.size(1); - int height = value.size(2); - int width = value.size(3); - int dim = value.size(4); - CheckArgsAgainstDim(height, kernel_size, dilation); - CheckArgsAgainstDim(width, kernel_size, dilation); + int32_t batch_size = value.size(0); + int32_t heads = value.size(1); + int32_t height = value.size(2); + int32_t width = value.size(3); + int32_t dim = value.size(4); + CheckArgsAgainstDim({height, width}, kernel_size, dilation); DISPATCH_DEVICE( attn.device(), na2d_av_forward, @@ -154,7 +213,8 @@ void na2d_av_forward( width, dim, kernel_size, - dilation); + dilation, + is_causal); } void na2d_av_backward( @@ -163,8 +223,9 @@ void na2d_av_backward( const at::Tensor& d_out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { CHECK_CONTIGUOUS(d_out); CHECK_CONTIGUOUS(d_value); CHECK_CONTIGUOUS(value); @@ -175,13 +236,12 @@ void na2d_av_backward( CheckIfTensorShapesMatch<2>(attn, d_attn); CheckIfTensorShapesMatch<2>(value, d_out); CheckAttnShape<2>(value, attn, kernel_size); - int batch_size = d_out.size(0); - int heads = d_out.size(1); - int height = d_out.size(2); - int width = d_out.size(3); - int dim = d_out.size(4); - CheckArgsAgainstDim(height, kernel_size, dilation); - CheckArgsAgainstDim(width, kernel_size, dilation); + int32_t batch_size = d_out.size(0); + int32_t heads = d_out.size(1); + int32_t height = d_out.size(2); + int32_t width = d_out.size(3); + int32_t dim = d_out.size(4); + CheckArgsAgainstDim({height, width}, kernel_size, dilation); DISPATCH_DEVICE( attn.device(), na2d_av_backward, @@ -196,7 +256,8 @@ void na2d_av_backward( width, dim, kernel_size, - dilation); + dilation, + is_causal); } } // namespace pytorch diff --git a/csrc/src/pytorch/na3d.cpp b/csrc/src/pytorch/na3d.cpp index a185e3f..8124e2f 100644 --- a/csrc/src/pytorch/na3d.cpp +++ b/csrc/src/pytorch/na3d.cpp @@ -24,46 +24,98 @@ \brief Neighborhood Attention 3D Torch interface */ -#include "natten/pytorch/cpu/na3d.h" #include #include + +#include +#include #ifdef NATTEN_WITH_CUDA -#include "natten/pytorch/cuda/na3d.cuh" +#include #endif - -#include "natten/pytorch/helpers.h" +#include namespace natten { namespace pytorch { +void na3d_forward( + at::Tensor& out, + const at::Tensor& query, + const at::Tensor& key, + const at::Tensor& value, + const at::optional& rpb, + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal, + float attn_scale, + const std::tuple& query_tile_size, + const std::tuple& key_tile_size) { + CHECK_CONTIGUOUS(query); + CHECK_CONTIGUOUS(key); + CHECK_CONTIGUOUS(value); + CheckArgs(kernel_size, dilation); + CheckIfPropertiesMatch(query, key, value); + CheckIfTensorShapesMatch<3>(query, key); + CheckIfTensorShapesMatch<3>(query, value); + CheckIfTensorShapesMatch<3>(out, value); + int32_t batch_size = query.size(0); + int32_t depth = query.size(1); + int32_t height = query.size(2); + int32_t width = query.size(3); + int32_t heads = query.size(4); + int32_t dim = query.size(5); + CheckArgsAgainstDim({depth, height, width}, kernel_size, dilation); + if (rpb.has_value()) { + CheckBias<3>(query, rpb.value(), heads, kernel_size); + } + DISPATCH_DEVICE( + query.device(), + na3d_forward, + query, + key, + value, + out, + rpb, + batch_size, + depth, + height, + width, + heads, + dim, + kernel_size, + dilation, + is_causal, + attn_scale, + query_tile_size, + key_tile_size); +} + void na3d_qk_forward( at::Tensor& attn, const at::Tensor& query, const at::Tensor& key, const at::optional& bias, - const int kernel_size, - const int dilation, - const int kernel_size_d, - const int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal) || !bias.has_value(), + "Neighborhood attention with causal masking does not support positional biases yet."); CHECK_CONTIGUOUS(query); CHECK_CONTIGUOUS(key); CheckArgs(kernel_size, dilation); - CheckArgs(kernel_size_d, dilation_d); CheckIfPropertiesMatch(query, key, attn); CheckIfTensorShapesMatch<3>(query, key); - CheckAttnShape<3>(query, attn, kernel_size, kernel_size_d); + CheckAttnShape<3>(query, attn, kernel_size); + int32_t batch_size = query.size(0); + int32_t heads = query.size(1); + int32_t depth = query.size(2); + int32_t height = query.size(3); + int32_t width = query.size(4); + int32_t dim = query.size(5); + CheckArgsAgainstDim({depth, height, width}, kernel_size, dilation); if (bias.has_value()) { - CheckBias<3>(query, bias.value(), kernel_size, kernel_size_d); + CheckBias<3>(query, bias.value(), heads, kernel_size); } - int batch_size = query.size(0); - int heads = query.size(1); - int depth = query.size(2); - int height = query.size(3); - int width = query.size(4); - int dim = query.size(5); - CheckArgsAgainstDim(depth, kernel_size_d, dilation_d); - CheckArgsAgainstDim(height, kernel_size, dilation); - CheckArgsAgainstDim(width, kernel_size, dilation); DISPATCH_DEVICE( query.device(), na3d_qk_forward, @@ -79,8 +131,7 @@ void na3d_qk_forward( dim, kernel_size, dilation, - kernel_size_d, - dilation_d); + is_causal); } void na3d_qk_backward( @@ -90,34 +141,33 @@ void na3d_qk_backward( const at::Tensor& d_attn, const at::Tensor& query, const at::Tensor& key, - const int kernel_size, - const int dilation, - const int kernel_size_d, - const int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { + NATTEN_CHECK( + !any_true(is_causal) || !d_bias.has_value(), + "Neighborhood attention with causal masking does not support positional biases yet."); CHECK_CONTIGUOUS(d_query); CHECK_CONTIGUOUS(d_key); CHECK_CONTIGUOUS(query); CHECK_CONTIGUOUS(key); CheckArgs(kernel_size, dilation); - CheckArgs(kernel_size_d, dilation_d); CheckIfPropertiesMatch(query, key); CheckIfPropertiesMatch(d_query, d_key, d_attn); CheckIfTensorShapesMatch<3>(query, key); CheckIfTensorShapesMatch<3>(d_query, d_key); CheckIfTensorShapesMatch<3>(query, d_key); - CheckAttnShape<3>(query, d_attn, kernel_size, kernel_size_d); + CheckAttnShape<3>(query, d_attn, kernel_size); + int32_t batch_size = query.size(0); + int32_t heads = query.size(1); + int32_t depth = query.size(2); + int32_t height = query.size(3); + int32_t width = query.size(4); + int32_t dim = query.size(5); + CheckArgsAgainstDim({depth, height, width}, kernel_size, dilation); if (d_bias.has_value()) { - CheckBias<3>(query, d_bias.value(), kernel_size, kernel_size_d); + CheckBias<3>(query, d_bias.value(), heads, kernel_size); } - int batch_size = query.size(0); - int heads = query.size(1); - int depth = query.size(2); - int height = query.size(3); - int width = query.size(4); - int dim = query.size(5); - CheckArgsAgainstDim(depth, kernel_size_d, dilation_d); - CheckArgsAgainstDim(height, kernel_size, dilation); - CheckArgsAgainstDim(width, kernel_size, dilation); DISPATCH_DEVICE( d_attn.device(), na3d_qk_backward, @@ -135,34 +185,29 @@ void na3d_qk_backward( dim, kernel_size, dilation, - kernel_size_d, - dilation_d); + is_causal); } void na3d_av_forward( at::Tensor& out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation, - const int kernel_size_d, - const int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { CHECK_CONTIGUOUS(out); CHECK_CONTIGUOUS(value); CheckArgs(kernel_size, dilation); - CheckArgs(kernel_size_d, dilation_d); CheckIfPropertiesMatch(out, value, attn); CheckIfTensorShapesMatch<3>(out, value); - CheckAttnShape<3>(value, attn, kernel_size, kernel_size_d); - int batch_size = value.size(0); - int heads = value.size(1); - int depth = value.size(2); - int height = value.size(3); - int width = value.size(4); - int dim = value.size(5); - CheckArgsAgainstDim(depth, kernel_size_d, dilation_d); - CheckArgsAgainstDim(height, kernel_size, dilation); - CheckArgsAgainstDim(width, kernel_size, dilation); + CheckAttnShape<3>(value, attn, kernel_size); + int32_t batch_size = value.size(0); + int32_t heads = value.size(1); + int32_t depth = value.size(2); + int32_t height = value.size(3); + int32_t width = value.size(4); + int32_t dim = value.size(5); + CheckArgsAgainstDim({depth, height, width}, kernel_size, dilation); DISPATCH_DEVICE( attn.device(), na3d_av_forward, @@ -177,8 +222,7 @@ void na3d_av_forward( dim, kernel_size, dilation, - kernel_size_d, - dilation_d); + is_causal); } void na3d_av_backward( @@ -187,30 +231,26 @@ void na3d_av_backward( const at::Tensor& d_out, const at::Tensor& attn, const at::Tensor& value, - const int kernel_size, - const int dilation, - const int kernel_size_d, - const int dilation_d) { + const std::tuple& kernel_size, + const std::tuple& dilation, + const std::tuple& is_causal) { CHECK_CONTIGUOUS(d_out); CHECK_CONTIGUOUS(d_value); CHECK_CONTIGUOUS(value); CheckArgs(kernel_size, dilation); - CheckArgs(kernel_size_d, dilation_d); CheckIfPropertiesMatch(attn, value); CheckIfPropertiesMatch(d_attn, d_value, d_out); CheckIfTensorShapesMatch<3>(value, d_value); CheckIfTensorShapesMatch<3>(attn, d_attn); CheckIfTensorShapesMatch<3>(value, d_out); - CheckAttnShape<3>(value, attn, kernel_size, kernel_size_d); - int batch_size = d_out.size(0); - int heads = d_out.size(1); - int depth = d_out.size(2); - int height = d_out.size(3); - int width = d_out.size(4); - int dim = d_out.size(5); - CheckArgsAgainstDim(depth, kernel_size_d, dilation_d); - CheckArgsAgainstDim(height, kernel_size, dilation); - CheckArgsAgainstDim(width, kernel_size, dilation); + CheckAttnShape<3>(value, attn, kernel_size); + int32_t batch_size = d_out.size(0); + int32_t heads = d_out.size(1); + int32_t depth = d_out.size(2); + int32_t height = d_out.size(3); + int32_t width = d_out.size(4); + int32_t dim = d_out.size(5); + CheckArgsAgainstDim({depth, height, width}, kernel_size, dilation); DISPATCH_DEVICE( attn.device(), na3d_av_backward, @@ -227,8 +267,7 @@ void na3d_av_backward( dim, kernel_size, dilation, - kernel_size_d, - dilation_d); + is_causal); } } // namespace pytorch diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..d02307b --- /dev/null +++ b/docs/README.md @@ -0,0 +1,20 @@ +![NATTENLogo](../assets/natten_dark.png#gh-dark-mode-only) ![NATTENLogo](../assets/natten_light.png#gh-light-mode-only) + +Welcome to NATTEN docs! + +* [What is NATTEN and why does it exist?](history.md) +* [How is Neigborhood Attention implemented?](methodology/README.md) +* [How do I install NATTEN?](install.md) +* [Front-end](frontend.md) + * Describes how to check NATTEN's compatibility with your system, and its available features. + * Describes how to use torch modules `NeighborhoodAttention1D`, `NeighborhoodAttention2D`, and `NeighborhoodAttention3D`. + * Describes when and how to use ops directly instead of modules. +* [API](api.md) + * Describes the current C++ API structure. +* [Backend](backend.md) + * Overview of different implementations, and available framework extensions. + * Implementation details and limitations. + * Dispatch mechanism and auto-generated instantiations. +* [Build system](build.md) +* [Tests](tests.md) +* [Changelog](../CHANGELOG.md) diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 0000000..2900a58 --- /dev/null +++ b/docs/api.md @@ -0,0 +1,95 @@ +## C++ API + +NOTE: this page is still a work in progress. + +### PyTorch Bindings + +#### FNA + +```cpp +// Forward pass +void na*d_forward( + Tensor output, + Tensor query, + Tensor key, + Tensor value, + optional rel_pos_bias, + Tuple kernel_size, + Tuple dilation, + BooleanTuple is_causal, + float attn_scale, + Tuple query_tile_size, + Tuple key_tile_size); +``` + +Notes: +* `Tuple` and `BooleanTuple` instances must have the same size as the NA rank (i.e. `tuple` and `tuple` + for NA-2D.) +* `query_tile_size` and `key_tile_size` will be REMOVED in the near future. Their sole purpose is to allow auto-tuner (written + in Python) to pick the tiling configuration. If feasible, auto-tuner should be moved into libnatten; otherwise the tiling + config must switch to enums instead of exposing the literal tile sizes to the users. If invalid tile sizes are input, the + final FNA dispatchers will fail to find a matching kernel, and raise an error. + +#### BMM-style NA + +##### QK operation + +```cpp +// Forward pass +void na*d_qk_forward( + Tensor attn, + Tensor query, + Tensor key, + optional rel_pos_bias, + Tuple kernel_size, + Tuple dilation, + BooleanTuple is_causal); + +// Backward pass +void na*d_qk_backward( + Tensor d_query, // Output + Tensor d_key, // Output + optional d_rel_pos_bias, // Optional output + Tensor d_attn, + Tensor query, + Tensor key, + Tuple kernel_size, + Tuple dilation, + BooleanTuple is_causal); +``` + +Notes: +* `Tuple` and `BooleanTuple` instances must have the same size as the NA rank (i.e. `tuple` and `tuple` + for NA-2D.) + +##### PV (AV) operation + +```cpp +// Forward pass +void na*d_av_forward( + Tensor output, + Tensor attn, + Tensor value, + Tuple kernel_size, + Tuple dilation, + BooleanTuple is_causal); + +// Backward pass +void na*d_av_backward( + Tensor d_attn, // Output + Tensor d_value, // Output + Tensor d_out, + Tensor attn, + Tensor value, + Tuple kernel_size, + Tuple dilation, + BooleanTuple is_causal); +``` + +Notes: +* `Tuple` and `BooleanTuple` instances must have the same size as the NA rank (i.e. `tuple` and `tuple` + for NA-2D.) + + +### Operators +TBD. diff --git a/docs/assets/batched_gemm_na_dark.png b/docs/assets/batched_gemm_na_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf702099e68033fe9f0dee0eeb2301b2bcfd4e0 GIT binary patch literal 253611 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 RRd5^GW3zAPFJIx3{ts^lpDF+V literal 0 HcmV?d00001 diff --git a/docs/assets/batched_gemm_na_light.png b/docs/assets/batched_gemm_na_light.png new file mode 100644 index 0000000000000000000000000000000000000000..fb886c3ae3cc0c27c93428165fef3f4c3c48bf6a GIT binary patch literal 252970 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Ť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

;0v@qS)c4RMn{ulX*wfH_z>l%^+pm9M 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Ν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

_(Lum7n&7CwS~x${6hd3?h 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≠0vL9AmrmSap^qS$65BrvAEkkIfEfqx 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

Ou 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 Hva9&HxTA_fuMQ!g_NhCwE zM5u8SqRN~LO_Q-wNqt!-cD80hmHKMtqHWb)zJ0frkpCIuNHmdz5gB^WWaTVLD{rMR$=i%qFcm6(ai?}qV;YMLFMYz$MXuG8V^kyRl!V{#On7O2$_tyd){xux9e#O@oZ;b?dAPQ$C$V67wr$)^2>aDaQ#*}XH z=J@)6@FZ}@@E1dh+qKnu5G27j&xh!-rM`YM553@qC+l`Qo5^54dlh#!f3e3(eN8Bo z#ProKB`U_GfpMTQvC6SJSp4JVPkwom^Uq`^ecPemv_+_cOX_CCi$PkbCQ~(3ni=9a zeZQRvz>p=S6wB^u6@i~aCHfN6lOd1WhZAhaVlNYtu5Mpkw}52eqo20e+DQ#+UB1Xs zL<|b!y#~2Z+-l)Y4)kjkQj5>u@mBUw1X=`weem7>nH@wOs};^SLxHcn)I4y|;uQo2`lYxxZ+Lbk-c}FAWz9{7 zzr_=6R(OkhL|Ae+GxZ-D06_@v{pyE{+O{RR#@+mAjRo5VM%=vgE{{mav~>2Z1iA9+ z7Xo4?i*OhRSWH|G9Jem05JXM`ta@m`u{Q)V?!_R$DT?PR?O`A0VS~vOFhwFzbHuly z{-(pahPo!;|KX2XY8~~1uBz9}i4)u+=3A+xR?(hZgnl>|okZ+5naTe(*T3fg-F!u+ zjjm{YayPyJnpSkD4&!V^F9)WK_;%$9!j7>;A*sqr2G&^ZY)5=-fEFr`oIRM^>qHQX?+*ef2F3Fs&3fjq0J6;asXexL-H)luWn;^&Iq6bc=i;b7}g=vlQzu27e z84JyFyiF~}T3GpU=j_b{@eZRbN-<);sV)3vj=awldBa^m!?Zr8msgDagQyw%bei@0 z+V@ffMQYp6u8yywJ7hI|jbEv2{LwL7uC-o#CMe?(1nz?#z_b&uMu%fm7FbMROKUPT zK)ZxTbx}^sBt`e`C<{uemVsizGYBxKHqa5{nD$#^e?Sn? z@&h+pb_J}oToQZvs?)Wv3T2O7|jV9s=$lS)EIbzE?^#e8i3Bm{fV|ZawL#9 zh3-#MQNdoX`Zib|O=uD+5e&`Jxxd4;voscXg>5B3RV4l)kN&_-vS1$=iAulNsbc*; zCEDZL1&*}6mDf)g6HHY>{yD8gb&UxAsXd$*$F5dZ<3m6lyDwUyfrZCWW6@IXeq5zz zGE10n+36li~j0VIZ(ofCsP+&N>^Yo*gA+H9$6JcR~9Dq!Ud=La`#+qQDt9xH3Vb5H& ziFw#bGc1Ga@Eg#f>)AmP)a)CK4)z9>D+m0FJ_;Zv+WY)?9TtI(hmD0$KY@y9wn0IR z#6!#0T_a_l1tyM1qLb};*B&x7j2E-zWkO?imcElW-eQ8$gzFH~mewh@y2Z^v#Wx4y zQ)e~DV?G_>0)M7Z3P%ZYTd#3%{u(2xdC=Y8P(oY6_&iD-<{NikSX*W)Yn*?gYC~=_2i}`kF1*3NL3jMR-&6>I{ibMrVrgP62Tb(r zP!OfGB<&qUdQr(Vp)AzzpCmPYEJ)IGCA%FV)9*3u?${k0UM}hBczN~hqe6#4&Zb=< zGB{VuzHkv|`cM)R<0bNom*DW8E9kfZdFfd*MFghZxJB^etcE>WzuC(%$DLuCtLJWe z(_+PPP4U~iKRIu`t8Ax`(AUj0ICxUyHm^xON_^2?Dmv*TmzDlcRs-Y%qbYH!DB_I~ zjrPGGAn&gCOJ(y0$4Xa^}>W96#I*-KH|3>l)sucbFVLTq8j^$MZ$2PG2vFf4oLltC&lbI8BF2bC72!f zx%*PfW6xLN3%Dtxs(HH-*VNy|@2}Yg=;!7vt?Iwq)q{Jh!E>sk)v$aU{2FA@56ndu zA`=Z;VMm?EO+_xW|NnuVY^50K}Adc{eIvz-(=I?VfrYuBt9u$mlyqjW1=7 zecIjDAE~*qF2C|~fK-tPp)wL-kfVI!?K2i%I@2M=HNA?qR`zv2kU}=^w+o7||CWfUpK|xZ{;EJ7MNxUm@z4>GL1`1asy&}bkgJ@JgmM892*0iG@ zV|3;aL3c`jpACJ_5h|Fi#RXZlaeJe~!kDFuh&kARrhp3zsQm0>WB4{zwOLkT!0THh zH~gz~p=gwAr#%b{s!J}F2NZy05vsL)Oux4C!JHiB^yR1_nc_+?hxYV)#b-QxWb2RU z3DLuvLN-Y0= z@isbu`{?Z$Un=7_Ye#KBShiZdFpkFFpAO6Tb5#45;000mh6s4&S}?pO}i+?)4WZ`%B!|JLctVa}^S zdai1cI|36MvVB$=h4&~FW9$*I6#EU!0rjz`-BmG0{lc%9%OWZSI!d&EzI5zhAFiPe zhJ$t9VKDjN#9{w9|`rE7LPl`e`|agAN?VL@tYjb z4HssG>^|rmOF(kRLl~fDab?BFjv37_r$<4gcpIg1BZ>z{Qj1G zH;;G)W+FqU0EBEe|DJ2e-I$N_Y373uP_4EAFIJpEepL`&`}V>g%>m-bZ-XlD9I4pk z_D_FK*%+&P4BO{xT|Am2(2$Sh%W5V5s*V_>D>^5pyo<6>`jgf?V;4MC()O76 zgs65@p6YN{KOp7{O=nY5tUEPGTx!1n-oW*puFGu9_LmbWyZJx$GX73!w3iBp5^ptD z+Np%a%Ngc+{z}Ve7CKlFiO2flKO!7CFKmmRizQjX&4^JzOh|V51HQ;5CG{;eN|%K_ ztz0Tyv>oGFyho&MZYId@A`BQJ_(z)a+UBz9`ALG`KC$a6sZrJ3@RS-#SO9v6K=ud- zUgyjBt#c7Khs5b!{R=QfvBl<;-LZteK@CAh0eZ)cP%aDU23j zXraYchx2NJhf#D!+#7y?-nhC1_Crc3&61IRXUIYnZuAehxF?D7Twhg}CntNSGP-+G<~XJ#MC}N+v=D z>~jvN1{GOqr+cYEH8NFN8B4;(f-78N`E2@8X@zs^?EbB*Q!kD5p9t z+BGWbT0E;;SD-}#x@+r_?nRh{tKTu62ZeT@jBVJe*t}2=TwU}(sf?@Go6a@nf{G## zuV|N&73F62j#?av3`M~jqiK4nK-IV7boNpPwNK#FJYM_3irTwRaBmZb1b%_W0yUqe z$9?UlfHjKDldD#e&rAMYg!V64qLrm6sG&el%eh(iQVbq8Z;(b(>F*cFY!zZW4%y#~ zXm^fVsrQK&P)wO)2m}`gQn?~EZvu#?x-q}~{&drnShXeJP?kSpL9pq;bNQE(y1MQ; zAl$F_F)vbXat#ue$q})pH<#XAFN2P27tL6f@&X_RAA7Mm$mu4vOh-QpeU5lcxNwY!HS6PC3)leB{VJlprab z&rX&}9=P*)JTYHC<}SNWLl2v{2PY|^h6K}X5~OFmj(~euokaspC4`tZkT{ZQz+J*O z3cz-zJ-|1tC#E&Aafr2Dd!dT@{kt#GPdx1FFftU zoyUsDIJ#}D82TiXcM(Xx*n1WE;mXKH#ZkRq50h&mJIc{aBVttK(i)*sUVY!4i{0ol zSctH6JvIv_(I0$R@=#pW-(ZiX`y3fimUz10;s_+r@BRr`f}8U-y#8#Puy&Ho*(6{jjAcQKFl6Z zg#S7~K%o#qLj^T}f^u$Ev%yPU$aAXyUF-(dBYjo6`SZ7U>L#V%lqKF`gx?wf{>bRkN`Jzh((SJ+1^1;A$Q4@)|t&U-Dg4gzpehRJM zdM=gnpq_P4UkC5`X4txQFU^(yFFIpCfm|sdQe}I_;AdK}#dN=4SxcpGoxjKo(iBi{ z+o#K*R1kz~g4`e%RE6D-X5CjS^$?dl5E!7a!S5XSn!OpnB6<283k!qp3P z@jk-3#hJNoQDey`D6+}cZ`;FCw=d~zb6y*D>)Qer1f3mP@u1Ea5@ zh1%?UmzJuv3I9gboTXb4dvT)+bK}--z1b`^D(zr0b+N}!l&SJ>U6aF$Zt6#LKoC!>SekW~lF+rKtoMtYg4x=m4AF@Ax=la@@J_WpcoH-}b z;=U~m3e`QrmNI34n_***65t=o6;i*fr~C9FkEJMZ6QGPcijw^547}vtB|%y!;%p4x z3|)m)E)6VZG%Ho9;eOU=(u)3wAD=fj<&#+j$DT^x(nAaxF3mf-U`^F9cS?$hkc-{l z2QIkh7-rkvR34$WV}N@SqEv!H4hrdld(tp(A(6KZ+vz`(^e!+pxP&r}521tg`P^VC z-124b*PiTACSIgk3JlPcKHH_OBjTd2V@AjRC%@smt_(}3#LYWfHtG8|qiO9mx>3gK zc@|K#)vx&uG{DEQww-EOnBV-%5lrl9A}pp+I+4-aQtqAj_18N8-Q~^Ywy$jm3q7yAKfZeDB+?=vrTiYBm5B^wn;=NF zI#HAj-*p-K=ie{rIyYT}ZVQJLzwkc9OB51a)6k>MaW(sgZ{u z@9^$$(LW)gA)Y#lwy=x9S!k;$d)3Ca zr|y9>9yUM2Tz=xZLa1UNK1?GurtLcMR~r@Rq!V4IU5STUeukZ z;UjX-`NtQ=jyQP|(s%oZJ8h1bA)FpvXvQBSZ~dgDsbko)v<09yq1xkXuRFIVSVkLC zjzI#&C~NzS86J~nwcG*?yw85Rt)_RVVhsWu58edy=A9;r*wvw?0a-gY9nOLP#!&1YwxDTr?Bt4hiE|}mn+TC>+LoM(P6Yp-?y zMMP%k5g`s6=MLpIA^zoG6#*XTNA_Il3SuR^vV`x2E?6njvZ+~KnvWfWI7IG{Z_Op@ zn?(4+gRA!X|ET+$11~gJz4cyN7=HM%ByJr8#9`~VP)cshvEdDT+HZc}n((B5H-8Xp zAdl;k#V6>(3hFRfa$o5Foex$wT9`UgL`EaUrKt@1S8`x>5<=t-G&XQ$^%_?Aeix6y~cQr5i= zDYlUm;V@M$q%`0XAgnC33wjQ{mk!qhwu9axW7Mk*uTKxmcIO=BWF4k6Su7`ZsKF$!2?i{+i8FD~k$f0wHZ=Rp%d49oN=N&5+Sgxz8?&4#X(XXzfkzZd76Pr;CFtV9_w3MtZ?MDMG3NY=~#IE)W#qwhqJPno25!1ZfK_xO6>NP0l>! zEGR-H({?rnFsF{dcK=$tUhEB^Y{rgD+^aIsnvm9#I5IN+n_w(+&+m#Ym!(aqe#JmrF{l+wd0XE;}f*$IqMGUPD17MiB(C%jRMUWR{Gwuj44d<=`1-o36G#-b;=x z@Kw>%znt>rIsAYhZ!L6t7=68Ocl<}cCx_QYsy_y;x55sAZkk-CH^^Hr)r$=hirfx7 zvW%rMw|nVrmpF+OWRjb*c42Vr-4vm+^-A?4=9EuU+T6}5Uw?;w)2CHpMbFSlg+%)h zo!ZE;RIB9%`!%UxIcb;4`%*4(*@dt$8oiuA5M%@ohoiNu9lJyldkZ((vSXcpOW3z) z6MoF_P8pFGO;nTgM><9)$zg^{GcYq zX}>i>hmw>(&E2}4ohrTQE6<1pjB!yt4DE}PN&%&wIDv(d|AbW&>%Rq^D6i2Pi#Bzw z*=gEv)dI7H)IN-x6-r$l>mg$ZP$&BVvRWk}N#uOG@C`GNk?h z95Pr+G08Q!UwuK070UZOMAjfX8K@5ftPtes92nJs&!zX06p^pa>gC}LA{^I(!B#Bc4EXy)e@R+)~~l5WD%6uN&;@fRrvmd64<8 zA8rLhI$O_|d6zqpcWDgBgmZw2KZgeAT;ALmOJwc|o5xQ1OKm^ZU1*5xBbzs5xL*q) zUHe_T-#pooyc^z6G|pWZS$WIrxGSgcI@;Bxz$G(4$wNJ>^zvo#%m2J@6#ieCO7GfW z^zVz<2yUC1>@))|8MG!0kBrHmlHN;^`~e}qt&dcRe%+ae@$x>nM3+49!^LS&`(Vj{ z^rZtyVf3SNRdhfTOavNRQNu;_IYv<_@k#b3%_JvoBP8H?dRo7FmT25AOU z3;s~P^C`6I=aPnxEBqc9Xa3DHei`wYU*j2@IE$TrmUiZ3!o3>bU#{JZ8exQu5hB-` z!0=W*ndxWtoqt%3)H~{S>r7@@OJUy(!Kqnlo*SWluj)`?hT2A~-aqN0nJtvCOM+7# z)xdUCf)*XiQck%VDr~mV`@QQ-I=X~^ewpNCH-&E=?aIrnHJGn-NDdu~#DiSmCI^eR zuK>6y0_Y_=DMgwpw1&5?2KZtzprgG?eNc}Li`+lfbcKHcOJZ3kDc-r5#+j)&MLut3 zFAKyd+i!0hd~w|0F^-+7tQriQI5;lHQHl91$*(Try9by|B=E_UVts~}#PclQ(v|pm zO>8>ld97)Q^>I3dV2oIv_pGk2l(hLycwnbJl1jhF&sDByBIlpjNuNSnbVav2G)9z9 zuR8|l>;2gS!It5T4ACOQfp0L8cg=a2~ zl0=h^j)|89IwAKb*2i+`lVwKJlCO0vKS&F{ifK>srM+3vInwPKd(GgRbmZHHZmllZ zvg#l+bPvnFxy3ReA$=dbMMVPSbQ_GLgg(S#xT1`$JJ9sU2F;0^pli;Y@(2Ef{e0*^ zm6>KhT#5!CO7ExA_Lg+Gsr3=q(G@Q85c8qvvAIZ(P=36*o1|ax_2BA^2($!uXK*S< z+jsX)59I??c6hFo*35P|Z`ITrGoLzBF!Nh3Ug!JIj1f3BtWT#g1;6UGh{AJ^&1WWY z&v!7h8+mQQK;{;F{0c`{PB4dIj+dNV7s4Uxu}}!|eX2s#Wc`(9&K!OJ6GK?r+lB{2 zjULj%!$t3V>zO8Ql9_pN$${81dPH9-cehF0;zo<5eKAY1)rL8-*l@kyqfD+#yH@7h98YG{LGL=cdBYHT$NeSnXaIYqn}NbFZ6>{;LrdgkI3#*-j^ms zEk8SScEj(m$hMw_V;LOKzhDYn5ghtNP5*%-Pbi^g`paf7%y#51*U=K(zBei5MwD)MiBpv1p*pup`@R4|S&ELCMvL z3_C}+GZK;BZ=*v$Frka$KAFYt8m$d<0y!H8tYB)b{E=-*q`Qz2VS}Pqen0xM@sf7M z;WJuj65b=aAa0NsgTqYr&qH{=Gmcht&C^t-3v`e0miXd3IOfnNvF^3&ot8Ca<<#^4 zz~-lS6I`-W0uNH4IMkKGfm`!z%5qaQw9p`4^tCb^kq%*+_-8 z6+{HkkgnE<&6K8ZgT;t-ohAc-Nn-J(dDsB9M>QNX zhL%d*EB zySIP2)A+NyUl`5bo5_rIo921FD4lIiSy{h|F80^0Cz|+*5$ui?X#4tF4)%~vd(`0X zl1+zR%il-AFB_gVGoLaQ+}yWP+3f?74FqE3+UBN?ajobt*~|y7nX!!fgq<%RrZq%{ z>~Se+9yG2bFavh*9~dpWYA=Dm{n9Du=LxT{`gH22u$fm%aB=Oe#_QGgftJ7UCJ0w% z_$s|+ZTNvwvOfWuw-LgWm2j?JpIV5Mzoo6_(eXbX{%;#1W?&o4icD|a4Y@MwL3H~^ z73SkRwdY~W##VwW%&Q@&_)XRx_RS+g&gPpfNFH=OZxoi!m!vaoM!lRK4i@c*#CRcu z6MJsWD)$>y8E~eIlYHMI6LeqH|Iuvng3hl(MYm|}hrRowlS0I=665xQ4wu6YhO&`7V3C@7e(+G;%HZiEDZ=KH($gev750k& zQNbn(dHE0q__6WzzKam=;Q5aYu?bO^IXo8m0z#G+WjDJRuAH~UV3oHXeZn^~sH+~t zetP#zaW8&sJ!Ap5Vm-QUg5StpZhH(8FYYZHAunrF&xng|pY7fM()Z1s=XK#=JU~dj ze=>(4go~kmkIU!*@cvd$hgz2%7JmpylQs|TY+g1;=eNW$OZy&rHK1lt+E!o|oD@ld zGP*eVx=EK1F6#CTh=p<5V zttY{7JW0C#QMx%<=D2LKc#_ObvHks#7Wfrka09f{HmBV;YDzAb--6HX)8!X0K3ChA z@eH9EmO2^+x1HkiQ^&}ObJ!|=Ezff);lHyJwJqWzCmCr?qd_dTx0!dJ2|><bt3mvPF~ z4?~ifCe&VU*G0$<^+koq_90*eLE#!(^3d)~)fO%44niO0@UNj^C1NCKH|^<1KW?xo z2^U;zH!FhbRcp82KlNKw&*~p`N!-AQH!2W;MdGv)xl<99KYX~Z8|BrZ2jx3`N&hpj zQ_l6_v)l*^?ebuv*>&l$zT$6kZB5WVz5w^PQ6{#E3>?q3YpMJByZqU2U6Sc&)J{ZR^feWbNs9h_N7LnQt+d9_|l%AQM7U4Cuk^l5`!D15nw=~< zrsLmAVG?*y<5o0CZFxFU<=2HwIS?_&O88sS$Sk8@0)9+eQgM?k|PO&;$Q-m<(II;vn(Uyd6Z=|WrK3hSL z4wTG&X6M4L3CZHO2kPwKKMp))U?-Goi+6P#p<7yd&274 z2%F*Z^S7!M&Hn|W?D({1AkqZh z`Zktf`n+ss1FCzO|BT%ahy+h603P9cV%Mc5OOGMZ0AQ?X46tU(*1j|b{L1>V)M9A25=*)BT0W)TG_%sR&*3eb8;$qFFT^dR85LMUef8wIbH&Bz zWuh99_d0!iIL+h*u~iP04=6G+Lp0oD zv=X(rQ(GV=jBwm}{o`DfNrR>*K}(YPg!pc8SGK1)JNUF_i!-C7^}cZjrJ88Wd8RbBW9czruc-i4VxMDoC=ezb zlV1%X^wSjjBCK?Qn611&Q5&eO9j`Xro*IY;BeAKXSrn-4pNp#Yw&&dRIvYL}(H5Q0 z>&H<93^QUrnN?!ag z`4p*_Sh~s}F3||Ucs3W$d!5XHh8iKL$WIp}j&&YBUsX^;5~0SB6;HYh(a7Hb~j-584VCmO;BU|>I0=>P8Pj@NFLSk z^2O6UF+1XU=RS}YQB2FUF1%ta$QO=nOSwWIpNI;T63nrEUp;Yg2Qv<7ydBryuB1|+ zb3Rs={4r9Kl7$IhR=2aZt*u{f%*+?3ogi?n8F4~|6;+BEr8M!EA)#WvY9WV9^JKDXDGZNKz-9c8p5!#mpF{K2-nO8fbTeqx9a zYM(h(Q%oAuV5Dq9$RVj_l0&&*xjF?_DwOZt!&v+cdnO#qvgo0bMwgbXX9FmiiIDv@ z{A6~uYuNlN3er%!>7j(e~(p`HCpaD({77(>>_XmA&KO{I3T(p7CDAzrv7 z!QP7emm|5HLH&ZVbs<#qzi&VZe2NZ@0Q0Z&kDt;QS@xumhYLDucOy-PEYfc(m*c$c z^Y)sgY@9|?EiRzoK!ga?zFYe>sbl==Gl5*jDNNo-LLgb$rJ))wY&N|T%jE7(6*K7a zvPHlATEz<)B|F=G;muQL%qd}9fd1$18Fj}AXs0f|U(obVo&^ba1qzhn%xq26{?*suR8G|wdw=eB>U zURO^z#V<`@{7n3HJ>8P4TA;Q|=vP&wdUeR%Q7B=QJz_(kl`H?w**`3a^29rHKeZ28 zDNq=gcaZCOLHhK%jb^BmfYn=bKNA*ORFdoeWl7Zo;`e510q$sT+lq5~1i*>;gtVIp z0U`j`evf0hi@=Kby!?|ZI;#$a8ZJk}=BrGG!bp@$gAS%+St2atdVit>!tAn0S2>sm zLul0YX;8zm%9^@C&XdiiniJ?EHIOT)tsyz;+U?^;vQ|NzVt?F4#{$9%7fmk1okGJ&IKn%3o0*#T3HIMP#0!=<_G3B0n^QC1Lhh z$CSD<4`c;RLS!a15lA|!(x;0ewN4f~x+(ox5X}E!)d;bfg5$C!b8^918k{AUrS*uA z-f%e|7I&}pxXG}Bab@Az;VW#b21>=YlFd`o5`b~2KC;aB5vR^LmY8F>U`d9cZ8I0{ zVheMytrCYj|HBLwF>StxVcdaK`QEf;yW7!3QPw- zE1D#m<{w7Mbz^0&PWWeeAKWFx!=8s=Fm)!N(k7?bLSh$iK>dXVU(99u3?-~ktnsn`aACnn>W#&|}d zLcn4$|Hujs2x&vH@l#<50-aY9qsct>Mx8)Yy$$Dd9Whof@Vz$tFnHLg9#kSTmEV{Y zs?ncOEbv=`6Vx}bSR`6{d3y^^()4Fl12xHJh8VJ^;1Ft*+Ud@%f_+LnlYtC;hEgDD zT+0001Zp17gRFk`&1?mZ{=UE*dHEq4CWgnK6OA(bOb=DxyECjf6Y7}2Wnk17cxl_@Vw z{X;Xt6weZ49wAJcN100Vx{)m9uiO+TP_9UEf7ao(3}T^OJC`LC-vh&rENR%GBjoKMUmYx@=f1DXDP%&f(+K{-xO1JX1KJGGSCdmo)NBT||J)Ii0tv9Flf zX$dUQ>8enA(B7x#n75EBLvw1Kh}Rq}GU3?YYK{gn@=qr>pUjJKz+Wk1y=o`lOOb2( zlSFA9`?ksQDHUJ5BP*wYcBC#Vdq}R3nT@k=j;Jx}ecGbLy3i^2Uo6a4xoUS%T5SvM z^yZ#D_rxNToR|rWY<>QbSM6LXOW7bcOvRJrf584%8*i;D-6p#uy!QGW=h!IBL0wk& zqfCQ+=#=pA`+fnjleqbA@gz|CGrz11UpmV5nq0_Y_NToocZ=13a7U>(=68Eb?v)1o zCCw~H;!BZ=w`o!HixHB`&c*cc@As2ym=lQRaT}K8e|hizfbLaDUd8gh1!?>KDN~aK zFyT9QlrJy6%>^^kNh{1h$u!!(X9x^Db`f2`G!!o1SX9td`hYN@nycwq1(EGDYD2z4 z-MRI0B_0Qu5s&g%?)x6sf%{ofvG_>dM}zi|jZ^#sLJ~^`VbZlQB`rB4Zbtr_FLcft z0t^D%We4ElHOQvVq^)9Orl|^_c-^;RM1V~z7FOQ;@D!%2;K3z9Nnvg9YKK-yE4%2~ zk`kbRdb)@6K*Fj@M~6bkR72S;ncL#3dgS4)2eNK%x`tbfP0rvSb}%4uFWNHEu&|E` za~?YE(sT6J$wywK(Tge zskU)E!$o8~a?4WNm|6$56UP-C1eOR*n`if1)Ddw?gv>NcEzOoVKK$nOd^F=te2Nk< zc(rlfw8~t(qxy!~8eHg>fJ0HVm_omhsxktzv;sB&%&v?q#lPfLPySpf9#YwP)Apx5 z|5}ILE|a)Mgcv|DbR_^I=8SC&T|By3?o=dSx`LqHCck!ifn~OoKw`h3m60<>Fj#+3 zsL3SO9HlLXP4`9$y(qdj^2GMw0JK5ec7LwMqcwHb zdiALe)GmN{vwOrCGpHDDEpWx6{BJKNucPFD?+-%`?BlIbE3FP^q~ zpnpGteN6{p`dH|fZ#nSvboBeOTbh<&k9ZI;((n?)krOR+@0t$Lg9%}*WMBB~ zKx;)c1AY>`V^s``&vN8Ftkfl^Lav_<+@5k^?eaRt^zFe^1owbk6o+vlScs4}pMD~H zUMe{Y@e;>cq7B1yXQ5Wj<}+&VcGA)g7t;c&cj{eqJh^fbEN&@h zgPXP?%)2JrM`UDI=Tj|zySLiV`HZCf4kCv110mG;m-`}z=(J~7`wtb~4~~726A=oe zMEWf;rZ+^PS+yKc_+-3MWZrPZ$3~BWMG0#CZWc@grYJm5P>=9_FUQa*m=LPzu_j_? zTtVV3Mn~GjYt8C54q8iP4{B9<-P@oP^jo<N-UY|4&1TxcP3!TUn^x;iotE6A)b`CjX7_WFh?;p-@pW+&n z83ls*!4sh|drMzQ!95O@;0H{@#jpk@=4h{lZx5kC2eCEPb197&KybmDpf|?SL%$%Q zP_Nh5fwoD&${b0%c8Rh{yQ+Lm1c{=ItOfmXWna$jGwEv1x8+u|p-dK1n#2rfMicG^ zsj$04>jiAavD)Q&Ad6m{JlviD?X-yAQso_5yj;Sk_!OBM#IQ2;|1+#)DI$tr%jw`X zRI&|M*!?|(s)kj?Ojqf<_GNg4kGJ5=)#`I5_oVCN#+Y4P*sw~Si;G5o&Ysx!AEtz> zx&JoHSr|U2+fv4&<)mRt1a+i~4%v2Mo4Q=O0vl$3sAiv$<;?OsZ2M6j==9-2d7V#t zH4{WjxQ5>_8?Gl-GT@(Iv4Q3e@>4ERDrNkJz1Y;Q-xmknUGD?6^Kh^Xf(`Ko64#1Q-7gAD;2lmKVLG(pW9EnxxwycD2WsU$S+q-`OW=4#mtAd zlvBBh2GK{IBv`!IYj&TVOoi@~)-GRNfK10O&T}X?JbIuu61v+sE+5#3sn2qL<6SGW z1Tn90h0LveJ$@wH3-8BynY+7BfhGHOvT;u4QFXNG2|rzKYJ;>-CB9WV0IPOdZxSb} zfC8ev&O?RE$32PfH)9yuAJ%R=C^BAW`d?HNa%eLTeX#RmJNu z-_k-n}-3ng>ef&r`Vi3gP$Tw7#6Fmu|0kLjIYmio79N*nchP8 z!E+(COE-3zaVh_1X(qBps<3g>WYnW?(C8aL*I%r9Y#myIwNUqBX4Xm~YO4;h%eQsh z=bqyH-6P*9azq?4O4Z?aP~3a;cU=Qet4*4#_Eks|x-=pf6isEW37IF1uhfqQqevIY zSKmR%34&$(IFU)VDX6Rm+p#YpBeMj7V3~FjqwMz`+siqe>qD4NKG*B3{M8DFZ1utab7rwdlU z)`F^{;WWGVtN-NQHeBYS-o(qQG_=!H&a_IB;|$urXNfmV@Y<5debOg zic$EppQbbJ_#0ZI;wlCtpN&kcvY8)``-y9myTR}aaoC}`k59$rIMx1J51engpqpYK z{R>Q>3bFU(S?3rzeag_t<@PK#&wIdGkbcIT#&BzB%vU2Ft)RqJ(x_5*Ox>h?O6Tub+*&>bS`a6EW=+8&R_Hv5 z|K~XN9>3KpL%Lc>Dko!bafTz*3esfuU)<@sab%!iE`?8X4s zuNHV;6U-LAy6vC0DlsAPF%0^AAvcR?Z6%ko+=)reJLlaMP6seK9R)7@uOEg(l>QER#8PK8gb`LImYBwge6b&5-Mh!nX$Ndf zI!}q0w3TA?zNW0P%^M^+olJ5MH8Ybd96sRFhwKizkur38E{F)cU1W?%I$S1mRt|DG zm=1-W9g41KwoUeV3pcNIR=e*%7X*ffW1*(pai+t8zX4XNnnCXDzmu!-hZ9s612Lwp zt-LbMuslLrX}fZ|N&)|HN>fz8xTJPj!B{x9l5>2*AylQLzUE=GwZHTz!uEN^CP|x-};cGK8w2TDuEt7(?s=_~ub;``E+94C2TQW>Mk+*m3cS zp4z>rBTy@HOED3FD`xc{L;JR&SKkz@7V(sfJ9h>3v5uB`t=gErMA@?8;`ct)8RHE4qS2ILm-*X$S(Y_$G&4wQy5_On z*CvZ+aBcReXN-ExnL%Nd8&NC{T3!ELHxIi4$WL!0YX{uoB`_G!*(-a=})_} ziJ&|y5HkR{OX(&k&$)|O&b<3(iG>-Kf1M-hk&Q*E4#UXbtI3Awk!1rA835j`()2V+&{2f@@3w!j zZ)>SGyN}F$3|72cP8COxBDx-IyAWvBQ^PI<9*J}>pZ!5G5e`yaCI3eZ0d*Ju<*GhD zif>Hx`#1E0$RuSMgDwvRx~lwxdeaK+c^yAk6Ddv5%34h04{n60jQjq8c^6OSd{R^` zC*psk>RfW---)K;_h!-;d6R3a%;_Diw!!^MQ--5{8`M?Q*0_LhYY+Q^nPVlJPUyZU zme|i7pBy=!W4I#OW&a?*{ybW=Oy9)s@=Igso*hLl_nn`F3PmOjMnQa9tFTYl@o8VU z_U|d1@0V0Hs~ty=ycE>VHG{t+`Ib@}26kl<;ng5I^3>dU;F`J!-Ij=|{40#lI)*>< zz(2e^WmaoqcP;JTaGHjqr&{b~v(FZTH4rU(9ZvriT+XT6 zTcbO}0;dha-LU{LztrTA z%k38=dr^9ZqQdz{W+}E2y;kR0>W@p^DuISY zYJ?%Dyrf>0WA6*N^Es+^>OVy}>HWHD z(`Ig$0JP6_K92*2UNWNPxD0%sG^*J>1w#Z^?q@r@c}!4$UlYEDTbo7+!ey!O(l$4V zWIzk&+$9syKF}f&HhX{aw3Ir^n;{- zb&P<2KA*F+UDULiCub-J?OQ;NR<)kTS!w9SavwYTWxzwus~P*gq2&%X<1`NAIDu(u zO@Q&x;^$Bm8}{LJLO@F*T-a7xjFh5|ROuNKdz5Ms7}!+;9wtQ+Iifqu^r1DX)6cMp z5ejzeeR_om1;-1II^cf1zdZJVebS&|#l=hyQuT>AaD2}`O-u@uk!4VNglcDgOelS6 z@HvFOAfNl;#WSn9US6SO{!p=NSokHwXLr=UKK@p@9DkHY_HGCjM<6Q8Pv|2_r<4Ga z2#I4vkDl2j9>*_3*Iq4UrV#lqgf zsQ9;AZ1Ny>4pzQ7SFUqDDd%`(@G<~P;qI#3S`uewMQLPc0l=&S-Ogm(PLeoF;d3t6 zieHS3IQfKj=iQM1*Es^>oH`CTn#0`q(sw#KVyCp|u(5xWnx${4T9%Fu1xs&gsq6C> z`8}NWnHOJ{V-vV~#OZgW+8{vBnvd>qxqz&JMGmLfj>LBmOp z;0ldOM-*(UyJz3WNLE%gXS&V9sMk3rruJTS-fOnoq65P%MCOBoC)y-(X(A=jE!J@c zlYmV&@rF4AcP68TL@_%SjtbyGm9arBOAz=UfzbB6isV z*2hxh;J`JS=*88gST}KW?JEaC`pXXNlhdiksLpv?ANip(bYYVy5}8fFA(|j!@y(C#wRxyZ z?uRv733CA>*}`Gq#e6bU#j4C*2I>oQ`;?7*szenfbEh0SksWj8SY<})u#PQ6Xtutx zA{u0i=h8kS-|oWE9g|P+V9if@&SaQ9eV<}Ny6zi?Vrwi+qZ+DkM-d+W8O>X|U|XgH z+tXP4(toRB@d)*b9QUp+(idp8G-Gt%MTX;jZ2ASJIQ0-;GHWd-syB$2)*z&9IJrA1#YgV?jKGg_TcJ71au!w$Meew?1Z^but{#vv?7 z2xpk>mF`_E?p3ej6XT3o_1Q-eaj|$6=ifSY8rw%#x^>Sv$KHdG8E2oJ`Q$fYDZRG> zgH&$WOj;Xeq2JHb+9clmG=>PlPg|~Yd%PP3FM8{LTx=nf+XwVgjqpihFuiVJ zR^Oc~R>`q;8UpvqZZ(;XlV#p)Sbv2$d3SLcRl&{H19LSsL5@gjDr9eP^@a8s%FVU; zf~ozd`!XfV_O);X-*9}{{yyfw7v05mOcmV5{X}bRZ#RY(Pt3$I#w_1;8(0PMd#=OE z@uFpE(i4Y(e?Drf;_M~W)_YkHD`ZLjx=5Q)E7v8c7Ydt5o`?LTt&HFx>QJQNL>=42 z`)Y0YD9k)M(et6R;e7Qc;|A!mgUApAW7MOr-0*k1BVwXX*Jpbe*dQvzZLRy+p~GY% zPFf6=tKOg*#Ij%S)z8aIQ~Px{X1QC0|M=E|9^&aQl=x^ZU)nl&D@%;u`WVv1^0I#l z(e>rRv-3%|CARFGA$oJGolE(``;GLNcf58+V(_1blbt}GLX=80`Q@$*agMWSUL4Rc zm1IgfHfb9D9GAE3%gUnz7{WKV(ZA`CD$^=-J3u1l*+vr$bS(f5MA5bHOZ0t zI@)y(%}suRojyVl*+KXu;-AQ#JEJms2^CNw16I1}vQ=l7+P32Jg<>9*JA$ldb106a z<1_OVn9Vp;LQ}=`eBu8ddr8+(1Tm{m$VS^`2Rbh|5Qnq$e_rHbMtV2GPBE-1Wf@I7)Y{<%z zIYyA5PpETMW!n8rx;o~e{q_uh)KZ|+t2C4&g6^tMl%VyhAUDbXJhm}Q$i_fSY|)3-R1_zw>oZpkdlt^@z^-Kxa=v!}NsA_%4+{N7)WhJq$C_D!;C;VGWjZ)g*+Wo~LDH*-V%wKvZ zz1PbjPV3n5gkT)Fc)kX1)GiL31v|r-trXV!{(5e;2T%Dc9$mg%(EH2D%C}2Q=vSMi#msk+`ZN8 zx;k6lEEcQsfVxou+M^q)w++4#8dReBUhK!8%!f_uO(;unWX+(RIc%iZ#4`vb!*X*dt#ITo-w4~|$@F!PF%Io# z_GKbY=H-_Ydd=UfCj_Z`7U5+a)7SMj)x?z9$KqJr&d~vn4(eJdu5XrGLVUT2kN6L2hFjC)tXDlJzKWXq{E^1LAU#f zdxNOugRq*u@5OILz_sqdngtL`FQP^;LG{uOuNAMsmH08Z`Up#124zd zs7%3cDxo4v4OET?v)`KFo?dS+OCth3cdd^^8|%yNt4ln&(w(x7o&>%=M_N{{F9&N0 z9$++heeQ^Is{Ww`O*48P)lyl}G9=&9MJ#4gz5liYZaNzH*NKFUkqo+&^-AeGDK=?| z)j#P2wWlp7$k2SxhWrl`FFwAUscZ*UcWu$o8^TfpO3tcDS%t1Y`HR1 z^Uh#4dS70!6Y)}enp?N6j{;Gu@W6b-$9rifYdgH3VPVyjA~|pt)ZnbCU+w>dEkVto zg3Ixn;wExj!G+o;;F;vfL4>W3Bo6h-AH%H<6GNEfRAD*V^FJp8iepBXXwT>0oyR-* zK>YZiu)lqlX5d#XVz_ylXzd)6-o6W|(Za{*6>yh|_Rt_&SpHJGt;zFhccd}>P|rq^ z_ZiE>tpwA{vj4S!c|rBHS4*{65kYQnRyc`FiTwo_zC_O+4+?#)qWlIg+v=|W=86ry~ zqB#C&Zx@8xxD)u%yXHd=ZCpjq^Q)nc)7L}blKuHgKcTfD6UM7$svEQ%KMm+08{S%r zzQ^r3mDp_Gj)0>Ls8ZIc8#>FF6~Qr2!2m+l<&V~;+^u7rQO}?Ctv&Y zkn+T7T^`}OyD+>}6=6-A3?55&7+ElQ%EYF^Nth=o+G!IPWZf30|v1sZr~=az^~t zBXS=S5&!NBt^a0%F9ZHh|M5*vnq9GdkkI%&9^6&8o}G}rRY(ti=Y~@41Z&*Kz8Jkk zAc{1P{`Z%Nu90EA5 zKQQ#+zx8Hi7txI$YpoV zf9a4j;@9aqGPo$*M@Jm%zTAKNg)Nn%lm~%I|Av+V_18X0fQsKE1gHmebZC$emuEu! z5vgBAIb6^UCI8cjlOgA6rHPa`xZz=6Bd8Mn^}IW?kI;T&kS$XLVB$Z<=Vh~K`%|7l>RU7~%Ie(mF_&K*U#yCwc;3z1Mx2EBYZW6mq9 z7_klK#+l+CL>+@MUeuGkzvS{11-4Y_*X<=a-gTUD=udMk!6)cK51n2G{5F;o**4^5KU=QC5b0)Fp( z5Kr5nHc5J$*hnY1{>c;-TP)%WU=&hf-x@TQqs{SX%NRG?g*dh5oEYW~`-hfYyDaGW zs{Bdzmd_VI&vfLg)HHegopV!A+tkw&sPS&_>;_T)8>8y*$dEd+E#F5Z>G&V(%@>6jNKK1zf3alG1-r*j9<@#Y1bo{y)mTDypq6 z{<1)Emlk&~1&X^vu_6Up910W-!8KTMXmKs>?(PID?%rTUgF6Jz%+gPziN+SdfKCqj=O;p9sY2jWFs4v2dBaxR5zfWx>lONHeKR-`qGaXFdx!FMYzF) zLfxBT73R~FF;LJ!6Oc>QgWdA?T&`web4CW=0Vb5fJ?6VbW=qKO)@|#n&Hh2IMdWkN zdPLi{!sLa=>#YIGGh;>SgQh|aOFSNH(HT*RKq#GD=jWz+10Rg0xg*iMqH{)xi~S}$ z**1D$fy0nUzx?moP@Jnj9{Hq?nR!TAainD$iVP0TZ&`^HA}>Nbd7g2sr)AmLQ?dWu zl2U$jPF7LEe;4Mot!J(m^3kqq|4@M73z-&5wXLcq?#JA$@gMshUD-uN&kiLO>w%;O zhks~#Gj1l=00_(lo1Xn-K8yD6RN-(d$dzR;oxRg5HeCHTqW@4UmdL2?L$=a+rKer= z$wFwi)o_2(CgwjR47OyWfLh1d_3jECBnU@g%9}w|%!Sh^6wrKvip-~g@5M6tnbSgA ztYPgJ3_@&Zeq7G`I521wJr6ynlF7Nm+L*%F5q2uK!$@+D=G2Ht>DM`gN-sTVF}&Th zkMZ`q`Hf0PUSrBvL+IeP*v4DJ`1MJReb)o!NS;OD$|deCEY7lvCAvRy^_<1>%h$Km zCe#9l*H5lCWakW=KL*pZMVK$e*fOesi?Q-j?d;gZfC-R|3?#q@hkA z{v{#rGaH?u)5r|zBf?eAQu#m-LpWRVyDTP?GS+VBh@2)ZA@Ro#O#qJ^d0aKB#J0C) z!Y5hZuG^|MOofjqJ+{ar3QRnLNQTx)KW2$SRtX5nDQld)vNNE+U@)R3L@1;4EA&6; zY{hw}BurF?s0ESRC%C%j6EuC^d0FaK<*BaYJjEN8SH-I2eI(nCg|M^yYID{d2idc& zZ!^?27sJGuC*L3zffrT|sD8xyK@&Emq9-%ix70d;7nA7xb0GztSJSsVS|h?W4K&u; zv+6fA&?&u3OX90nksK^IUMl#CM7o-9(aXM)8DOTPU2VoOVT5={thRWI%X_swqjXup zl>)@xnZ$u_gkDl`WQtLqK4%`R5h#+8w|y<}3u*3?osaCcbDKbe_!cO{T6Q^u8v;QK z?MEK=8>d?@z-hW>f~~!A1?Eqg5+ym&%}s{;)Kj6%P|C1#=VejIo7HKv+7g&_(Y-bJ zsiu(zCPH%qK|0ix-x6Biwch@wYGGkORjkxCF-z{XnrcDz!>i&y2zPkboOXL$sg=Aq? z^zn0LQTV-6+{iQT)9fA_ZsC6VBeY~#Vb&R>;sW{hjFxF^jRvrYwMW{*c+jGV>yW#g z0bRg;*r?L{c-sV50fp8Zj-?ua$sIX8pXgluDC<|QF3+Lu%G80ze9ri}e} z)eWl-`ZtNqB=BM(Ph<&-r6=GGA|HAarD!2Od*PseQJNeNExqQf^Ce8#bF)%QvRWFZ zgy&LQH@AQ9U>W&oxAbZ+ETs$c&;V)0;-{u%V%Y+Bu;N){gfW0$`a%V;tSuw_?|!!K zS!Oi%S=}eAak&q1fU)ep7)3QitQoDb_uz?slq){;qQ1tS=e)dxPR;Ng#yBo^f@^&B zw44gg1!}ciZLsw9o*c7D|l*rV4Po!;AxN>bFkvPsO%0^p&x#t7VyB{c)=l5r zkRl30Qf{9;hMG~A{)yb8Dp?=UQS=e%Z6EX{#Ai$^7`0^Q!Z+FVi)) zXPkwE=P$D|KYa!>#k)$@7Zt44*LNxZXpR*8r|F?J=~H|1XDPK%dP0W8O)iIr$wz4k zdiQU2)@HdYl-!2?*SD^5%`MmEwVU@CT^y60EET&E16t6ZtM`)h`o>oYTOxb};VjG6 z20w0hwH{lgQk_g{d5+=~m%lkkDoI+4#ZSh(=na|l5Il-ywKpXu{HXrZ^o5YWR0!W3 z$8vcpO(rMqqk`<>3r-`ywU%<6E@Td;X}D{SKrmm;2$VzLD`^>mGrhd}At>yc==jfG zqgma$IF%kXTnt=sCVRRz<8gl(%O1TKa90D@ety~wKoD91Q1Bx&qTSCK-cz_{2QWVC zaab>Z9B?HT@BOR{KTJ)=x?P=ulOyhU`1@aVGW-Y*`>%h=5iSKsL7+#76x=;>yKP=u zsPGK~@_5@6a+jK6%JUp>9OmU~r>h0MmadmsX27y+sQ>i!%fonvP>s~OJvfSH5U$a()Ru<&)oQ1o3g2_10hSI> z6WjakI&l%bmqgQR`{j2^2=jBwV}kMiz{tR=m?lkD9 z&3Ec6%hU1o@Qclzq;TUS@@&GD|2tn+7ppn1v!s3i%1@2uk0Z~=Q#qZhW!iuJbYbrU z?y4byBeVw~M}VQS2EPBN$bYntWmAaxr-Ak{L>WFEj2{_+us^nq#*S(#pQ}%C_)tG> z9X);EjmQ{u$qzDFea(t}&ASvP81z|s?^63$1abNA&z8u~Yf&#-UKp~=7rcqPXg^7% z5OFKra~{BeYGoATZ`ExYId=PNGzUVX=-l!9B+M#FY@hSxBZ>a!i`dSAVDx5q|;B6E_llI-udhgpMCi?-D@%?TnDrM)~b9k=k26Z;>DTWT}^Uau=UQp zB;kXpbjErgLJq@r1E3UC9W<)Xz!#9d+3G@j=^f#9M zz|RAz|7`o)s4LpsUzU;86d%P={r_%px$3aW-x7rOXNp zvun}Fd6OWhN8(1{;#SxAV3~DG<3=#_iCm|q#o-%S-#9*H?+4GaUQ@Y%cC)Y#k%bsJ z^RlgEZ>?+d%xJmsPBMA3bH|50e_?or%zhI-!l7<3fQU34+S*KE`2k}zDI?yoxQYjW ze3#x5I)YKrIl@*ZNB@zJ94zc z^S5ru*PnRL<=WcQb_~oT(RzdHE*>1i--Cbb68v zo<7r)W5fzl1HOzwRLEwUa}DBZe1n_#5o~^+UMjYzc&!L+oJ#qvh;6eXHdNkXh(UO9 zF_a@{dwDB*D(7SHxa(W&3L}(#$j&a86#iI>7zYY0#?LVHK~V%vL&PDg(tD(n^?k3w z((vJn9DRBhN29d!H%Ait(k1NQ_C`MH2CT^LB+sDrO-H*`X0O!K>kBSk!{>o0VRavW zt3#qh`a<2>zXseAEV^41f*J*;?;`}mBMG+InaAn*X~|?)-X9R`A-Sra40sAl%xHdr zUwXpj<>gH}Jg~w00;(Z>tFDlz2fV{Kru6OcZiEgsD{^fFhacRx7Q@BJ8b!hYGD`ca zn67;{E?8NtI0YLwYFTh>yJan6_tyVQ#Gl3jV|-=JHA zT39X|i1ln&WP9U~@PUMI?*+^CC#I?6rNvR=QS7}v{lwM^+k<@oJl2C2kbWx;J-(k^ z&k%GR3)#Aa!XBc!gt--0rSjJYMQwv>Qym_6+51r$2G|ErN&WY%5p+`3{}%LCaD%O8 zKb2r?2g$4m3NkIZ;GmN6tK0>!#tP1F9qySV6ed`5nk8q(kYmx%7k$%>`dIF0MNG+S zb9O4hG~4Y?Xr@l45|gLCqE2>>ck?AMt_owV-p{WIV)g!wR+_kl>XU=gZ@Z5YYfxZ$K7AofwOS77xD`7&KNufeX8 zF}7~KGn`+fui^Q63T{kDNM32X-_U7s1v%u6BJZna;CJH~GBWs3*!G5)DC@HJxx&V^>S~Dl5H@B3Aa<&BBUA?{X9VXl22Zmmudws^ z#J(Sisv54!tsrfLQ)Msv#W7e=Ys|2KE|BRJUENlR@{&`_r~`~Btwi>O_D{0J?2g2* ze}`?G?eh`>V0jfIZe?jEiatC~CYW6bd+Md)ME+D{CHPTCO9No z6v|&*Bjy9Tb;sObl^)`YB6H)EGgpT$#?-im8ShFa`(h*IcP(YQ#f+h5a;K$ z&Gw@430a`$&22YxlYzCrq{0zD1nYTf?QfXUuQB!jzUx-@5j9hCIj%CJtpaYDyVlId zNHvr=2&v929_PG>#SaAJMY5dFg>9Xnqiu`Zf<$062_epfJnJ?Ecy+ggb@bLl7GK(l zufrP`o!3upI}O!_n!!mHRa5GzkEg3EgTCM$iobsyF%R8uIB&@5cQXM~yo4tizZL}b zyt#e9`Ux^WzhaCmvUTXo=j5rj;V=PL`A7>9)Zc78U+6YwXAvCWOIB`v3D`{a|BSHY zAM!~d4ghs&{1M9#$ZvdRlEpUEd$N1T5i6e!*P3wktPh+A)tfl&BrR-;4PCE(!lpFA z7Xunp8O>d{6j$|eclxm4X3^>2i(QOb{@SWsn;cfq^P7kVKRX59q%A4j=Q0sx{oj%2 z|3;^m@u^B~4{=2*Uq{|b5=O8Nq5M=~i!Mz1u}Z>X3;K4aChf*+{a#Ks-gSapA0S?4 zAECaL!;d>6(d6m@>l!5$o${t}{^B%0>p3Z)E0n3$qzDZL9AA0$Eo74xDk^%JH%NAj zNPQ?{)^{hq*q3~=7cTSvXp;D2r_lv#(N{1IJnmSQ`rCwvTw`(ZK*eCYS4K3^y@ZhP zsE%bT&itQ1V!wpr)ooC>B5V% z>7r|5Vy?)!{h+au4xn_mM{c%RO=-b}QsP_-|6Mew#Qv}*4-bPPW%qVv9hOqNO_j}S zlTlD$k+|mt9{?KI_M#lD7K8d`#DZxm(zdhWSpxkxH}RHEA5ZfT+o=Y2+PLaL?{-r(gMGEFzi7;o?w7d9e;Z&~F`B4N zYJ7tzRkU~iQ0qcU=&4T(&gqU|*Z0BIH%hGDY^bMOufIq7&2PM-G1mW8NN(6ebb2oE z;75xJC~$TGg^JJw9CvUgrP2H-)Tup)hLu$o8}|@{upGNYYG1t}%HgUK8eS2a-@clR zi5Ve0d>U;NsF{eRn#%F>(&GG=|B(n&VwTGxb~+Yf!&l+zLsu4;D}#*H)v~k%+ULdt z{%FrrxWr&bdw62EaViwD#1n{GU$N@uQz>I+D9e*Mp*6@Fkd(t8c|Emzg-BAxaF!61 zGv7j{ewi%>U8`@}Cb!sU#l2|usKGEy;vUa6{Vrz|5j&Ljl%Lj|$NRteT=QZr*jVHN zKD!eLo|8AQ+P%!?%bJ<_gliGl(guvzJ;jqks!p4cN4w`FJb^=2B%jrjQC8nzg@15% z%7$xByX$i$P!ypiGkXy9Y1SFTeX${Ckjh3`Z}PqB?Ckp{HiZBHqia8Iqi#4&%)lq2 zsZFkE-$Mpv^~H4~W*Vd8Mi2dirY^kmCM$vRlgBN8ws(I@qAZsIIi6 zo+DR&vv{*LSM|Plu5NVGmMha*7_TiP^mJI|is03I@y} zYQ&wj!&-X6p_YlZ?(*-OkIzF{I!qW;PX6gq1!ahZ0c@MD&pvB7*8gq5{|lKFlmb^- zT=%8K%tTMbuUidC2+0K1%9VnZ(6yQUG#~^g1GE~sjhq$4|A)P`SPn-)rK!B zg$ArA&&V3?y3n%TqqI5O^-^DI1YF@G{+oYjP2{o?sd8=c2FU`@1#zjbxEJ)R zDySi&zd88oZqwd>P;60(n{jaf?l(Q-VG0RiPE?J@Axm55WuY<5u8ENu;{7pOM(x6u zFXu<$WZs34f#&J&U9z-DjS3P-w7hfXn@-!KbpAL6jA(}Z44wZK`MoGB+{W*g zl-O5D}7E|~fmhz|mFYM#M=W#s;|XUl_nolU3U|7=CC*Q9jkM^6r(e`~?p zDwab%vGUgK+sqO)JM+g^K{4D6Y2JMuh&3XOB9m&{*MTkFWAeBd1V>t|LWS&1>eW!Y z=}5)8RBR*NC;J&CA^~9c+%M_HZ4V)mIc{3vhoIL6i{>9e6?k!tgCJ@_x2*(g5mq^P zqUhD>ii(i;5$BqAr_24%#fpyG!FG`cw?&-u zHMgk;?2Bm<)>)VZ`N8dHFn9Wdcu3^YD1;3+u{q?l!0$Uut5!&WESDOX24$uDLA`nf zN!h9M@kxhuR>}Vvq5(}8a@JN;O9zOb$2DJwIdY(m9y_)T+&Fct^#IJ|Qj8oS{HrZ> zJ{~WRVVRGanJ_Ae?@DtH9b)&TIJh%28RLu(df39H>GRr^Q%cVcZP)B_arhgqObiL> zUF@kQBVFHTZe3(*m_jIEXG+1))aB`Skm+hEND0_VM4$Gk_EYt==WG%nH$JpZ!(pt|&F7$QO4uw!S5u5Yr4^yv;tc z99?ED%UODi>+SQ+S-T!dv;A8AY4SyEULaD~XYjKmNn{iC|I9)DAD%L{Q$Bw#{N3T2 zoMU<;61NsOd?}f}kbl}h*0J>bQT{X$O^aMNXSCys(ysFr(O%l0dRDJ9SCHt_pzn-R zz4-g#(UI9&ht&@S)|m%xWa_?O<`h{R*5{3vR$~~(B;Le=16^792UZ~z6>{$*|FF2 zxSEQ1xA;!@M-BCYIr$wxOlmje znrWH8f_-u`lPjj5v?$MLni;#NsJi6r@FfN@=GZTCFMczz4j$9|ZhX#eR^WiqaG-Wp z?-wPvT}S`Ow!C379^hGz+dDrWC|pCIs7T&Tux^__9~TeM$3&GNNUzDW zL0)G6T(MQJ|DusjOuL!PN<@>HQt$%7WDr@Y(a|(d{na=1EP2s>-n=pyxo<^*ATvXW z34cZWmA7!TDl=ag3Cs%a_Q|*aJC~Mkk{uGFc&=$YS!qq*m8l0S6e(mMqIB0eykYDD z@0kS(4nqzt7is$}s;;3_gz*$1jJ6d*_L#Am8orknh)-pCVeEmgm~06w6zoaB4oD=f zn#vHG2P6yrRLsg3`u4}=N6)Lnj~`=wu2XmCoBgm&cDz;EQ#1xDR1T#x#;{BRmmI0> zXdI6Vj5o8eMMLw%h1+K}agbwc=f_)e{|LK|x|MH8fMmMH=83XH?|QLO3X?SPvu8<9^Rn@tt`(}>UurvHskIGsxTSBN4ghraZAQMgrn@H_c+~$DO*{FK;^M#Y#;NqY_Dy#Jq-Dvn6O)=f;2!#Ea}LHE~OgS*D#MUOG+?S{cGS`Sx~uOGsC zD89?7TQy6jme2*fdX%U5Aw5;}8@fbQKj@J`^I!n&XlVp$?^{}I>0BpxK4tTmmau8K zS3Vcwn(H9j{pqbPq8!IM(bm>1wwlh!j2$d_c>G=tGvKl}i56mieC783YW>Iw&uNb& zT?R?s0mBdEU1)Lrkg;_0u-fd6{u~$5D;MX=LiV<%vuM7Uw##E`FFyMQ=|gmYs|WK! z$u^FDb+Q+(*}Kk=rFMBbJil3C!@H?n_jqo}>|sbd+S=?OfsC{Ui&N3!n*?`%>@(QL_P5Ink!&iO?4BPlbO`f*TiNYd>*r7tP`kh zIOY+HdgO%m0~2yYjHT>D0Ab#BRK| zzkmB1-Jh!S0}MW%o${CT8)e{!-uuxN!yby9UkVn|uNzrl-i?2QOl|p6zG&9qy=m+* z8WE??+4mLAKKL|`63Og}A@RwC;=xT%!TSA!mG5UA2!Bcio9RBYqnGf8r7tN zY*oUYQp}#4dVF1@ZWd?MvhW4*7p(kuX2zO*$@sQ|<+{+9q;fIipO}llDI|nx4I5_T z^K=-VAMh=)iQ+5Q^m|UXE`M6IM)TlEXQfFIg+KK)&5{7u$jzg1>&G!|bUDK>y)b^7 zN8fC-O2Ph1JOkgfMnsIW&_!;o7x5|Tve7PO6s9*4R~rUlewKglYXZ)o0c64d`EVn` zryr(SKS8O+ZL)E6wpi`r#&P4xjDY zAyHj7nFD?%Cmkww*~*OhzZpg4oVJV4=qcs^N@Yp^1&uqsK$#shQ#wmKr=6XW`^4!4N`Eexkr4N{c zZ`Gy6){3K^ME1wUlQbFh&tG0>*fIA3bOBWsIam8T^Mxmjj)i*U z`DW8BO|bmomghGAQ<))+I&d4(!@j{-@or+-3U}7f-H>>Xk3e?{FC`I^F6Lp-Ja6UP z)?FrNpK=5a)kUVh!+NZ*lv_h9xtOiGGsJoi(qEN8?Y-9PlnFOpZ}>_Wz&r z=l>udr@N&(9tB8?xOXp#IC!zambuI|TEhY>wy~WREAe0V7in8wn&>U5w+go1XQO7T zXj8}kX8G?-5|Rr!yiM+H7k1aPbtHl--N19*o9tiE@poA-)k_|n6%wb57=1OLO%OAf zUtu@=x&JcLxoQaw33FJ-`ycbM2Z?L@5~AP3RLkTr5xjc0#2m9gI#{6%cI2ZypJ%^y zOy@_hv3?q5|(lYXDJ>~v*gpWPze{1M7*#nCA@bBnmM(+cz@x4fx? zo{VpZs^((%=?qce5H|MGbpH?mCl32q4P(vor%Wqw%;~mGhpbC|fmp7W^1sOGX%pO` z=?oe&ap?F;cJjQD5&D#c@jV{(%V(Dt!L(9E3W+qsT_h$GhHIlVaB zSc{cW$8gpr10=I*iqFkk-Omu?9!^_9LVNXhjI*&T(nV)(FN{|7J#A27oz!70tHn*K z=(29jB^TSPFScDo%7?i-xp>$A+IV02m7vGItztcCU@dJS_TtBN!rcZ^E^LaMBcGk) zMKE5^GG>Kk+j0d)(2QKqm!y`{zxmBy8avSJk9=1B>{qp|yZ)Jb>_)AK_4uqT{BW{& zxzM)v*KuDP;pqBDslXw8ai9kElnLnKJt@_rK{hrWZ==#p-yIW=>La#9V45TUJJbdX?9{+qg1` z5V~&`hYm@K^Pud%Q_w@6u68=0iRFGF)%?C(s zN0Ycf?l|R3!R;n76SwOq9&Ls$s1wraor~9nhYudE$}~P21pccnrUNIEukmK!qFQjA z;nRMh|Bm-J>FI){&mYR@-R~0X(i$!vF(XJB7-FO5wP8;f+imz=s8e&hR5X9W5C5+G zZ8oXId`zKVAhaAt8p<&i>mw7}GH&E8sio#qK3FrdUT+c*r!3PQvy@(T$_akIn+DHoa+N_9@AnK4q*zI@MqHgN#XDMfE3PYM%_jW)jbhcTc0*g&U zHGn5E{_X%mmn->&@5IoO=fX}vRhnkNcm7mgOUaSCkWAAcMYT)ur@#I@-}j-IzlqHI zlKcIZ@!r5}D>l;7R}KP9s=?9IOodSLxa49rm7xs5P-@jPtL+nWuZd&>%7WX*Pn^LxL6G3J{5lX7C+~p->ocsJY)gkCZ8)t@xS^(oc({Av7lX}Lm zjLo!3&AWs%x1wz`%>ubSKc5At$)Tap!k#b{AYJfuV@RT%nmPbr*!(;huZ3x# z>VQT#NS`!=d>dBb>I&hw14i->xklyv)jFk8vxE;xd1LH?sqD~FstNo=(kh-r=9GVIVFlSvwWNGv3x2=V9V0ZF9JLiq=WbcPlt`O$*qk-nTrDdX zq2)PE-oLS3#HmAnAOSq5$jO!|EpE5_mVt_K%crSs+8Y`RTixUiv}obWQwU0D@b(LW zdC%(2?g3>z)`rftwBae^M5hjjMyV26X1dcp+QqmJx0pP{uao*K>= z7rD0m4M<}ps;^cUN!`1}BxeQ7v@3L7mcz!F-8(guYE>NFxkssYBkvWzKHQ;dTFA?< zw^cDg>#vo&MeH-~qxi*$9H{yd@(TB}Vs95DJMM-H5U68Yt*Of6?BqAUapeJS=!)im zFubRDtNXNXl0EEWSo>bLj5!0Rw2<(l7*$dubNG=cmpWcN>v$ga^*vzeM3UE5h+R_5 z>qQP<5}~50QD48jq&HU<-*bduRPqtkV2ATt-S+F#6f0cior=}ws1M>{rnvVzTkg>Y zsAVoTuPHgDPdpE!H5RpMeD0CvT#Itr5@f?X?sFLB3SnQ>w&_nfYW|E~NQye} zxr&=#z?zl3rE;rY5Y|%_iKE&H5BB(!xkk9-Jqt+Z#kst zDCl3-izt;X1VGVXe;ddO{)TOJcS32GPxT9f$JAI-mPO@(A1h<=-FL35Q*>8DS|8c2 z?6pUOzHUC9Z40gMH#C0BgOLrUYV86`yCREqw_Suer(oDzyGZ|6iC?oj3xV*DyOl6e z<$hrQKAV*CNTESmFmMOgSLQL$V$qws*YjNU(B;Y>=kYbuV%BoggdulD*5zXCweddf zb4CC&1B0I?AGhh}m7O|hHln0iF$c6*=y%Pt2IzLvAKA|0S}fmZU8QAL1^mh=<+9@D z_brL)wlYcUC>VE46Kx%wy~uz}1WcWF-+RujYalYD-ZioNF13QVdNs6b@YeQ%N&lnx z1&Jj#+e2wb4v4yVavg)0vl}Favj6YHm>0zcm?%Psc zH@?;`RutQoM1wHgm{>bXKh2WJGgpSyiq?njgM@|t+v2nIQ?l&YTiK+o>v|DORXf#F zDZC-Sidj&{duRkju-#u#)$=Cz_Obecz?fb_B#GnUCsS{e8W+-_YUyQ;WBq1q_2>n%WjgQqtkT5Y z)d+7j$+cwKW|EXR8+mXSmy$`Ht)iU71vrb(p)H%O#iYWYvdz4k2QNux4ZVE~Sn>u_ z0y*JP+;R7;A)s!O-wce=h5em*f;=@H86D62E;MTy#?ths@@scZu-7eIQaUmwF!GF=m;g4Ez>6TGD*us}&!igzetf)>``HtT8KZ{)#UqoW3RyIzc~p zd^&;o@T#lO-p@o59C}&GimnW7Nb}GB*WlEdV153S$NE@X<6eg}I^_~`hCYoFBlo6D zW^Z~0+Y8gNcbjX9tY9^T10^|vB=hyd4#~wXwmOo?$^<b2CJJk#41LBSq_A&)^DDE2-J$KGJvmN9?sN^{~%~VEC^2 zrj7*Wac_vGhE^fc&AUY9@ zPe?%;{lRGIp=xiD&&L;;=+%Q;h7NBEJwHKKvqm3)7i1_4p0+Y>cV)5pnsy8Cq}F^V zKZLNQXlaz5lvK{Rp8g%Wkm7Vzb6ibY9~!J#w7q)eOg_0ChGpsQitBht@jL*D>ukoD z70qr&dM=w>aJ>&bV;_V%uIu<5%%U7ltdT>ITBX;bN+2fQd9rSPeJ1iEGR>Ll<>oxjtA~<%+pM0L@-SixcbdlIIV`TI<)v zl&!E*>y^$WRJHH{TH3g8`<%dkH|;S131v0lcn9@(G%$|abs9~ngM`r5-FJmuG2K;{ zYm89}t}r5FJSOvLn2Pcj%`Q2w_1D!*Q;wY6qU1_iD?Chbzr^$hF*=i95kIoESY^^f zK){0=B*G&^?WoP;)4qF=%+uo8yWWE_(*=JYGqtnlbIb6gcaSq--5FQ-sr*Ek~uDg$8GF5)|#pL-cCE z_VkBB+|Kl%^~Tf1r`h|@IrpKFMqt04CU0c?-6(nT>I#{o6=YNwkuO=Fxr}*{(Xh*^ z<}u$W=XC3Ktp9$HyK4LqW56}DsJHF5=KRCI+ej34@p>v0s3~?G7RTbU$dw2#LC^Xr z&Re6p>@a8*a>{t4GEn_!)Wv3gK&uA0;?FG#_qK}VZHzBEvGC4dGOYqLAExWnvm_)l zSBJY#XX2mXA*ubsD#2I{R6XWc-{3dNd*?8X!VTan~9s2l&u*?O~9Yuv^zDm_R{9W>+cbmqm z@?bftf*b8`>np1|LDE?D+I7<+Vn>F31FVv;UkF*qYff7ji6Byve@b4oOF{z`7Numv zJgaCtRcac1*<-K$^d>a`p+odMEv;%5L3So^dwXiwxLAW|_xp4bKcjSmICs{4n12NW zV~&1Zs{5jxSgs0T80gNM&_#=XY&ls08P^JhNG_fjtOPXX0VXd<8b3vq;kddBqKXi0 zZx~wVZ(B1x^?uC?GFYQ5efgAZlTMY(qj3qSY8%jkluex zM&LBhh%fxrAb+LM?7fR5zTjJEP-2_kdef0g2WU^Zh>cqly+EL<0jOCA^N6(%*vt;n zFFAr)aqaq^jr$lu8(k5*^0NiXGu^`MXJLDkEn!<-)-XEcl?88;MRWMjiISGx{Q#c7 zl&OL2TV*K6@K2_ThvJT$l^~uE=vnDgtP`DstIh9~#+*tW^(+c|ekI&B{iwFiQO}aF zrlcNV#hR7W4|=;8{QTGUulq93Vm^u{Z^x=NmJ&5m3-zZirmG+KJaE3A9@Wcgxg z(1esxblgl8Px-xq_rH!f#AVTj^K!xZT|<-|I#nApLR;@19~aC2Ug8)rE~OED9Q z)MMUZ%}!)R!`*Uj2WDr)?sFtf)_?lC;64-hs+}{$ovyeQnSR`^N*RNve9tqiBigOE z1cbIlQE#OgB;C&SpdCV{K57Vsv7dgV#+OSU79gox%dgaV8Xqj5sVQ+7LO107V4Tx5eoBZOC3WalWkFU#ySua>@ZiqDcB&_T;pI0j=1R0O#ig57y3<;1 zLdJqC_RU{X#rwGbUya`f1(fEDU_Wt`qrvz_`I4Ug;n${kwfv_e!*E-uM}NJJ{Z@TW+RcS}?~lZY5BMzDB1xuF$BGr`B!qp` z6GspiK|@$EJ)c~jXwo=@WB<$1TVq1+l%LimF8;p1WUxga#ruN=do=JIT| zY!dlRlRV07!{YqsJQK9PMh7Ts5A%gWUID+! zE`^Q9S@v4Tj(HA~MX|GBI7nseVIRh5Uj0e<7R9^RwzL!kkY$KNGVqdT-H;0%V3Eth zimAT$g1D)z{avwSPDiAM=6I47edqPeNBFUI|BCljOJto{=rSci3GVo`MS$54iC zLFfJ%`Ayd8q0X~57v$l#nwYj8x|Lh(?j$)kH$4l6omV=>t8aT*CHBd4i-^aq?{xA5 z>6Vw{hMo+ihK7eud=4?8Ad49e&uM^a$y&ly#!)Nd(1)(#Ov&uI2Hl)ipZ_|@9u*Ij zmjM;wvY35pbr=$^3J}g5VZm1urN0`liQd-jb8tJhRB>ntd?m`Y0N{>!uV$lE z!?kK9s*OLPJzbhY=7>Gi-zB@&5|@U~<>=#{)zklddhVf;+CUYnrUp~V@MCOGMG`QZ zsagFpGl{h-gTyV1=TNi=#(48%u7r~l<0Saj_iEzka_2(tGRY4?C1~PZ`y`Ajb*riw zhWP*finZ(joi=@&`iX>iqs&hd0s zD!G*)zV>gn3~3 z*Y1%y&2-6q!dDZz^5X4p*j45OI1J^e;w+R||KQP)3+TGMAytD^WvGPt?2n+|&`{Dj zxzEpuk36={g6!%Y0ABrz){~yo(U#1AqG-l!0PnE1=z}ExL0)5G;?M=It>{wUtz|qs zdxEdZBO;z|(4`Raj$nbKWc=ZnRk1}t&5!-0!XneR)=$cRkF&o&@b3Mh7|1N!cJ?A= z0%uV#z)S2PBj)PqSue&DsrBz{3^j%7o75T=@K4I7oH5CObF^um&ptkdIzJFKkeB_W z-PW_dm!vO0n+1T2%!kOL+~MkWme=*oz`EZRxC+LNJk$QX&~~JqkfiTIg!)0BG`aYJ zfl%gYa&|YTzd`;-%OaHuVr&bKlRxC??`?wGstg*oxmEcD^qt_lvR5ffg#v-1Tab4) zeIiQ{bmcmwN995>yTmC*~JDX4g{%u$sk z252N8)(*LS-xkKGuxN{o3{o=Sp=98%lxZe6%(_OjI>7F%!EgZtR(p2j=(WYK?Wt1Z zJS)N_*ii}R4}9dz{k2XF$Z5ycj@LFUS&@dy`!#puG6(wdhv=SA%o??S8+yDIT(sM# z_0x=RFBJQ+zDty)GA@+40Rlh~5<>Vh{GJ%`a8_^u;6n0}=P;wNer5)AR7B@iKu)+!;&Bm~=+-DC7Udp*W{ z4B`$j*+Lqhd6#Ggj3*@eZp0peC|@vO9Eb?J-%#xRi1wp6@Ha=T98J;>D4n_rTe+$m z{u(KXl}`@seg}!Wq`!YDTUV4}Q`&#u{zE-|k`VTsl3b_q9O+SL_kjdFuaEL=TFY^% zG^6lDs@NkEE%0x>iaef>xUMp$`*~s)bEL6<*&!s)09D5^ft;223&pRZBHTHD%h^PS9!&3x0*Cz$}#vD)VU#o1fGMfHd8zA7LfDWD*Y5+Ws?LkLQ@ z0@5MU-7&O;bobER(lA4ZNJ=x5Gz>8UGYl{e?D_0-uJhyB*LVK~>sk}*{jBG{@7FD} zAf7v)jPzR9zb!Mn^GYpkMPl*D;Hz?2$ondPC)`}HOQTPt6@Bi)$!2-KA<29Xg@_!i z#*A;&$G8ich~j?15|99|~K4IlP{o<99N zyCLXLWc8+rOAvy8cVW9fg`34X~5jttPlj{!42Z7 z7>u43lZ4-{VObwYb9JW35ARCPJ$M@1IURHL2fA7teM3J*ols}>y5xhLmC3vBUo-qs z-b*@>u4#`0Qe&b^Un(=6U}EwGpOYf>Ru$l%T2<${PU7c_BAfEEjFehmF04&NC1{QQ z$S^>K6dH!<8Nr*jw7$SkYXE?P@Gs#a{7=ayo)@UHZrxE`7_W#DzkDfvsBD!q1)ZXA zOYnJS^+C0daXGF<<0N-4LA|fDhqUr;Lfd}hsBFXQ-b*gzjVc7I2N9Tcg|Il?R`|v^4_BlbMYh~ z+rtRkH`!G&Dv@z}c+UWRW`OT5twHCw`=-(4vozXycHCDBU#>~7$E8>f=(_#kl;4W; z939e>O!qSPt-ABZi%S5_tUG+=h_Z|&SdMz(4&6>H;&E2Hq`p2ad^*|wUpK5|0|dJ# zyub1Z#-eZ|nKfiC4z1WHIiyQkDh{OY{?my6@MD~ufP-92D53GP_-%_#JG^*@pKi7I za3NVOWq6EX*R%_^HV-|Fjsdij*T2%E>@7gQzcK%xPKo4Y&+ki}81gQt+yGCwIMR_1 zn9D};wy(B@(Ho{*_||k9RFQ5z$8Uoi$YtA{#UhP4Y}TZanuWK1=jWm#8r(aI1;CdA zQZKTzDEHKF9z5JVc{8(l{HL@|SG1h*^HS+|p}c=W(-xi8%}OFyR2TSuGtE8Ib_ZQo zfDt{?v7GDjwn;yoW%7K3BVnlrYH9|@H@~ijo`DyBl!30D`H;An4`m=mqpBb?s>N|f zxNL7XP!SMJN{026mz8rKJ=|l?noUXL+*Dm3TDoFLeq^WB1`z!zuzU|}(_v9YSQ^Yf;llF<4 zQaAz#wvkMi0|aj2Qnp)X>z?Xz)J<*>?^~aBh!6HX7Ed5o0yN92=IBgpEq16v2RbOi zZ#622QwQ+1l5Kt)6}9?2ckVjkyUoi&1Ud;M1-!#AWbk}TI@>0kP71H)ee%&E)_Fox$i$Ut> z0GQX!h%i#mv9m=X&EflP&R~g4=%aMRnm1VTsLJgu&)13vdJ`Y zl*3SSJ&4I`J3u7m3-h+trP}=*UxF;=r{qk`M1d~XGbxz;;iTxMUe`kZS?I(8(NR%d zoek(zaDppFqx4aP>G4^hLuK;cspD{5&tIK2HC~HHhB;%+Ou>e5UEDNL|L;Hg?Sq5d z@9(F0*m$+fqSE?i&vB{eW89vMs1tun@?_EFHWGbS$;k-`pV1(i`KH8bFPZk^cg|w} z?}uZdL5w7wQ6Q!I{M=;NhiP?xqitF#)DBbdRO!tcUm!NBrQ!T$Md>18lkbnZ|5<2q zbTl_L)>@p~@TPMoUw;Ez06DIo_E>mr);c2fL5d;eC)N38`8d@iMT*y|%UsQ!`#0wm3myo37qIhe zDK+Elg}NN=qZj6n(HTN~4^K;tp=vgbHXQg+5Lw>l2S(+Q*+5Ux>0F^Gm)_Ws5FgQt zj7G9TO^(K;3E#9&FUQ=Ar;iqI^W>LTW91$6+n4+WsuqbSRsO`}zvzC~YsO1I?cwXR z-}r2hllv%E4E`?PP6L1V}t8gGXDbz^8$)~oj=hR6n8OocTbJL%u zPjs85E01l_jF%-Vt z+TU0KJSLwH7q~paYVz=nh0U{gWV@3>5D@t`SmhO+#91b44yumB>FgY*WzyYGat8 zbBDfmQU$8Y`ThYr+maf`;(7uwV<=D2rSeYJbheE-d^_JMjKTa8UpPJZ&~}Os zJj|n)av91=$&mesaMSV_z^f?^Kb8n9Shf-D*|3!WQNR2K?!vv;G&GEqHu= zTF#Q;he&x0@|looK%r2gX5cLr5a*80kVf71_|tZORE`y98&gIS5?a}TR5#APcW<+{ zzDDHoRaCo7n11{au*#njjuDqH6LxU%?c?w!*6vOE{_Y2^7f*0O91qJ7xnq&)4A^n<3&?ePlDzHSu z@Q?}eoFMl&CnKV2?pv$eV;VZunGl;|4~6k%ndQBr^z-2 z`bJ(4jPiucRlB^GELf{wH5j06N<*lOm!RjUi^QHfySJjLrp}A!PC)1N1u5P)-HZ4C zIMOl@*p|6_FS!dTDOt&V=E1g;uFBWSty?|#P9$eBZXwr0CYY%eUGH0k^+xuxxW!MJ zDJp=`+s^PdUYkPyP)Cz)5B8-7;|h8GxZg`6jPqVPTT)kll$OYI4_elp*FSC>v^O|x z(t8%90!^rS4ZXn)EDd|_-~~kh4#lp_eqhDe#O%xG9+-Rbj|<$WO}->v9jZ#7_6@B9 zQRkze+1n5Y2@EEtf>A!(F<0~8HaKNrIVih`7(b1tNuup_OYIun55FzOkf2TP!)?JN z{@X*N6Kb8uT{GF#w%y4psxOUy0XPro5>f}6b~+ER$&_?%)r(@3{7xJ{1G)vU#Vvupop!xN$ZgiJ3Ajh8RILsTW zqU2qizooM^h_MeeN_~fyLSn1(O_wS~*oIkR9q)ZDS@oBV@;dtho2z@ffTYrou05zF zS7)jxuyk+zOLx!G>78W(w6w;(#pWJ5R;rLN8)g2LZgxRg`aI>>hqRc}@qoG)U9Eg^ z;oySxd0tKjVY{$FijvwM7)-sm=( zteG>3oNIobfkhyMZC~4AJa3;CGL>a<*cyhpb9utssHJJ*r$tPN7cl$9$ZF>IvQ*z@+6^g;@N8 zSpFY~k~Co+GC!(e#2ZZBHRPv25z(wV0GDSk$-Ni+Zbi5l-x1E{3&<1ky(NPTnM*M&;! z=hO-55`C6A@O3ST+P8BikJMOe7F_&$KkMa$QCoo}521L!niZ5dBX=!(xs%GnU7u@s zl2V#F5Ln)PFiUP7DrqOaU5)&3o%1%if4Meyw6P|NHjMjrvtZKL zWOCrwBn?HC#l$+kPt~SKAd~A`eJ#|!iztaSR}k*j6aDX-7d6S&y_{_2q*q!XAV}K zZx{3|A2%FaIII1E%gNrLoTR+>TQF9cINaX|JDM(D0*eaN@1D8$hs=>tN0!{JAD|qJ z0sAjf*++q@YIA!aBaoyxX0oqoQ&5P@$@Z_I;uSKN;k|{~)gp z!SGD=oP5!Z4?S+d;YT(ET$lh?jf26cRkECx(;nFP(&p@pvy890{3Bj_5_Hz?cSE=s zCbi2Vn*4iyPXbQlLkp_j=OZ`r`UM%(J$H#M6Ep|JpE^S(1#@i!Knbm&M4!6&RVCLb-!S+0q*=6%1 z-4mHHE9$4bBt^%I__VjhOU*2A0tg6Khh2zY%naZd9nQ6k+m1#@m-dYd3U!)5(KNtm z4WlBYz||eU1{_Z00wWXVrnv}+{HzI(wa7(sW2*E|t1 zYTNFZ!#l_|=xqpxZBn;?;xL8I@`E8|c99IZ`fBpC-+-$}H$`t$BmUXG;>Ny|l+GyJ z58vMuV7C)yfeb}rd@rS*4G`}ks{vVfx{uX&+2qAvdhR)Nw_&cHYFrIalG)yf%qRHn zwZd)JHz85wE(WN6X-)HPFC#)Ly!Nq+%lOrtNX~EWzb$j3#%mUB-cfm8jds z+Vds+c=g%v?3BFfa=Z23v4u^hVs#siv^)Ny*mC)R(w1{bWSjfb(M3f|{LvY~(~O#hCK z>Dn8zy|PxC3FRZB(9F=Nlu{8d9cKEe!2Y+eENb1zH8&@BOzDjpdNJam{cJ)1qEhI6 z9`giu#pMf6<>}8mEt7^MSC4LW#Pzx@1xE4&8@-2;wyMLEUK{uB8_?~}yjN}VK+rml zP!t8Ww+XF{ZQd;OVh`YTVTOB`O|aGM%;WoO4k6ZGx(0%inK`1+7i_m5_G#+y2C`Z^ zUxogveEOt4aSRc#={H;|z9ByEZ|Q67EgZ34MX|sa);OElu&fmleChHpEjqeIf|#Vd z*JM*S_X{Qu);SO#_8y}1b^_F!*+X$Na{0+;hn;O7wk!Q4q}QY;F6n9+KK8V_=G%>> z$QETvdJ8>1&tU{7?B+``3M%Gu3d^UXwG6=g!@6+Xk>^j(LIIBtd$yFAmfaUWdhFKW z7=4NRyZlMcq~X%M!W#8FgTO;ndhwvG=`oYJdgh?W*TXLMbpHOJ(QY5lJHK5E6Uwy? zHrZ0Q{E&i9}Z0FiR#BlEMq zULpo&p#kGn>ki|qfmak>CBY1qr|XJX4gBJpMX|b;%~`wNd}|{fg(Ty(b3_0blK}f? z6;b=;Cs@tcC~8jy+$B;})u}n^#Mpi=zXK{NnhbgY<8Stp%6G_V2sT3gRc$cEu9T;P z?kKU(di{H7CU)~bU^TrHG?kbAwltSe;RFDJH@x9c4^T&9TPrIrr*3Nau>Ul=%>`i6 zdUsdCfz&7csSirz{u9qZMdSKTJ6-&xXE5rR^<57N{1_TbZszp|4?-R&E69Cp0|oyA zMl9vL?X!3Z?W|E&kCtlIv=wMi@t7iVTE6_3_Rz8Lg(LGxVy1@;*drJR4d=XlZ|#`B za7%n3j`pwI%C|A-yRB`zCRDNX@*zhyZDI5q&z`mOd4TcHpT;kHy|;apc^)FJ|HN11BpAsM^6^}Nn!f)itFq(<40xR zYJ-$!_?KjrYayF)h)|5r0|{p4tkm-@z*LZV%Gy2pb|Q_0s!ovpeeRt~%}{r?A1IXx zRL$|ARA9IK+1JE7P&s`1{DhCCHMPB~NOfkX$k^>0k<>hx7-o0k|IlSu1wsi`EhBR5 zi?sl_NnH!p#fgAVmDfAE8yM||0>C7j%Iw&?W^Jb#_{zHf*_<_;v!EX-dsbG zZh)|XkWis47_v-xOyLhd|MK?NflkA71U6IRZ~F{k`UgYuXUxx38E)0`UXIVjH=MPG zk?X~X+7l$;uy34_(T=r%#y(E9RsfebrAcYsg6Xv$h(nntZj&YDFKWG1V`fqc!*xLbcM*bEbKN3wk;6dq(TJ=F#0P={{qmO_Q zZ*Q`{&376uCZeZ{i;r_S_(9tLjK=W?iY{0C`N8LM;Yv7(>EfQx=vP=L9igP)ouxmM zDzm>InAY%+8=Re-<_Zz5x!@*Vwp>B*-w-1PDeJnw?Fg?PH<=Ws9=;%fOHh2jn9#^! zi)Q^0Um6tf`E{}8i`k)T*)7e{3g7ym`@?Xks6WH;!quV?9DA&deTnRfY`4nZNo8bP z9NZ4&(g#ajP*AWz5f}WsVyiMJQd#MK7l!$#Ui{IGHjG|i`Pwd=A1_v8FrlCzmTxNKFtpT6Ec+|%w3QIm<{A%46XYZA z-!g^_zQ8bM-R!&LDS7|XkuHj1QZh0K`f-9=WLu$~c03}-$X*6`2ouN3iNkzVHXG*v z$**wZU~C9-D)IJ^`h?8ZYDYZd#)<7EnN;m={#{N`J5U!Ma9R&*UZ(`!omI8^ecus> z;d+}s5Za|55irK$Htzqz|LYXkZJ`XT%y=3C68m)QbA2CiDfce%UHTxfb$b8ruc)2! z=;+$P*wzS;DP5RK6X7p%a2=P=RK$Vs!Q7L!kM>gC%cwuu_!OzpKdC%J14%JqQgf+U zJaa-7NsWpf9|&i)SL6!n-$v4l-cUR@buKmX>9B5J0@6{inJ_)Ps%CXJb7nUw-M9!Sd-Vsr`Ph z&I$qJ$VSIg71FUq?F+nUj&jjZo^Pvtl{3CxC#C1*GZ`9>T)k{SMPM3Ce) znkvusZ@#$Dmhe`f(2~_%E~0aQj_%Kl!NFeZZFIkq&ABrotG_jM)@_6?R3*qO^Vq%n z3hU=PM18JjE9N9TygV-EYCg-muPHvA#_&k3j@5Jbztf!1loC!v@lF{PjxtiAI^UO&Mw-9)+U<^ zj2ZNj3Qx@BUz^CjHGVG}%j$J)#C&4asu}q7sp>lsqN7>O!OjV!<@?@RZImuK2}i2D zQ*3wPhRIUT`9*60`zaCM@xQ;@M*fo|o}9DqqL>Tg=%vo~)G_z+)X4TkKsBaG*F1r~ z#-z(EEUVpWsWtTxtM*~BwDg1o9Ix0{7EL2w=Jme`GLbYa2 zjRJ}lQ*?pOk52|0u-OB#9*IoQN*ImdDGzA$P|d4cDR^tzf#D) zMiabz$+q}OUW;#}qLD+1Mj_Sr0cSJI^AiM~&_4-gqZ_+0q`uZe#-iRu$Z9cbll*~r z^WzG2Je7!CE(&X+L$Qs_kDsB8Rn5+SZml{CF-Jc0okbDV&QdvIp2=!Uk);w>{E-re z4ljNZvjV>xxa$(_{JMHua56tEwW?V=DfsYrk;i+xcV@S(_geR+`bLMRxm~1~4K8?= z&_M&Nl_~h_=_J?56t0)oWdcQkGx!qQ@NlxZ-YWiXr2x23h~?*9WNldO6hj|x25+IU z$MKoEYWjr0GR@49vJu)a-IC!Uo3C9d>Mq{w#x8e>QF-VV#d(GEq_zmU9PsBZIyzrd ze1k+=lsSq<$89em>)A;2(sOlvH<`a{vu%b{eVB3@@Niv+mp)cdX^ zm$4w*hq(fy{w^I4(Ud={yB;QfSoe(Z+SvU#Ize$fRVB}CpStm@Ys?nz9{hl3ds&ZF znp*f3y*Yg8B>AsN%w4+VPQDQpp2#C3o}O7EPe`|n24KLUqVUgS5t#!B^oXBGOZe95 z9;ltdYWM+)V!VkBFq%;}u9#<44c*ppH(qWPMWK`l>b3Rr4l*D9)>kOq1{ul@2{dHM z25!?Awz?Z(}*^G7+f+&>?z(`1NI6-j^K+Z6$5{yqRM9swrrEFYN>~{xg=S6)rjdf zouz29=@yiVZdER~YiB~&VxPsKZ?C6R?eTjtk@e~}f<^^Z*Jul`zs9QX++h(8bU6E+ z)BZaDnmnJ^UIh8r1`coEjrpkUPkRbGC9zLLb!XacJo4ZZi~c$Yp#Pvg^>K{|2(=tKAEQNT^1Kx?vX0;Crnghpd2J-ub< zzw2i**!BA;W57r3-V$^3U&f0=`o``*)cM~Mc9Ns{kFj{KOtM?)W%QRwC=~eKnl*rF z9c9bvqs`9JUu(tNQ6@{Izh(jrK@he{WCmYGQHXdUU%1WD!OEL8`zBEsj zyKaH9@404<=zy(#?^9ocW@0<`vm>LF914FC+=_K|aed9+d+dSbKP=BzwVrx%$BB@z zB^tS?CpwOS@{+z+C?(75`%uUD;6T>FK9qOYe?;wR@7+|4zxL+3zRNerD`ZCD!Ku3n z9B(ywu5WH?DAw9Wlo5yYS-jl~c+Zt)TIRk2-|+y0SVyE=z1u*ZsU%SlZ*7G(-G;un zl+aQ3(B&_?(B4ZsWx@4GePK@gs<}}yu)rmQhADoB=wiC$7xiGJK$r2q%!hRG0Y6V=d>1bJA?=!v z3rz(%_E+wY>UMp1xwm@cFMdKJ{b`&X`(NRweV;$4Ii@kx+}ayU3oU(|C$PEF&YDJy ze7~LeyX8ZoR%O^FDn0Q zN7HoSDdnNcNYA&#?U6_sv^_uE)>Y2dz&LF7tzMoLI#{r z$h9;Z1HMGBi-)9HC1Vk^!h=y+*5Pj$NMh&>&ZV7QkM7}>UuWMmEBA}}RP|W5^pLlD zC1Z2X9lPmV98&5RLRTJuvX;yiMP%=5`1NAzuR5)n3M#z+wLZpT!NfO0_5U`(e*ad2 z-}BnO`{d+hjw()3*Ki3vY-y12X{rLj*YQ6s(N3F=&X3Pf9=_<|M);kAQl6;HO6Mu~ znJDXgnk{o`LX0uA5Zb$(K2`~DGE#cWCPJRZ=Q~=Fz+h(OTxvQlm$72JbOrXov@I^g zGo-TP0orJZCq!SqoHe_=E3N1)ZPVmHt9aY;U|Hj(bH8t-1QEl;!`>~0ELAtRzn87K zRZFNVHA$r&cs+PyCK7d9&}r4K)y|`xh+__u?k8@aKFj zLpR?Q0NZ9&Ud!J9$rF&CZ{67dteTO^Ap#E~r&t=+XM?UUgdzL+xz(vIAY0Q!28?AN zje!gDErT&$=yA5{?adsSnUGx&Y!2I?@bg>L!X=#@GcQtl)b22i0eqZU0D6M8M5)UOCC4q;d@3%)pj zvE8HY`(xQBJqe+IL~hHH%KwOpb8wTfe!qu@Hu^No@=Ko9+!=S5-qv~&eCF^;U;A-c zAH-Ypb$XSZUxfcw$O+W7Ev2Pm@+?D*{Uzsd$VTtipg~3)JJ^iN88q3dMCjND^7VrN z0kXP8Mp@<99K>=OIfM@@_*Im)XR-)5p+0;JLty=S>@yB_mZxjHq~F6cbhZ6#6ev zQyMpLHKx{X;wIOQNXpP8ZTnI`V*mW9WMVViJ(er~IM`4ex{xUdoNm~}qXHX0&D zQ6})k-_+1h)uFWOPcWkWKc%zYSm({(V|ZoH-9BpJDtqD-d{;Hfge9*_JKhhPNJjbX+F2h9ZJPzo7ZrX+=IPCw5iFYI0y=JwpOV3Di4LwQx%6qT!G&sQ zj(2v}E#0k~eY!Z<6JA}q&04x$R=qwuZm>70=gE7K%Mx92iG2>Ec%!38bg=z_YN~ zSRV_zX}M!n^sVtMk8u&#|HNV6r>z+?^WJKbYAnwx z?hV}KX)@`VOgQO@$N9d?3%@^ng45}Nq)PJ3Mvg_iZ{nQvhcELVczs(CjLDbJM|NmPBC9b z-y)onLE@Rbkl_D1k23eaz!LFYZ+Wp;6 zrhFo4ch0`z!i#KsTg){#JF5bk?lCU+syAzypp=H7JtOubkAiD#p{p_8v&i2(wSRBw zNf8ZOIqi^}LM(RUyjg{S$ynXv4L?EQZd%`Q(>@ep8(tJGM3*5x-r)< zocuqOb9bblfA|cruw$g0FY#avC<{b9-mg08>OWRdVBM+OseZB@cE8J7#ifj$_j>mI zA7n4LJp>emP_u%a+H{VGJ)|FY5`v5vD472Y`#d81w$p@+TUpoV%PGNuOdsJ^G#{`= z%%l>VMkG+@i>sKTIjoP4K7J$N6uA?GG#%m^RQ%gODHN!Wvhx7A*(+e!%Dipf?I&2e z>vrH=QMM;}fMis=>5~E7R`*iySZ?2Ru>JN{ia?7By;U$v_M7y=hHt{#38=`qWkZy; zYa;vfiQw6N&@OSKA#f2-W(4vN{n)WG;Aj86l~N!?IXj;*U^9nGv{a6 zxU=P4>g&PVFZ4(Sy#u_(x&CAwZ&F#2Vvg54u0E3fiCB3w^2!o2fR3G`VvktIQ8j>W z%DiLbKl_WJ;H`?(i*_gNT0H*hQMltzx$zex4KCawZ1F%nFzK68s7)R6wL~)-&v91b zSUL69C9{1?f{nPd{!Oqiia)|T1zk7bz{!pwQxaB2*C1|ZnXEXh+$Q3wM~$fnK$ zfl?B&8@Vu2CAq<##g##Q-fSU`zJ{4semICwUMUxM|CIg!*B^~T>HM}N`t5w%H#wtg zz5*qMoybRHvKtbi2P^!QAx=qEho3(cYV=%TGS#3=;A%t?M}u>r%pv4E8#qaM#SPZ< z&6{5caCpm2;)OHvLs4n~@W;Y5ERX-uFk3%LHHzR1SnWq&?8uM-bwlsTMk`et=V-(E zwKAq8QT$RpJa+cjZ#2DwS+-=)p08MBz8|W~ZNi zv-P2=h&7(!v}-94h1EM6>?FgUyPc+E>&=iOR8Nlva?`$K|00%+%TMzVm9msvq|CD_ zz_{^*FTJ?EzRI}T99vG|TdAn9TBxF&IWCXJQk-r4y=1`YzcziJW0J&(Q`pR>cON24 z@;?I>BhQY*DHb0g*+ZozH#*DhRM{Rc9O0#UchsM@1{C_eoUF+SeULSCxhBn5N=?%| zAVhUQ3pxAssb+`FWm+rPkOQH0Rvb(!uo<8~%gpSa67bX{B2uryDar*;z9;&=Wd<1z!5ZL~C> zdOuchCk{a|K-yl{k~%uscDFXXUNCnvfs7daEk7+Uy{xgbm#GUTad2fRA*-6xk{nkq(Ll?og z)cp3}e3=QPxTow<>dgk0wPB0~(^Zw))Uoob`}l^a5ym&arCS##3A+%5hOI`#%Hcp~ z>-Y(;)MpaD)7tn%+!7+9l1hVM32$c5WW9u~)!m0&Pv}fRhxt-ynu%0}U6d0N#{MmA z<2;+?rI??ZK4C-K{359uMLpgLZ9Q)w+QmA48mUs^7Uvh`5NB-$8#Boc@AD&;nA@t) zXCghbHQIpGc$Ocxdj-gZLn6P^B+Hf7&r)O(o8hZa zQ%$q^^XqS#HToz)&DY9bJXZbFX9a`5yLr1;wr#&lBfr@;s@C6t;sKf4pUJ?E?nNaY zRy`;W>W;r^ZPZ<%x5GF&_l+3NO-tV@GwJF#lx+HRPtiU&M%InP&Tp?ABp8FxX7|}x z)8rTvywKS(O1xd8I3go4Vd(`-w4|LoMUCF(Dxhp}C#e3mwza%KekLws*+{G_z;^az zQ&&e(`zC-NK8$+ybc_LCKkutv6x`u$FLy(^DiNHy#%G|@ z*yUB+5KmBG_Zjmq0}>VmM2CL7WrEC?RQ;wi6m3eUwd)#M^tk$Q z!w2ko?+;xt>e!8ptEtyXcj3d}Q^`&F#a6!HD;um^y3xNu2b)v4!S_F?h>qb|F}3& z$mVJC9F+*^A>O9Hx>L$@;JIBL(IdRPrMF+ttQlci)VFI7eR{dXRkdkNepU zojf*#<38UbRTDo=*P>1?-;iG^)th3i1Xu1uRdO(Bii7;Jr#C#llq8Cg==<2Y0s7*( z*_dlxL46zK_uzGcLIvS#eMb+NN@m7TPfJ9QV^Mvo0_w%wB8+Qzen!n6?$<1SAb>e( z1ZzMa?GE@WLn6&oH#5}pTPGiRcszdWZt;4s^57Q-QP=MmU56aNq(2&o3nBo#WS6;? zRvwO+8YKOxjiUvH#~U~rY%@AT@6gBV2|#sq_;e7h`nEWuUcFg<Hs}%UgSrKd{|{a zGU9u~a5v&*Qo*gec_&nM;n~pJI|!?uFr4?a|MzDC-o~;{cMA{IXFA+m$|C!;Gp(*1 z9`X#8&T7k-TV{??PN_yekAt^eKf5)+Pkty-e3?{}TD}~W6)L4H;6`+1GX?STeq8~Z zaL7e9|GZXJ;lV--O5gY%eEAtrPMUv99PQc$^wqRt5EcHARPOw5WxA0GFxX=A_iQE} zY}Gu}<^qD#%31CE1&S8k{+`+Ui#|Q}QOh}A=DRHk#$Z`3KiWk8H?~JBWtCF1CLTG@ zA^qQI$tPnzTkqodM|_QlJ-Gp~I`C>4--b)A(~t3$ujt_;5|XpABb=xFh$5BRv;Ti2 z&;QpE`2VnZ)RYlldc{w(9%nsq<9v6WYa`|0--b37smCYRq&A$U&kHf_r|xuv2;TQ= zm?Fa~V(AXmKD(v}6+T~~>8?3AN@0~UnMh3z(&OUWzy^{!Uuf*)54C{!OjABdd~EgS zlb^1x-pAi!_1zvW8L{)E7pwP;&e}|^e@BKugiERzFSXj~)5R=^TTRc+O;7@OpTkbw z%W6#Va$}IL*t!a#`uS$~gNlC@9RGbbWd7s*$z^nEa;wZ1Wf4A)HDR+Q;TyJIl#>xd zCC%@0B{p{AMt>bly444Tfz^`=9)aw#JvN$UKDvCHBtgD~nf<2RW$>-f5}S_!Xq&1w zQ-5LbKhFY-d?_#u-8a0)^x(y%b{*c|h+Ev}Q1}1Rx#+3|5uJq_^$z!}9nr`QZtB0Y-=dalKQT*3B zu9?$PLV{%focHGZ3lj(~5(xq6`23;!D#cdB_?7;I!pe`yG%!I_lg?Ccu_OazzYS>j z9w7%{oZ+?`L*!Fh&g3=q#*Ek+$(qxzi&Z`~Jrf2weGWT|3;|ue+{#3cs=^gwWS!dI znmLiyMe$+7EL6x_iMzy+zq>j84ld?^>Id=^JDxG(RKqEp+c9$v)vImD>_Q8jj!E7cKvG*uTZsy7PPI)_nWn&uNYAfm>%(UX{$}oxjGPSHPXSG< zg)XdxcqZV|G@L7aeRZ3W*tvG)?hYUtr0gK|TwOfpRH%KD?eAh$Sg&$|!1FAt z_7=Icw`p9yi{4Y5D_@=DA&rSwj*N*u3pn+8Rdw27zkW2;?G|_|!jZhujP;pbM64Zr zfpQSlWtD27fYWKNe9M?&EFhEb1`{xY% zV9_05xkaR3+}A{J7+a$b22`Q#76-3xmUYR-IPOx-hFw0swdLse{IxO_T!LJ22iHgz zrtHlx(J--Hbcik9_2#Y58}ZfZZ;wcTcQ-#x9}DSXGuf8LG!xZUnaP2&E`t$QF9;tM z-i0{oN@~Sa&mVY+6sDTnu!VmZbShP*bI2_xKi`)YCfkEB5uN7}2Z%gB4EcQgmeNyUy1wZ(zaw=B z>fz5Ao~Xiy0>&&^0sIy7z?qM7AxekqotO2>tC6a&k8Id%sdVgnv-4~v>&1^FixJA| zoM>-``cL{}zAX>Mrb*=pw&%@?G+@xhv4PjNa=>%(%HH~oohja*Hr^fM3+h^X&>1V% zbeaaQHi(r`GUFplHM_;TEF&={=IN@$@Y#dX9yXI_#+M;OZ`+aLk2`&cFZv0=JMB{i zKgojN1+)@#@!b-nXQwMYZ9bK#ej#3t&>F7Ky6LI!p=Jz-(T81VJ+u2Bq1g**vDrJs z-?p+%DSvIJ9L4&>gTcgbT7E-CVVKQE+n27Rn5&iAvd$Gql~8m8xD<1d&fp&nyX31~ z1v?Wvv>#0dsu*<;k?oU=>a80r!58HWX%VeGw>S*OAJ#FR;rj{Jc1V&T8Y2X5$g9+wlF&y^DE*^`)fe_3A=> z=lM?PNVVBj!7by~zpvwljEJI6_vXIW@^q_|ypk<8J(s1HGCQu8YTDz-j-1bgp2+pr zbpKsSsOM@dl3tKruO~iyStifgaIEqj`;tO%)fEOP(vwHCRcU@3(>X)a%;SMv3KZY% za9(v(GuwxJCM;wKmj{&5MBNfqF*l)jJ#eYyj`Y)R{~c!LW^p;yoGeS_w{=b zs_dt)$c}Fhra(|FzCisWfLFC2w%HitS4U}s`8S)0$XWMEU;h0bV$xCT5dXycj#$Jq zU>#QaaDR@XG=!lx+mLypMcLS6AL3c%p%CeIy;~yDbI)=A`#&GuB5ib4quDH|wP~Xh zd&ygo*XN^M8J&KrPUlffejmn-48E7Ga7E=OrL9qOSd;2Bz+~qZV_?5r`5>Q_7=Pc1 zLubUp(S?FD0s_k|;XV2H&zYA~)a);}b%*yojCx)ryGSRHm2=UCT7F9@U;4AFWumiZ7EBSjFBt9SHjVbX zW9Wg2w{ZasRn3bHGgaT&#$01=YT1M(#!a}Ow#3Us@2uZe<019QzBt&ewqU}9^b4x9 zQY4IPGZGOJ^?;Si^-ysQFE`YZN~E8P&cSd zerIdBst8B3Y2zfce$ET!lJC7JVUE5INEPXb({x0@8ZJ0Ip*HD0DClv4<6QgyE`K>& z>%;t^a)$f z&7R5j+AEgR`4jZ9%~SBGdLAThtML?&wUd48!Jm6grnc^dQ{2=7y^vEjwHL1BB8+V&JTkg zv@ zfAIM?xVrt0g(!Kxo~`CxmA1!|4(~*Qh7H9baUe~H@?~oKIqyT;`KJh#|3Gct_tOF}OV# zRVAL7@U)kcMg6&?eiK_yo0AV?Fs;OlZi2_^u7TC}n^B4g&S=^lD=!iNsPbU2wviFZ z20l4*Gq=_29|Ot@yIZN`ip?RS<>Op^k0)*Zw&i{11FdjM5&F5)F}9oddOJE*FDX$1tO|gN()G>CibPnXXHA<+Sf+f{5t^`(Lv535dt8C#E8}Qd8<-||3%q({vcR2 z>mVz;3qL1E>Mfj{hdYX}UVp7P8ct~sLIpUYzZb|D7NMy*r*i-~2PEg&KmXYJI4u;n zp;RN?1y~1LegC^xjmieG)=^=e70aFRY!Uw;+;?&w-FlinD_uVz6$+XR8l`wkdAOO@ z^o!yWQc?};N1DZ+MC_G@k3evN>h8ut^;j@o`=c>c`NsgH=T|}lkUt1lNQPDc^KqKT*S;bwE^2JfGg1> zX5?U%2GcoNzY)LCXSFr4T;TUY5N;w4V2D6G zd#orzLc4qa^Y9NX+GtS<0Jm=Je)=^BcTh@MuXj;;sl9jsAGkM21lxmCTtl&CzAsA> zR2qNY^N}h~RN@AA8TrWOaQ`IoRdbGcO0R)GAz}$ArA8Q_`4Jzy zAaVEh$D!#=P+!n2hY@V<-!W{#5Ka$sQ zzbmE(y+-_Fw#9-v`f1>U(P)m(G-r?l0CqSw(w;n=tqYYZk_mrc8{;dVWHMLz;Iw`llfG|y4yB+={Y*%9cXPogAKq^b7p z`b=C2o=d_gT~8bJ#rWzH?hR&imM_g-1|qXkSVXb7EW7tys?5MA(frek*M`+MoHJYUsjJu|Cv}XhifXietMDaO889eGM+wgta}DUu2MR9 zwY;ul7UrXLAQrm_oAC;-HrNBDm5b=e#4cai({?=WpTYttr4zrk-wI?l}Du{D8B< zf_>OttUfm|>(<*$o+21iV4K?0V&fMVXs<#smVO}yac^AI7SGNvVdl00>ZXcNB+Au@ ze>B-Vfh^k*+RTJG+?aBtv^uoy^!=-FAD1>X4{me}eWP~u{VOp+$E;4HqAjTCzVFSP z;PuQqrnDrp54qc8fe4d<;voNe6knP5>pA3<1w_QEfrR0CWZewTyNP0kd0zjX8s8Jb zuq&*sb$zE{8tJzdApveZPL?kcFzRJI*Jvm!#M35OB!s%rZQd&^&0}O-CDOZNy-=10 zeSY54r5Hrm9d-pFaOdd)OX)Y@g_DUF*k$FXo7OLAIHsM%2l`dMu(@52SUJ^%=>@(c z^KGp0)8{8-a>>~f3wZu$2by$RSB!^ys*zP33L75C^XVvZmIy$uLLK zGO!Zf?b!DUwdlc?aWjarh?i)2(J3=m@QDkfc$ z%~2RTD`+klKt6z{2tMlOE=xRjkU>>q2bMu6AJQ%#!?!a-PZaoQ4^amWGT5++(yg;M z0%4?M(+WWnz^h#dDrJ`uPhb4Zr&&z!%bz1;^C8GN@%fP?^I(kjg`Pb>EhUcU@p++6 zFw*`0rh%0u$Kdb|syDJ#m%FGw=R~%AQY?cEDfc}eGw6H8#zrAiDH`~9zlq)l*c?NI zhA3Fe514<4R9hXnZ-zn-NeC}9X%1aT{FZ$mcP%$kuaK*>M*8{$s%1$>_5A zk;@iMD2vWYzym-~036$Te9)g*pAnR==3->Ba^a=bg-bb6<>WlF%L5woPfa1+Mz&`# zHlx?RP>e`9N|6&?jtxJaB)olf>YFx;Iez~4jvPgNqI%vmgV=^NaXZh81lFVt_corzzb!(YvHMeS zjvg;W%EMW1(m$hgG*6FWI4^sY)3pZBA~9|5)BUT!t;NwJMw+T0EspiIuGp zKHdy0d(w;fyNFeY>xq{Y{VEDM9c5QnU94p2corBk%}z5wNK)#<`A-AlC>i}j zXs0;GRfk@A^S;(-Hf`;4#qOPb(lCqEF`u}o#`+A*WJ%18-FN`=D2o?TQCMW#st{a4 z#(31u^}d}@pnDLsheR4d!})zm_&oXBT1tyT2kKPO>OaRWOJI9Bf4ggY>bZwr6eYz_ zx~xhza#TD|W3?IsxlQ^@H@XYzSGidILZzZV5|B=z$2QBOn*M(>7+C`22>*vb z&9km!g>=OyNYe@#s*cNzaEA?%YX=W4+H2*b3*s%lM>X49ZjrC8Ct{0-@u&T@fBXyc z(yy#&W_#P2$-(y3d>tAG4!Ch|}aMR7#pIu{_%h9MC)V(}|h+`P%mn?U!^BLUDQQ#ysacjnzu3PYB+W~;%UdMua-CT+%U4{JRV zkV;dJJ}&yiZiCiK1c_~*wehIrq>9SgL@&~>*KCrrP78G?>3;s2v*g;wE~(yRsr>HU z;?$n#KO2Tk@Ouj0-rLoM5yionYTglgufNB2X5dU}wpvxXH$^*pcJI)2F@&!>+!7)& zU_8pE&sVcC!%M&45K2u}KlDzOsi<(W$wj0~e)}i0-tH2#gJFbk z>FEvIvD%>che?u+S=t#3hDRcAJmeQCb60S+y5{YbaT;DQ*DdWAJaEr_Ft7Sh9HsGL z>ExxGvKG3Nl(U`cOyN~xh@{0v;3KE!fg9Qc<5H-#M*45Od4EXl;-;Tgc=WcPj_w-pYHRAstLx7 zzg)1l2RO9poV`NJXc$;tQ}=<+6M^TPWAiMD*mwCaClmUc6L-w0r+nmxMM|>5hix>= zck79XYkyXMMdx}l$58Fge@gXprJ$~6Kfk@C3WT?|-gUkG+iev^@{0XOUe`&2wp$!i zvqBW>lA$i?Eom_%ksPwy5o|D^0|@u& zWVX^BRzmJlQsHh~H&AEe?@LBjT&2ZH6ZH%iOT;8Hc`X`@;ih9WzGVGmS(j&?NCHko zlxJ}|!6})vBqF=b`j1pDh0|PQL#{AG=V2Z0<^avpe$U53)4mE$zC;SpvS$>0QFBhk z>#2+=Fgb&_BYYPDCyguvzWos(wZ&K+hGu#i_UXI+BO_@UX~lJ~KFJh^(K_G5O;|B(`z!{Q;Odwa z$pE{;5-Rh;6p@{wq4T9imU#k?VJ-pYg|bpJSndwwxSq~yCiSFje&M?1?N#Rv(J=q+ z8tJAP)nXlwie2DlJmYg$z7_EV%WvXvu==y%Uld8YdZggEo9JHvBSXf2P&``gk>y>f zhQ9hqJ@)DSU~nCwYyOkp_&!cuoph2Bwhub;@;!;Wt|q! zoI<-&lHO1r2wkuaU?k=(Sb~Be3wkSXRl&*1axsrLFa#`|TPSEoBPqI^zzY5dN6etj*)g zL=}^!fLYYTF-n?5R$bA@V_u*&{V@-Xk>8TCi>-Mkv_7s(nyBS43?V)7;W#W{qzz^m zw(`t5f5M)$$t1WiG>d+6g=qMj!q2EE2p`@;}qR7U3xxe>U z+%jKTGfwKV1~*n>SZW@S>4hN__Wa*qWW0e*KV_;TLHS+KM!vZDk$#ca3JM-%4*ewk zF>8kH@EFk}))>7~K4~RKhM0Me0ZMKsyR*Mg2@+H5!ZMFb6IVxqD9;%FQjFULiM+sM zo_5L5TsuZVgy`8W!^8J$)pzEJECXb%4+RB3X2Xz zZ*oI44<&5&8DRhFvAG!L>imnVv}&zkn}rf3?yidDMNvlQm>JEyk<6zk?tV4)RsDEy zpB1eBc203*K&l<-EJ1nZ56?TCcB}47;$LpmE5v+U%e@|Kc244JL^l3znPLf6L>#zd z#QLgGIn22&YI4eAwZ6gHGJq(PP{a!T;f0Ot?L3zT5ksO&;>$;0nA&Ps>W6)BF@Q%5 z^DSEKZ+boZyiK~e`mPgW@XG7vjtvKzr65FZW;_SQRE9Xl9W*9)$Kh+-r}yQZTkG|DmtqqN5J<1&g@Cg4w&sDVd>{3KCmd54K* zQ6LEhm>9Gp6G$KBKAjJypMrVEoV~y5mVSgc`r7TA%?LNAJfk({byQt|@WS02r8N%= zgTWXU5i4w&bf&!)P8<8-OV11LJruFu9u*MAQca#?xh9rxl)GVDJI(ydvLJsyMCz?L zIu$NxikxC2Js5oBO*U}7?uL}Kp&=8pdDNR1%oT)sW)qKE_w|ViG+^B{e|K^y;qIG=H7Y6k#uPEi9J$JR!h@|{~Agnkj>EmuHQUj1|3pjFJ^~yWOj>k;?^-;Vyy5y zu)uM&YPoON@dvW*E&?zL>fg(TWr+1S4Kz&g)(TpRWwti->BH1ShKfzdVs|pStDL7l z%kQoB8iV=s6e4o7LFF-fMw=p&0#cYp|GT@a&ik?3ePyMUqEfmbXRsg_dJ2g zDL1E+(Vus2jjqJJ1*KbzMKb`rG;)y-^pXy<5%a{ z>O5MO4(v5X7Lz@V-PWG|_fG&jAbS{ zyP5Geqv)59J$ncfXe|TY^vZ0_Pk!`x*WZf>b8f-(X~Z{7nv|sT-9*6x4R`UZG;Usu@=`Kh7~2+!tspbeBaH z9J%hRoOrL$YUG?}E=0aY?2Dx7mc2Y$)oVz4X#2f|%WP0{ept|QC~bW)SLH`gO!hh- z_Xu{>?u9JS(S;Hmwn8E*64eaf_-a&8ABKczZca8ghdIs{9X*u}f0K~!y|)18bicJ% zLilOv?j5rF#cyIRyQ}@}pOe%!m}pH_n+Di9Fi}E(i0B|I5x#tT%QJJZuIK$J$sRsF z@h*_uiu~&W8#bto^M|YT%yS8V7HWC&E6&;GgiMD91G6b#3(&q?q0K_!Ti$FzF?Tb3 z0sN3MiMattm2b?UasW`RprkojH~q=ZADbxz-reW%muxL)D+QneEFdZsbvKfPRT~$2 zfURY~3L%sbJD4Zz3S^ePb^ZtT7+!NNz6OYEySIt0e~2Gj15D0yNxM%|pwFJz zvdP284#IBGYfLD&I|#9I~-q|$}TI9&{A0eW=L?sVFxnuhLdgX*m1cVS;@U_tKvSLXmC8pAmNx;yKHz_4k`~LD-TKS1g)pMtuEp@gwE$#3`rOaX?$i%?QKsBUZ=K_3@M&Y zSJgMq_S5^Pv56zV>KhMZd0IXcGcceo^W-y7>Rg@(AdOGAnGB-K^!bp%?4iK`hnBBM zHWcWl5j_&6YEj6sscveJ+%`sr=5&3Fxn>;+G3I;Czwv9D z%W<++?Cyyku@f(rgboe9C|C76JmwYIS*-~Bh&?N);hVv3h`i6A8GEioH1N7qXnilB z?F%+X2Lhp^rPrI?w>e5PYRW&JZ7(Bhh+fE+GNxY!ikR)m3GBaBD(g_f8T$-xHRP;P z{-D}jzGpHsBEj+vO5Oe`MVDU6yl;BO1AgLKzzkn5YPa9}!#B~~9(q!}Zgc-^=ixQZ zlLGyb%kg>ki>exDg>U$uHAa@hbdo7m{{cKC)roHKaV!v;EIUzTdda4HkMor~l`$fM z0Jll62p8#*;lG9x`$UtH{UR-NYD%6{4mbCRVlKC0GMeWaJ)TN%%C(R0S2AKeA7S1_ z{5*QRg^e}O@u8Ct;#qXov7xEMgEVbI+tpEO!ESh2S|LbvD|zlQ8veuY&itg**QIP}QNN}D;i@TC^ALn@%?oZx|orfTJ9Dx&`~sPy5Fe-kNH z!jb&|rJn(af!(pU3<0(ZC{z6JN(){dDo-8NIsW*x_%k71fDl)Da1o~yeXXY9-JtC! z!DJFINJ=d_Z6E5)h?9T8=ZS)vSM#2JJ(y_!A|G`AxXp%uNj!gr@=bpAUCscMpSUn| zKxKu~F&D*&X1}_ctKjVjb~WWr)|?bB4bgk9Jt3F(qWbphUo=fB^8|)BER2&+1=kn> zVca80y|ZL!AtlN{1s8q`Ze+4VznOktxPtjK(+peOTGyg7#p6?!r*!HB`q!y~<9t<} zjvVUgLvD=~SL$F)$|PMc+*9c7i7UgJdzsG0LJp8gDJ>JNre8xP^Z$ri6whoR|D;EW zgaHaAfV0Ti(4W%rs9-yR;aH|U;QlgarG7|A;dWX0;gTA~3(l<-SlDzNBb#jrzIkJ|mFYOOL~l{*(QmE8MS@$%Dh=vagQth{z|pk5MftkAvu5+$rRhd6rn zCdf7Vl>&Y1y(X*gZwk8)L5n?wWLhNyE@6DGP^3n1E~B|UOzxKG*2(J9sz}K!o>oR` zMu3~!kk&&hysOgV@|B9a$k1F*o3`JlY0^<{|4Zqt5#p`nKy_yz!6AIm)=-R& zCnzs$b}xUBXZMELXP(FP>yt}e`NL`jv0ZaLxiM=w)ikXKTLo1$-YTX@Eyr7SsuM@NKSvb2(*xVz;TEAa>6-f!9zD{_lY>H!bU!ads* zWk(zL^cnsZs_iV?wkH#+3uX{2zx{BiovnQRUSc<^r$fxx8n)phcz&piP0vc@w~M{w zK6ur%^8-9o(eIIO=TqE7;>MR2Z#ov}#)|s|l-lgB2>inq39g5l?Nug$ z)SdV!05^>p{*Q2*=Ve_Kg5}MUX}piIvE#tQJvn~ads?nZ23Q!~wB4T-^L6-)s%P8f zGdXKJ^=PCB7`8O5(HHa$`dmh1{MfooZjNAXmsn}2{cA3)^~Of%;dikZE23YgauR79 zgtFgLLet57E(+80m{~qs3P?qha|T7dNuGD0irvYwd1(`+2D#lbzePu0Xm91LbD80%Bi_{Yiucrl5 z<-x!+9A>0?>G$@Bt72~!b01J}fy(=N(Dclb3(A1J-W&Hm>$&uCb`GvTpA{bmJ)4t) zLA|-lMt)T1x{(Zi$|wk(+*Ijbnl?IYqr~3)=&6Igm6*{vbjLYbRZB~APW6uTZYC1; zA#>7x@^bf@(GwsU3Z9{pgcznHmjQp^EDq+V1?=Y9&;fE&>+V^bjT0)+mpx}-w}@xh zt&%~WFq}o86a*^l>-WqISmc;Ax^(l=*YBUlgrcr}-K0Y|e)a3#ziWE!bRY;laI}!| zH+Ry27qwq3Zl>%ebe|R%kjvsQ)!~AE&g8tUN{;E66^&^QqbfAgA`2g7qPW?*lllFj z9f@U@dK7K-d_Dag$nLuvJDA|zM@DnQ*Ih+U^<7sUFQwBRjRq&r(Cs6^|7#telL~#Ja6*OP^(%1QI|Q~?rmZ9U<0G%C+_v0 zO@8}GcNO)a6RFm^W!(EI3J zH{DVLv|MY=OOLnd$X+~b|sPy*;MB{|9x9HRoWz0Jxx_T9voWy1^*G$j?UZO07`Vc&!K5^29}Oih@&CaTW<+9x9~D9VNQcDITKT5iA8S4%{=F91 zl#6yopq)q}Pojd`m;|bKw@Qing`# z_GF3HaCqC)mPCPA7)AuVGXn8G|Dy$PNDW1zdtb7#4FJpJnAVQIOCO#}hAC7%Scq)X zYWHrX)$A%|K9tt`d7ghULdwxHc6!3uR9$c&(yR^_tf038Nv3z|7bx>SJt#L->L30U z(r$PosX7=WGe2B0a@JU5<0A+?TbOB}0C)|Rf-xCEqnfZl-NM3yRyE5|<6KpMxQy>G z)Uvd22FFXw7eo@3xn0oqA!%){mk~ z0`ZU~=-IG8;^B@ym&TN8C@=*}4=>@&R>L%Am0TBQNIc2PC#-A5f)QqjakXatACeL0 zYV?&n=5k+WEd7YPl1CK?y&Wh(t`DrY8Xazz9$<)VSGf7@Pv!H=pAt(N`zg{H2zh?Yy zoH(|V%rRSrpX)XRU*R=u#7n-pbX@buZyiD+8{kqAg-z4eZO#)h`JW9{V`P>qrqXT{ zzq6_+Wt(sZ@~_FkPBpom5+JM51~C4VFM0;`e{KwOQ!hb2;zm`|F7T#LEIujedV;YTaYt(LF2oaR_^wdGhW(!2NI=q}dDuWH_~a9n(3=@??&m05 zj+fR^rQcembmuzZdy9pw3843U9bPar?<%2je_lQp$I6rNm;00c-cm|>XR!d&4m$rq$qom~7gC0*bLYXX+TsosP z2+vZD3>HN-a&7S2wsG55w-rrJ`Xg1(_-5S3t2i@hxMOdOoXvH%Qxw^9fc)U%YS67{ zZK(d2w;j8Q!vPtJD2z4;{P4F4=ufF%GeMe$0Y`(eYG35e$Su?cZ>^7 z-(phf-bo-#<4~aAN5U4|!(KehN(}!Sa&`FG%H0&PwuwBM39(Xtm$2*z%XnM z{~9bw&WwBNm)JB{<~ac#nlsvJG#^UxYAOodl+j*kvl!pll?#t>v-rvU*WCJLksIGp zfCHf33gGtnt*eWWZ?|8nY{Meg_XsD;G`18~D&$&1;OyQSbSh=l#c*v!?NsvLqtdd5 z(2oc>3%J@FN}VK&Jq42hPH|ytA`57`IeiZ4COxM7`}&ZxJ&hdHxg@OTrr#ec_opTS zkZ+fTsSv|v!VcBvUN6UMayXvz#nsMb^c!@dgY&80D>TX9u5D}?usohA(yz=z2g<&Z zQ_bZHs1Gg_g0^nfEOC8zJi~co!EfH<2)%~@P3JvcP477?y;7SY&L`?$S}>(<{|64H zUK?;1Z(w|EQH*B zKKWrm=r0nC9fT=AtHRmBL0qm0@NORH82BRh!gdy0V~jNiDSP)+^KocXG+C+@zw7?r z=ENUl&amQ;tRTy4bVcOG&i zWi8_hXeC9Z#U(Xe(k{wSeW|6v&>%BX0~Aqo6F-R<3Bb(DdNKy7FOzTSjnQ#0Dln>J zKVyf@pNRq%v4T7`Zv&y_^|KSmx3?P; zWJ7k7!vde>^m6y71=gXZ{6Fw8@&IgRX!rA9vFQ}MN%ZdSbCV<|-~41GeVcBquBmPu zwC+pU-TU-$MCz?NemTQ40f6iWoSe}R84DGg&zdKf&c*fnr^*d-b-|D2mDS|T_d0fM ztC{fa>PYgL)aX?v#j!#`94hA#eSRp4h z(}S!2Jd@x=5%G&e!tNgsUiD{4{P=I+d_-6K6I8cSnAf391-J7C!dklVfQ!g|J9=y3 z@+y*|gjudVf}w@gsgVy0&P{nCm&CKm%*+`Z`+R4jm2YfpH)CtGv}}{xqmzuDk{>_?7qW>-phf6N;_}3!+B{FfB8^wOMnTEp{AhgI$%1wb?Hj7cG;ABz&OZLF8H?rmtP>~Z%E5iN@KS7yE74k)ZwOI42IAa4Ntwog*$i6`KX-e~;@oLpq=}m4xb?4NY7&_{edjeALL1cKvN7 zspmAT&3gI~UHs;*|HPK<#oPcs>r|{K-`B*0pd`z)He+_LiwV=$g+JBtvz@hOHefYj z`<;B1&KErJy-+4pTV}yX$p%F%W3+S^2r_5@-D=+#SWB<=d^xkR?(>ck@Z!zw&56HRzTj>rBN2<$D8o}0ZV4#AX@z+A_w|aEP`i&~)`FS19E|nseE176 z25*!@!(Q5+vSGH>zx>v+zjrjpWUVK8z}l~79XJR=9_9Ms8~r6hqmPMePSA^eLQ_1; z<7MU-h`mcGBzDlX?BO`)XJt9{1q2Z&_;RYB=COHf;GJm6(w|rOOT8q&qX~x!yEv5Q z7i^|NpV=-N2TA+H8?07w~_t6^jxe96?k;H zF!)F7J3kf7&4{6j40_P><%glXew+wD(ZoP2wpof%BWYHDB2%Hi21HCB7cf4rpb=~U zwpTul8D-#glNC(;POyQ+!J(cIJnr3iaE>kG`J#6_6jG0X zzRO4D$q7H?3t=e*U`s+deoA!(y}Fv3DUlOk6I^{y>Or6E9j_g>591gjYZTCZTGQs- zu{bDuTbZjcrKA~cza(3o5xQJmU0O@5`?)%N*?|psvPRL%J?r%0ddotwl+1*GKqRuD zZIM#Nq6LtLCOeX%I~3qd=_@rqS5iKF{NtuW79DJuKx#QDczH$>ecp@XI|*uM9xeTq z;~Y0C+XTx&*FqlE%!tNMgx3uTACpu5E^d#oR zG=MF=$_uLV+R~&EITw|#3FZF%^=CPE_8M)T<)oRGaD&Sd!=yY%es}v@uvMiT$7^;t z&Yz*MzTXmk7j87Y6qV9rGV@orvmAO%$4;Q$#s-evc32C1ISF(m_#b01nJRll;h5TT zRSx!X^mplj83v0~l zEB9+pY2`}-&(P%8J@2dS5f=o7y`sb$zSGiOhw|hfKMr^cSUTP~waTsfCc}>w1yccTCHKTD!TmWisFTXVMud zNMt0*08*qHzuy$QTE^=jDA+Jd$FUn@6f@_E zs^i+i`Fyn#qiD}Cz${Eq%q{*0=w$Aj^%Fv@C1CR1=A$}^vdF)0l5v(-|~e8&2NTCV>r((?~<-3ceZ%JSXL&Is7H^=Relv zpQccn`Ru6F0rr@i@d-l6*I#np?JDXmE+zH*XZ3w~Q;_aG=vRM@9P*w8e)pPo6@r|^ zQ{nHil&Ff8#hLqqP5(Fg4Q*>6)XVSwE}H@3vqrnC_$Ya2|B$&ar)@BK{=&Lg68-P}K#CSlD5Op|xQ8tEgD0KIE(TDUJk z!{+zK>GA!q(Ox^*$Pe=Fzpnesvw!KzRv0{zrZ+P1Zkcs-1hnsO=Y8*M@d|RMy)r-V zi1W%!+;O_a>%n*FGgW%ASQv^SA->qg#`far4Vimd z`*x!h&V@MXxoh*(lxwq~4_$;Mzh}u*c zG_k1eL-uugfsk9FaMHNBJ$ilCRF!tbHSgzI+mJHiSVz+Zjo2`xRd}-hvzkzgD~{8`tm*e{?HvO zL;PhbZm`yt|9`&&)SCE)D6okdOo@B0a1!eM&2{I0_LXnTugW@1b8JidWqN{+lx-Bb zbSiB{*5YeHyOT!%iG{m4xVTG|sUlU1Bq|O#PUmPaTAi<`V@(^>oaF?X+E}=Z+e_c} zd6YVz?;g5Vim*FTE%lrstg0(PNmx{Bd~<79A@q|I>?pHo3N``exZ)5${V^3Nc4~Sp z*SH@MqBlFw2q)ODE$K9?ApI(HN&APOltw#f4aXhmUiea*F2538ASIkut5Hp{t2psZ zs_4laypv4I={O*8>hwtBv(3nJuKLK-SzJ!wistMbp-$y|tQpA-Ke)F0>ImHek|Hll z<51Q~J6e6`W&Ia~3?2EA*0OlqQU-2vTO3wSm0(VnI35oaoBVg3?B|dw0avG@6mOtQ z(pz4<%IR`(Lj0_rJ2f9C8mkHHzRWnBy+?$hxUsXDZ|$$1BK~P3?`!3uwo$?o2wHu7 zZC?)ixX+|k9SH=>veUoJ1I{)Hu_nX=KTOyy3^ZQa>8XIie4J^iH`mW^$#Rq^4>*=l z))eTq^8J^OKP&B9h6a{YZh($ldb-JF%POHg>2po!_?Rd0=|3rFD^` ztBuE_!P}up82DD!uw1uAP+4+D)~VMyGOA|$6{kd$8S6J;E%3)zdylAuJ7QRi>tD3g znY>q8zP7?)=zR4D+37D&&r|3=g11-5dGv>7m}(K1FQI*oH8}Mx76$$ia~m*H0!)a# z_yc#`Eq1#$8MJ?eEnVp@RCFdru%**VCe4s#%Ig+38Kk6_x_b6KMl5ZNf{CNc>-U88 zt4<~q+>$-A_S7zkQY~IlC%MFX%n!;C3g?wI(|&~h$f6y-?ZuZ@sZax`Vs;zwTgZe3 zbT5^(B_~52x{PV5j(~J;*+YRPNxpCIUkpQIN-^(#*hhEH*X|^Ibp!HJx!4!2CJXCZ zn*I2B1L`fe>C83hpWA*AL{iF}IIw#3(c0Wy0&e8vlI*ivv?4mw`y>oS{Cdyq%uty3qG~+q>0>K&04KTH=Gttnw^Codp zAvpS0jp^vtj&l^5bLHbcU3%bPtfgQY`~decPm~|UvXfZ-h!Jt^j)bh556PzJGcVy6yh8S(4 zh%w_IK@&Nxd2;xyCTkPy2re%ssoP8R>F~JOnM$T^^6d{HrxS0;?4z9nFLH0FXzAy) z#L>W?+OZmtuOI#LIbCi9q!0lncEQgKZJC}x_7#`d9H-aJq#QzbrcvO<&h!70B~9GS z*c&Y&OQ8IUv(0>s|0Kh5SH*2aQphDO)&$0+@^hHqWu%r|x>sVruWB_kbNY(S>UtQh zjC%Tdyb9i}Ic0omqn74t{p?>sx!vn@O!7TsT3tjMnQ;5ZK+X3YUnBeWIfsfy@C>;R z8tXGShrr}m;F9MBKFhl@Y>9k%9%~UGDy2RCms69^KU??i^zz4r#cVidw!SA!-geN# zUp!B6OP1VPo%nW_B^b^l>+(a^b6;`djN5uylox8}GJ$zrFbZvid=ud8`v<<~zL{|d7a8+ad z{&hNs+x12F@ml~x!F_Ze*64K)HPOmP{@ZuK;zX?SH4~JcZH=ER0_h%qRyQ}JcsS?2 zZ#DH8CC75|SC~-Hf|F#7`9iHd#8u6^U^&1(ZLoFO{8GCEDUp{&Jtp&XV4QdUM~GF= za*X2TcC*%+IG!}kj8%xS>NCQ{{wmXcoi+6!;z)J|&{iIl{M=)hC`b(6CeiP8y)K{e zd?!FV=W71q=98Gjjph3Lgp)*0Hrurnb3Cn!arNJ0NsllO3|Y)8fQGZvms8%T3Og3GfSAAZrTmBDrc zAxjxT(Aep3))Y$u=UL_+mV@lYh}az;XTUI2PK|D(({70R=Hdtq??)+$i|aVgY@V79 zr$x7HnvZD(jd!8Fp3l{xMEp#bPHQhh&IWi;H{s=mWiMC;_ug@-3CCXfe zpXzn6CG_`uC-IhRKAWShO}#N^-zBl_cfV{3Bn8P1D8HVETUf-ny```Yn4OZV_G*~g zrz1j&1i@!rzQ0t7{IT8igM$pub9WY+CRmSCT?A`SFIC_F#r%>rh`CrRZ7^ACJ64}| zdZ8ta8kK7JljJB`Y#od5G-z1+f%-fm-B`b~LNHndly2E1Bh^aS{He2) zpo8O9)%UN<#cGz91aI)clZ+c#ro9gY))Jo3W11ol@t$a`I^mN4^TNfz6i|HErU`YB zeX-bm#awWHMM`A%U*ieg~@->yRehO zdjNP_S?FE~E`~*~nk7vCy7*Zdcpz|>k9BwRopZx(GVkl#*p+SlH{NxLKsq^*4cRT@ zbiXx5j6LC?eaXXiGnDxK6|Icb+-k_J8S0r*pSu+~r%^;{#kz;>Tzb*F;{oV_W$67< z8Vh!rWk75l5*&7qj{!7!s}7MT?`Ih?m|>p_d?%HetvCfA)e-cCtb1Q|Ajd+KVrGI* zj>Pi9f3sHQN{Q+X!2a94ln*u?=HA9xFWHD*{3lh zg6y5@-~ohNDSv9VJ%5jH)_+e8jN}@-KB!24-PBfp-v5&>0NAn59j@{AP=jFkbL)I< z;)dia6;NGC6`jho&^K$!He%RzV43q=`z2|s^HYD=^kz9+ z1~~*b&ZufnyaXG1C*vwGYqxSdV znSi%4DF{Ll7pxmJ^qpmQe=BBnC$(E5PsI(3cIDxICy^IeS*^Uu@wM^dh6uPrI*t0A z3n9Cz=BOg$aKUr)h7TquzRqxDD3MW{*@-XXG=3I8t@UZ!hwBh5w|}i6wOHGpP}SOX zX)jx>k(mP~So+I>8;D7j_}i5)>h)I8Y2(2R0nxAbA1!&iZ}TC6OtlMFy5X&+B%-oJ zer``^u_abeVPTc~Yo}e=1{h0@Z%P^IOf$>&E2^iom-ePf^S3e_f`)7R5TZrS{ch7V znhsjj9&Y-SzMHQO8S-A$P*eZK#e>&5b*qP~`gLgTcYYa_npsbSVC{(_$fW%F(7cQh zE+FAG7LjAVVmR+9YHYwHy{g0D&;qP7rky&tFYKxI3&Ph~d-P;alW?%|q3CR}4LeM~ ze+Hm!CbdK&nLW@egAXFSmBlh7YTw~dr-IGEBV9(f&Jq#=A?+;)v_N0EPeqM^$n>=I z_dtGPY@OkBwOQJ(sunx|?aO%$YJd>R-mCmS%Fg<)$@gvJ3L+vUpaLRYBHdkr(jXvR zBEskpMt39K-QC@#fS}aq7%_Ul7&#a)2G2hK!T0%XKeF+Z#2RQ;z=^{EA`ivtb+`uH9Otd~#GUCdb%eN~gIvL;Ve{;1J0Qu0;O-_bA&+$}Hs zDQnjk_KI1KAt`i%4rJxN;X<<)qoz1MM^cSHyNn;~T_1u399z&Y>^jv)u3B;a`h?5J zHO_|kNz#Nko9J&%_xc!0r*l_Qr-5WyhrmBWMNV47uLl@h0|JeHTKS)^J6*SozrA{~ zG61%l^v6dI%5EveP8^<8A~7J}I1TFeenk+*UJrquAe z)Ahg7?3a{eeMJ*_izCAX&R)&LPbp3tKah zXws0a*4j}QM}Z)-r*LAI7vVB>8cwB>?mu;RJK+MArzex+J+RMW2IR=&gVo0F2aF-q z3k5Whmbkjs!F=3Ej8IED9u{4t_}>4ee%V{5{{f-+(0A7RAD-xv)-e0-`|3x`75?^n zvok?AWjjj_EhRu_X8r*J^_v)lMCG@c7Jj%nNr9D>&`+?Yp!Pwh5ljL(Z|c#HAcG6K z7E}d3pI`JPvvEj)l}vAKf{}M~)S23PXdwre{YP?!SBnbvl(-cv(ZQNDcZ#o~DWlw0 zSDG&dnogrMul&RpuGyk|Js2H30vu{F^T*CAq70mo2(odD2WT*cd;rMX{kxR`FvCcnzxAk!4xe*S+7 zSO!y`0Cha3FQJ{bsm>d&!!0<3wO zsr>nE^Oe;fL-Yt`u0P<^AQl}N;}H4f@E0fQ1h_CX{k-xi{Z)8`ljIvUnG0UtPA_W# z>puCN5b+g*6=gn}4$~DBO$Gh@NSbA9|LKlB70n*V|4ijS(46Kr0mS#Ln&sbgpZDih zO*~3TWj?8NB*52x!~%!>>`TYl&w@q!wa;8+&uGfm4(OCL2FFjz)f#g7&e)3+>nzUS z`O{#5QX7sB!?&-7vFD?<4_Sd4o_gyZO3ucsM3z@T!zf=W-<6`tEN4ifW^C&=?-nU|n!QzJwsh5}}2P_t|K<58)lGRg<7IZLr6MJ?& zYy(fCF~q+d&jii8+Idyw@kd+0%rz;p9*zC$*pf|MRZz`J$eT&XK<{|g(6}f>6vX~g zIeps`DHaFq6s@573||^>@SGe6Xd63$q`5b;dfMxOJmI)H&oy$`FmZy2jAq`g%ByBY zb$j2>&MXW38|!i2zOP&3u8E#;rxwly&TV);K_sSM_IcySc!S#zOR6q#3^P-}VQi*n z(#dJNk1oEzvEsx2!G_qEbZ3<;(56~=^g;nXZVaRc(R(N_?~UdH|7!DJqWXZh!ucrY zAJ$DqF()6?t3)J}#^T5hA91<7>ODQpZt=)zgY8(ua2ni&DO;fit&b;Q@sMYCLf$F# z3irs2jTU~S(?%gvB!0LBg0$h=thiw0Tg8H$6PPO(rc^+j5``m3Bq1+51zv41?JBXI zj&>k~1AU=C}>{54qI{?Lu$jffKyoLI!_cV%m3+P$0#YC z-_(|VDo~?1IXJOc9N?NONRR!kJmEyp?n{z?;0m(UMJr~yADc#y=)4xWen$?q(lDX+ zkjT99+%$jTLmQg>jw<+<{0h?*OsV}3Yg*vOvNBjP6=Q9=%-oBEGQFdrJOtwXP#49` z<;D=#x)B+Xkp%5d87-`fDatNCZ@xZkya4h3)VbIuWl{W4+FnR+`|Bb~Fru!(YS z)r08N4_WRebDMPk@kZfZg*HZQ{tg4>ZR>!kg6S0N)qlO>arisUP!cIRM|l^^kqu(r zJHGiRHEIJzis6<9b>*g125On}zGc9B_DpgTe*{dcF0=ubo;k~Xb-i-teSaQpdvd=m zeUCYV?@s)W|LeO}@(e)dKc`OL_R+`?fJG?(5cM{I?>Wgr{f<=nF)=%0=|YeXx-QMh z1LU0uS<{rf$;`j$z^q};3$Aue5_0apE1aNDEwWiAy19E6X2U`!5V!3!}N-&bv8=8vhD7o!{otei0oUr#6);*xoWbMpX3!!E4N z#642E*-6YjJ<0t7RcwlYqkO zFe!Rw@{sV5#vPIBu};A{OGNv2rT?+HF*i1q*JkEUmU~CpWe4vU6Q4#krz^(<+QiUH z+>?hn->tZyTv@R!f555gZ8p7_OK$g1J%dK0)6CsUH{8yD5tX0H(OSjaoh&ND~#JP+QgwjaPE)xN*f7RU1QFD z-*cO=nrxz!(+UgdN^MEk2r6&m(ORtuj5STx63yYg=^Ot4kZcS4e z8^2t9>Bxjkqtn{< zSc%(JRbCRXHhCk!Sj(}h_d(|+k;!+Pap^h9lkP&)i{&fD*#d6gW3qf98{tB1+U_E+ zj+R>21@P1JIZbMjBmF89NgY(V@weCzQTQ56c}7$$sFuj5#t__NwNIQ)Cq;X--+R3J z1@+CM$|{pw)d^N$*FM}~ByWW5wETHVh=_lP_-}z7a8H## z?-P8Tlfo}hJbyM{seAtFg?WH88UsY3thedEJ1S0Zi6gCJG&W2U@v4}}aX|3^Q{*zq zPFQE-YOrSvI!4;O?t7HFT@~P?1Sl7rBSWw;%r3hEy23&@;*WooUs!M6(`n~OlGxJb zCXR1GzialuQNe#5CRcnAOeee2|A{vLYplfEU@0OkVkE0P2QV1LUh=h>mbd<5pzL4c zI#qrZy6>sqk0*RC<)vZP-FAP#4;olTi6|>$c30CMc>9~{H2W}}` zh*Nk1^D~j(bZwiZPT|Ir3abhmdBqFyrmikVCjrpUNaka>ofMZtRh*clmX8biE=_67 z_C32Wc^hr2y{!V?o1)}OMpAvnh;yWD&Y{3}OR4k=5+s7SAzpHSNuCK|^r1rI^UDz; zwGtu%e#m6&7g<@XNS6R8B01Q^h%;pe1>Om#;BX<@00>jG>vo~Ms7 zzFd#h=B8ha)tg#?l}S5>;za7jXZv=akZhoqxSo2$<;2uydR zh1ud5>K?9(_S(|4()`pMvDJ+C4*OHC{Nhwf@N<<%}`~M(kiPHL4Ow6JDG*7_WPb6 zEBiY12|>ad#_+M*{K_r_g&2(S@{?gIV0*(`CAGf(@i@TxMR!RXJwTOQ^soBaAhPkF z%C|?$tf`!ZVQ$#c(f#aSakvAt&c?GBO?hmN`)jXv*Jy36qYu_mS-1@|^1)&Se&MA58Vt`^3&gFq33(w5JlM9*ET=mBN03a{lMp*MLs0#Vf$NEg#>%8W|{vOqrHB+BMgWUtOE`RZ;P_WlpQW8rshfOKi$Tzw&H{Qk2$MK7r`{ehlw z-v)=Y$FA#-n|dO6+|~+;U6HWca@Ft?1dt zpMygGfU>3KZ#B<0lJvcBQQ421?ZFj62&796c+T8t!{^Y>|AWE=w5`U+=jTu^R=HXY z%33j}P0u9d7cuoWxr|#R94T0THdoX^9N*$VL^NXU+Dq)RM)0R?GxVuNAAwvlPFEVX zRrpQ7Ln2{3|0mxxM`@i8q8&xi!R9iE6aU4-NRr_(me126eMKi1s{Q>Q54>QVS>s;& zGgxQTO6I1Ne?Q5`qwqDuf@8AK)v>~QArhjh_(qT51VYKs(;1tk?#aEYhp=LN- zA!hqr4B^A&cCwG9>v=Ed_yuS1m#v?kaLy@F(XGpms#|*kKizTGzf_B&7fm0mg_TIo zvFv`>4gh(a3LYR~4R`Ris1m+jrV?)HGa>90`luhAhv#AAWW8{abP-%gZ9ovt zJ~c$_j#+uH#J8Z`U&y{pocvB^eT2L^>unC--FK}*2j4zL=JURU$^&(d_l?7C_33J! z^RDSod|GT=d0k;wKGY$xz~|v1$fVusqOkp48_E@bgCI<5{sV4K_w zqfS29)V+F;^+iwTbw-Pfn?xIbb(s3Z6eKM%(sPSji1Xo`eP7#}?fe552V`-Rc? z-C{I5$UZ|Lo$K%+8atQY37r_eoGqc1+ByHq zKC|`5m$QHFhl%YYoC}a;>lq^E(em<7-|a-FxA>=f*qe>3g!(Q`LC(44xNqnQv{(_8 za*LLG$q@dUT3QA%AdH-Di}_hdDuwtkUgR&ksANF%ZYEQ2VWyLfks|TEd7IGvx|;3W zSmPfUsTika{;cCLcz6mpMS0TGY&UZsf~g+CTr6lG_Wr9K;aNmE6q!hu&zjWLfp0G< zv>4w}jSv^75t4l3fg4cWTxF*1689BuQl9kJ+xYLjYBk}u0{0UW+oNg9vhJxOs-pcp z@i(KNKiJEbSVExaANRszp@lx)qJ!TG{TXY`j%$eHiPxPb2IKJ1e{Xd)kV0;g>NNZ* zLH7$`ez~)GJoMUcjX?5s_yf#V1Quz^?X!vR9gfR=p2=yCyQxl$fL*kg0dK+wZKAvZSItwJ1kC_@9oCxZQ2L4Y(gbWs zXbmw`>oBa|5z-z(FTYv?>q@G6uU0``XR_M;>Y2gFMdVDT+-9fD>!mF#lOJ%;7;-Qc z-a?4fuxFH{2Ll1OwL|cYszczP%Cu4$#a0~9#8jT?j%)@3?}I<#i%n+-ZMgwV(-ZnX zJf@x5^b2PrDxoi?lG1Z`ql_sACjsG8S|bX!&nDG#PVJYX^XQMxYCd^-9~<#J^;rt> zz-{v{7HrLoBSsiQ*Lx#6;`5}ZXjUooSE`!JgvN`N;XTM>TW~aagF;=41bN$~6t{5$ z(#KD4?E2B>{{5!(;tThO?fy&tEMbIxt20sv9Cx6Vxn{UcQ@#ipmi#=zDy{=Wv$Nr~gtT{xF&p zL_7VohGyZI0PvwVh|@yoQy&GA%zg^@qH=Ljg4{p^{|PF|j(o9njw{fR3t+5^mmeiF zvMB+30R@orC}6e@ z?Y+9?-KCM3zVSHRZ^WW6Rd{x}df=Qhu+9mmH0EqYs;Z0|yqJyDlV-e^`?(=R?$GUV)JL`NlV^waEw+nIp>&AjM z(yg_2yE-|U5O0$~uw+NI9cH=d-o`?RV)Zoz`v%(3xV5z>&puTTVN^@boQauy6-r_U z%VD+|80okNPKnAs>*f(K?LB%8^+hGW5Qd%_*ja&BrKL~xzK2H;4}ij+R_KM%(PS^L zprHR^3XDaCn*Om6jt0xOly|n1HUe1p49NJ7i^$HUMzMX|j>kI_E2PxNn?Lk(cWAvn z7BQf^+b6i<^55zF`lt8V`M61T>gEwe8}UVPyr|I!r+NczoxW3k@8hen061n+#dKYl zLtTIhKzNC~=kid%`pNT^zB*DQbJRQ9p#Mi^=jy-APGieW_zibUTW{`xNnreGtugY= z1N8#aUEd|4p;qFX`crSEq%>MP*NG+%tMvZfzwI~J?_!u*Pj1Q~iD@rezHLhrIYjig z=)qQ-C=)a{4rD+QatWbG6q!;CAi}G-&$6e%;r+#Pw^Jco z+lR@iVbMygzx6WA*PrbAEG1W+?C&wImLrLWCXBy%%^!35zgnMfpJt6eIdG7bsZ?2v zPITHkpKw9+%2IssAB^_1NH>+WJkSm!Few>WIjOvK=gs528x7b5d;jbj!qnegrv)TW z&dG~~^_usDz^1f+^~#>UmV|t6TV;FTD-X2tr_%c(OVtQ=c*16EhRRbIXYj>e^JC1; zOUgWR)*+Xf$-HH}tU0XFuMhkE8Im-)X^>8gm_KZh<7P+_UkbPvzi^~_F{E8|gx`bL z_o!4!{<}-fI>`mu<gh9=W}2OX}F zc^*uIIHn)oZpR~A*5W}&Xuc6_@iDDR9*<1aqrC5SMAUn?ub3@*?zZ?b;h@JZyO)cp zKc|f_JCO4WkgcflNC;^jE`owlwBWho_pogjH+P{=Z_p0Ugcn|U_5owc1td0n;ugEk zPOo~II5-HfN$C$Ylyshv*q^H#b?jjIAt-gdkE+ zd!pN+swIEeuMi=^TM>kqxwKWPno853ui8KvT0b8{>#SnAORTm1715T?B8N4>S%Q@3 z9gYYwx>$#rqBUynAEX?gmtF!P6mcclyE9|hVyXO66{gozl5Tqi5aa&y8h=RZcC)-V z^OP)ND0?7!P9Uq8Ax8VvA_tb+25)C$k;QFHi)cDu#J$<$1Ivyg3r7Ot)n*Gc$6Mjw zIi_}}?@WJT3)L!O>WpW^`5R$R*i4u>+%BX>YcAi^hKK=zUN>dI{PH><&EUVk-pD&# zpY8l@djMS}jntZ)mx-rzVu%SFrI+hFx4bO6AKr#wcFU9!fmY3r!a~DOY79ZUuzWN| zs4nz#ow(c?Y$rd@PtDEDV`!Ix@Wd z8dvZ^=xzNnbm4N0Jb#hT|G1eO^Q4P4@MPP8ai!5&Gqe6DcG5gHw9*Ub9-C_cH%(wi zA8nHdF5>-vy9m({qCIsSqpAW{7q#G5kwTT1&rP4XO$Mi6PuRKQgsLsM(@f(H1~xD4 zi+NWha{K|VA4K~roH#64?P!2sR+0i87J0lIU(>xRp^G9ScHWj_P8*kb=Y6Rc@TbHN zQA~RXUBfJYZy@M6Eu%iM>F4Ni(EGKGQymq)yP-d3vqIN$A4hsFTct5(>t+RI64bP` z9@WiGE)>&VjXZ*?f%W>Y^;*UYgb)iGkK=%w-^+lVmtgATvScKal6K~dw&-GCz!e$D zMzYZ{=h*OYqSooZXP@PSF<*IcnZ|A4C43q3CCkL)Yo)sqZQcd7Lp{-756O37v$XFt zS-a7U$z`}s@Rt_vA&#F;>|&x;i8AV@kxb={pv0%Jn_rX`OfB;U4J_G$YSR42 zkKbx9XKWE375OLZ?1{*}iFcj!5cxRDQa1Wt;yL$aYmJ;JpN&$DAudTd1lNlLIpTJx z$}n>?ew&Vh6{gXzBxL>gi7n~v;jkRH6Dn&!a z@M#$B(3qde$@(>auF3-fse?pAAGRcuui%X*fHI1OF{xQQ{~Jr@@R%R1t?S|oJ;$6i>bL3bi1uV&-Uw@-nr`3$ z*>5S1ObgI}_Olkm&v6xgRdP)tm9>4o7(YsX(egrwMywZh>R0Eic4Z}f9D>&Cq#)?WRjrd#fb!1Mxac_ z$sin3{3eJs~yye-ZYBuM#yp(x3$;OjsNWTp(N)Cr6s(NUh2+{ zdwsI`%dJoB*|R+!AyxO!r{K}oU=Jnq1~~T8LZ}sW)jRT^usZ#_@c!w{XIyv(^0Pzk zI=D?~7RRqy{B!V(c)cBs;4`gs-G;qiLifucQ(hYb4}%pQd9>+6FG){NBU$^4&-3i%hf4S(1;{9Oif2Rf<{Qp=M@uf>Umh!<#5 zh=+wr7rQ#-XS)&_cl*gM8cd!nKeOJQswId%bjSkU+SgMeq$z zXs-Jw+a90w0l^Sx3>%2li)d3jTRGxcN>u&D(X#L%vEQu6UT07SYf1NwkTFZ2$r=nS z$gfeTT?ufW)QZZob_KU^$%de+li)V~FEp$f#jgpaaI-=}Q@2(V#po4iO64GX3n~3B z5QT1goRrDuS2L@kD@MQ8M@wO?I<~igC5lE@>JVCT9Q*uP?cBv|5j{1{yj9WY_pDK`7N8!Ti-@ki(Cb+2QcxLPy9V`uA~PUb>{K5^(6>bfHprRIhV*qj3>o)33Pn zJ(pGzIaY+4t5Ro~NL#%5<1J}pIYR2L!QRMRxfX8ng1k8If`8_3tt7H*-=B0oc{9mv z|AM#3v9bJ3OTlpQ{LsUiMl9qFJzr11*2wV=;fRd;!+vcy#=8rnUfb3d?!7*2#>|^{ z(Ryk#o1amL8NpIX2eT>ulim?;nzKo}TQB65T(VVo^9wshSAW#Yj;C1vY@$yaTWt2y z9z97Dc_~Hf5bwElf-=kod2zj64e&}AF*xl!>woi8eda1gisHM_=+k`eu7eQW4dV$< zqG@@Hu=t?~NDyIm%aOKy=<7J2hc`(Ft5ScpAdd85i%awR#7ZGm+TH1+6MYe&MZfn( z!sbKR0P1fqACJFEqEpc-R}9#0PMXQX&9WwK&7;nthWRIx;PzdY{%0=W#$3uW1@iBb z@@R=avH#^}`rJfhEmrQ5MAxN~+S1=fvOAdkzc1=XOc|yR7}LaDAPM$`gB&q>UqcNh}-+ieHLKXg0BhIn_~#yMN*ZJ+~)yinJm7>?RSOOlhm zczjo+6egUn76a&$J@Oowab=YAXX$f!Jx;v1l4(g8sX*G}=eX|dbaq#rL>It+e-OKc zc>K?5uhl7^!g6eO@0-3)zfNg@nkG&tz9uLtOm3N>G>RsLvPWKw?zvlp-5!`mQH@C$ zh`JTtP6N>8mvmBTi=7>7<8;x_X*v>C1zPD8)I%*k3&#N^CgO?hv!c9d7jSw8H%*h@ zcxRjtZcUJ458ER1ns+2wpEhMO+{HRYzyy784fC*4GFmb8y48qs(cXYq5C1)gnX(=$ z&dxi$Kgc}R|Hjd0$|RD}7ewzk_oZQvzC%OK_IW=B<6`YCoF#fMozSS>Jtaw0hxF0s zmqfWG{A;MU;kMuRlfE3qXPF?EdeFuUkW|%iB2U6>sc5Q%ovMUc-VPl+tDguJ;-Urz zM(Xe*0x3ean7-jDo3x;<3)VG5Xex!XMzBnKV0LLla!${-asGHw)SS>z($lHDz?apa zo*`5egNdwLA#Cww9T6fq>SgcZ<(>@mNMW84g8HG{=;{v1gLtCpN-|H%XzsTmxuNS9 z3xm#6%$I~0)RvM15*ey)ImSy(UozD9e7JrXyKfjY_10OMP|h?j+mIoG=;eby@gD-2 zL0a4BBk#Am85$+ertmXh#<4=(p6GB0U@IYq?~uh)k^%IVCb#z1P;pNNRs{Jph0Pe# zIU81-kDsKZC_E*kZ-j%kD7e_7_|8fKTg#C_X5N=TMHiw3m^;TDsbeD8+>A{RI{I6R z7JJ;N!`jt-!f8?h-?()M%bHmbSg4L`<~6k;8BHP(vT~%m9YX+vWhH?(#+Y~)x9@rM zf49~4)F#&-T{39Je=<}HYADNwN>jH*z4_|nbG6H|?BEo^VP6uG%$x&neyZyAi~+_} znjt2si3007WBv4cUtORf)&TxWVBQeBOpm?U(iBF(%R-rSRX`jZgHk%`@-L#&IB}S_ zFZ7*g*V;?+{ydHf7whMeE*7Y$_e1+&&N7nFl$o;+bupaS@tiShA3xUnqBHY~wDhT9 z!)^ZU${>^R=y{z49MJ`8X2slODpvXYU*8;bJe?trH%BEB51#1Ff)l&rO+%A0CFz}N?J)^xT8?)&^FtQ z~DTH||PKcyt1ktc0fGcY3@ zi=*8ndDetO+esu&*Xr4ZaEc+`keLKrceF9l3&LX~b9*F8?$&5JYr6kC?s_g-%tKhu z9F-!LX3|~SUIg#td&2h0&M?l;VB`gteHMY=#L0f@B%7^uTX+nBEZgC`Op(ONIQ`wf z;4(Xs1oc%~i6m~f9_E+7)^U_YJ_1S^#R0I!I%Z^laTl`MOuK0K0otCrfoSz`Q-u(} zOJ-ouo8r|AH-zTuOn6Y0QL(X9hU|=X2wD7^I~A#Qo_O}M*TnPsVRP|q5xCJ5#m;?@ zBWhfMdzH)Y5aNLph&Mtl3^U*)_z*UK67{|rNiDe?!qi=hTGKGQ-Si?;BY^~4dz)u< z$+QBw_6ODyH8EclT=RK(pO_|j4* zXUr?lpOhzBrddz3&)7_fr`_gnS+;$?^-;&$C*BPXd20^ex*yN=)R%_7J2V)+!0Uzl zW}LS}IG+IZa+-pDam9-ST&rZvgoy{2hk;vUx>j^plpEC)uW}|`HK>R~gaJl$ZmIuLrow)NzgBI!+O!1b_W!VQM!YV9@V;N{FN5ah z_mnxD9mPqa4w=B^%}G%IuCmy;hc6i5>XXV1wD2Wr@wKoTnA=y`;jdefDyvWMescf& zbg5vW$y1xj5(3Soli;}n6#ZnWRdvCSJX=YWT}^mx?T!JHy0im-9Y`Ej1;%n-_e(&hrk30=-5G zKU&0QF-|{0t-N(@i5Ijy{EVn@9bbidJ+`q)@a67=1c(wiAD5v&Rnw zC!<0pwDQhh1)f)2>m)qYC{MfM{X_YUoasB(IEPXO>T`99H-*J^R2*{rbA?;Ih@^He zA4QPqfmGEmu>QpKCo5@{_iSD7fv}M?+!?&#Uw<6n(SwZCuH>@KFcH|`bkHZ+sNEai785_Vsf18unKDtY}lu-6THd*^i?5~Y`+P`3pR;>glS+|C@OaD_!c zW})UDPHX%&^`_I!N7ceWNJDF>4?LG0Y_+m-i^9hhdOlR^A&`&qNZs>m3i!!)P{Hyl z4&c3RN*CiyCq)mEFmjz7(~_vz?=Q|%?atZNfkS~@v!~r%OA}n3MpfL7t zb|q4p1n+9Pwf_8Luw*)>5C_kNw8W+})`Xp^t?xl%sXKzL*g)r$Bo8j`_d=kF?ae~m zTTQwj7aVH_gUS!9ZC}49i%s#XQ!CmlW50KLJt>n=e62dj$zG`?jeHd=f`|^dbi!Z; z%cbfAJQS`(S^hz1M+2T(Pi87A)c8_wwdJGkc(8J%45Q@#A8T;ZT&WM0XQ1IVpno9K z41!~dHV><@1p%Kc+1=WxW^UBXo{Za+V|R3Di~tZ%d;1mV};!VVvr0Wx8Y8v zKJ}=9W}aH53>!Lcga-&mBO%<0^CHExd9IUQV&FaGRm2>ncc)HabzI~Z#j*A%?F-$;OM-bwuJDo^g~1D_bh)22 zUibJ%Oziaaa{<^Zp07I9^`(3V#LOrgwBft(K9KDeq-h-So;9_ye4Vtn@KP04XO^<5 zPM;g(Z3~pKKO_vle!J;|7Wc5`M6{`@8Sgt6H4_~pA6NeDqARGIe`T@Wb+#<)jOAsH z1!}yRW>mwj-?Zgz{P^shUfF{dWUSV)aGyD-sBIIf&CQLB{g#&Pz#9>bhl^ph1my3@NV_uE^6Vu*5d4=Vd6F!FEe*kMq6cRfwCT_mmJVB~eu=ABVr z57Y1SK5K&1N1X(f?3Uq`Tox+0V_^*ud{3C=uTFkH_4HQKA(}*DuuF7XE97-hrs!Lu zRq>*{@#x$TGb2;U_QALezFtqU{33rQ?1LWHUh*T8LIr2|%e-*cuUMoJpB0FwLI$-< zrd#~x_}LDW;95%s+Sni>*iAvcLLj~Ud^ z@rA6z3L-?Df}1inF;|OHd9qSg8A~jTBro#hA3YsaE@#Wz;%H?}N=N%^^n3R_sCE6H zaimbQsa0LOSim{%v#|x(J_N?-SwSPZgNt1yo4=wyL+tse&a5G{=3AMAxaho>)Zm*O z<~b6CSO}{csBHJ`)*Bs;7LFCV7xSmXM+Ei{xzx7ZsoLH=#nsxL|BB@Bx0jE=`uE;n z$7TGR&T<92k}HmH@bi64F|eJ02O#EG^*q6l3{3aH;|o=i*iYd~#QL7VE4P~30#4mF zj=~W)x;XXrAgMwW&lE!?!DE(_ep1M#4MnL>SaFZTk_W^9uCZlxjbJ44>k{NpiJUZ^i3+5uPgBbz&wx}N^f z-oxUP|BnA8`&9-pfXE>*&W7UN>X6A=V=}-3Thy(LR1DMUCA6FDP~%#sW-%--2@0G& z_-*IwV%B@^TF<&zCel`Gu(`)ZP z#Y<*+>;M-gb~ElfAI0Pwcklxq{u5r8+Xdj+4?F+$ke>~D*l(-y0#2-ZX##N97bwyx z-w`pri;VmNWXVUbJg|3OaHoJ<-vMb@Ha|_xD_QS06>s;o%Zeo*f|VZUM)uJ^miClm`|>B>4}&=uvYQvKs~zmr%jjav#fZTd!r;>^g>Ywy(C7Fr~i7&#OPOWk&5hGoZR=HOt0f;cOfL2Pw+U59ZbO_7P0!l>oh$ki4TB+%WmBq6(4cTZ zvz>XEwO&FFQCS6TJ72-14$*W}tyP5(MS|57vnq+`n+aHX?2O~Q1gZUeJ`^z~I))ICbw+SoAPUI02z zCC!H9&k@G_+19qx^XSSLDPTj$CLCBeljjt4IweQy`#HV)5#xk;e^CD`t#Ifd=X_hEJu!Wd3PCUsnLE&lc`o|Sjs4Hu&h7;Xcp-b5^!)B!s z`AfZKQ|FVD9nDO+jKJVn4BlEy;G(OlgoAui>hC*SG!+C8o?;87#mmYeC+FG+i{>T$ zsJfi!PWv_PmFupkTSQoSgX~%*w#j2Ejf{LW%;rHP03q971x!fEj=AzRTkhl>gtROU zF6Dj8v9CGsv+?PK>hBS>6%~&B2`%a0Sp7Ieui8*M?Qa!OZ8JHE!8YYDHGZmMKxH^+ z+)g}d$q13G2I=a`GSOQ1QIV%^brBaq?<@WLpK95f=qK%yf5q+dhhZLfnxe`=Fs81O zv32wQ7~(l!Lb*dXn&9}^x|@*C1gh@wfcfiIJ4%o~NIyII2LrR&yVcliEe~CJt8#0r zhgC+Pf^-z9ho!{KnOZ1?UYPBw04BzTpHr(j;t@1p#E~QQDA(Q2$YJCxC~wTA=+dh! z(ys@Xcu-6rf{1SE@6wqF{ywmFBH2xpt3zt)m`nrAL1X%T(#0jwKrU+Ac_D>s`1e~V zJK26H(ZZi)`|@rtpZ(4*e{7l?7MAV0Y*rL5gy7PFUa+up-g=OAi1_AGhg^dp=7`;IKJJ_VyR z0K0lblb3QHbJoS97RG}rCPJ30o?C*KXT0_&g@NDJcfG3FYL(;+X%;K+Dol5=zI0kl zG)G)=!$hI3lr{wv`2wxyf$}@563x<^kn5umgok^XLyJcVu)_;DvOo;oiiossXskmm z3g~;R-DrjblIYFzBq`;ke$l>b4xr1xbz@3D*H4-WyHe$sY|fC29|wpzM$CWs+4MR< z{B;gm;B&Xy4~7w4(ic+6r#&5EPuMv@Y->_Y&~T!I1>-NRR$~{`{sH@+@rdL7-(mVz zypd{{XkBMT7cvu&G6f`QIl&j#Q_ZTSE*;Mg;<&o*s}n!zuLe-W)6!rDuo$~iGU~9a z$if925c|Yu>r$!}Two24?xQME(k1%t$P{ z6{UnS>AOA(L6_RRo&OV^*_xc^Bb!f;24g4_7(D}XZU4_-T(fVSwSDK^=X?@@R&>_= zmdAEBzV_v}&!Y{rZnUo=s_Wet6Y2k4CfJy+=yveq#G9IR@6tT~~ozFcpC5DNi{qsT_rWZ8pSeu?}o{9-A9GLV~Ncu>q*a~Z>+o& zfBZ03^i-SAz_?t_@wjhCJZrYkDR$m?KOt25`peJQsWd#U+AnwIYVVv>0e1wO4&l}i zwx<91cV)ri``*H?b+ie{^>DC7PEP>c6QBXzr%d3FSy9yxBuRWctShWjU#qeDrRz8M z!xj|tlGe_jZ9hYL#H(ekIQ2%mhulBHsS5X>bj=^v@e(AgutVIj&$AyQDDn#VVM?m# zr4aJduLTaWeA6#!#zev9Q|+!%U3r$gDbEjWw%=?Bu=YxwB7F-j4GL75o=@>hxUMk= zxBd`XJd=Jb`HcwFKVH}n%PN*1r#@n8h7^}KEimFAaZM7N+LwrVd^gFP17K1Uv9lVz zl)VtAf%z^;ipcjLBK=q=+=vE9_FsxRc6YYLNfnawJ=3bZeAEcX?)|WqSH=)k`b{yK z^J|oUN#gI40_5)uo;HmV_qrR9RKL#-qS9$0%6}2whmgNTtE*X3L)qm4E*b zF-=ggfM^HE+RE+XhHB&p9R#1xt>}Upe&{R)Z8O3{aC+25rIJ^UimZl->W}$$x}`A(2QS3H`6dm)rmBKjU`2-wkHNyra>7 zufPJw(1286$h^4SW{*^RPfzc_wh)sgm)_uyd(D{~$^!3Lh;x??<0dyt0BrVXwFC)X z1w~KF!S3!SXWRj@XChR>PFXFIQ>^Rg1&>Q9$QP^y98dM^O&EeIqO7rMl2^uBBx&m5dxxW>7Opey$0WI-WNW>wbf0WGzWg&%vMO+ zZf|#jt(S%PEkmUrg8w7DilxkFy?pK)bW5qRJ6A4r5a3r-C#z4%K(a#Q)yY--m@Q&` zk`QbQ2Uj7c7Sne9JM;3DfIrM$10ujeK4Shvv<9GE1>*U>Za)S1O*>?^@eb^hwbvcb zoA33|D)R{QSDvRq0Gf9MagbLr1 z@?cwL(Ek{jyNBjfACzEvVMA&+K0 z;5Uw7-w%qj2;eH{P)woQti&~xODaiX$!yeKHSMSPvFeUjJ$Fd* z(@dk~POV0KgNM1F5}nP8ieIFbG$-XaNm{Ha$ZL#-j;UvMeec%jRT`I8LY>7k;{yAJ zdR_^|mx|PUO0Nux;frI}N+vtJJH%Sox-Yk8nr zu$QS@XT5xX6Qs+XX!+vN{`0RF>LMiL(=Y4+fcwmS4A`vr~Pk! zX<=TaJQlM6NNTwhwZ8n0vzd}|F=1;|vfzB!pjzuL4g6qP?xgAPUfps8K0Rn)tD{ZXb&0+X)FA_QDKH)k^-c6LbO(=jq z+|$9l!}D#k&g4fn-cPccP=!LLBuU39Y=RPuFKkf0vblj?vgdkl2>9|IcL3y8vsoVN zWCmEWEow!)j=hM)LJt8QpPKM;7~rblGU?R*x-RM4$q*tT?{TG`du4MTr;)$a8e=Lm z+O*>E3J)~QB9pEiPi3-y6js>p`MTwo!50JFCjFG*ym!zm|Bo^h!rwustGrY7TX&<) zE&t?4e&D8T=AdK%#;@^|8cGsy@uUDV4T^`@Ffg`^Z7MkhShc*CTOn;T4 zU(;WyeYAG?B($^@PPjr|)-U7Ap-BJde&{Vw1oV|+_py!Wa92ZrIQG%l6jZ@N<%`i{ zHuy`pez|vFXJ?gb`+x{s1XL2EmKqML3~19ge4W`la71n&d-*(O<+QVS=|<%_)kwqF z^^4Alf4*EFnfbB}a#yw~3n_`{uZH7W0;TUBo`6aR#(Lfn{nk$lG`5%|G;-h!_}y&8 z8j#Z2;{7g{Sdn)-DD-G0ihX1lyjv5=) z{f2Y*tXG@`ek?cfa4iE8w|&vA^qtwDJXZe|*U5clwTi!O;d>mwx)S3_8+72Wu1=WMFq@G_-xD~ZT%2;T_Fz|wzveU(FsSw0(WJ32^4fuOtgJ%+3MGl7VTtC z7MdVnN>q+Cm}Q^td1X7Qd$Zh~PfI$jL^?7!n4pq1_pI+kpLx@$eL~oSY<2|hpaD(e zbEr(FJT-r7sMYZL9{BCm7o7Tp%`|Uaol~0kFaTzA%-d{=kMoU0kM%HCP<*C+1`w$t z8KPjxy8yFtH1u3dc&f>D{gfMj#g~0`xE%>OuHDB2fD_lBs%hiqE2)+-=s)KdU`)>|UOks%^b|J*NUfRU?IPpbfT^?G2T5fjg%B$ko3 zYB0NKz{~=tQl;Am9^O?>*%~8a3!miRQmr3Iq`3IHeY?qkyrlmZV}VwDRdQq6 zjWq#?3$PBYSd9EX&d!1>s`vf+N+T&C(j|yUNy7}?Ln|oV-5@=bba&SP($Xz0E#2J` zGjt3+#53P_@c%upVAeY8KKGgH+IxR?A^pP`zu_Nvo}bsk{(h`EJ$-$*HXOm z;btkJ%GmHZ&A-BY@KN+JT>v+D ztvMgARFTJ}>xS78srJ&gSLHs>8){O_JRjA?)^0o%EGT6PbP@cTuLPD>uRmV{36OvB zUL2nGTe_}t7(7OTymu83^7#S3Ss57GkcPx!F9fEJKWrv;doHJ>#Z`b4bb1h_qgq8@ zL#;Tv&(Pdt`jT^#;_) z1)0xW2XpA`YoDIuMnzhqRzNq}3TT?%Ty|fN=UeO^t;t7ejV8#MxV4bhO0MJ6GcpYk z^wFAPzRn61!=vcl)BHK1SoM_=Hrf!kM<=aPoazIz*>SCK*&}K7D0;5**?vBMP6W37 z0@9ouy2ZW!1{IY>Bv_jLmbLmG8x7&H&JDnZ9~6H(3ZYz{7pQ`50D;T<4b@%eZi>^M z$1mFl1r|H~G%X9Y0QQn5{YLswc(3}Ltk`YBK~}vNrai`ectN%I3LuxcDD`+#Z3beZ zs!qwh;q~uS=(l@Gv1!g-(8KVjsAyZB`<9wVxfLhppWDu0aO5?7!LaSFhF`xKlZfq- zX&<$4c+4r+%No)C-W`>;Aq155)BcZ63nL|pMN~^H3lU)NjkRx!{4$&+T5lXRF^OI< zpE?E;JSSYnDj`mH8919u1$~pjBkI+p_Jc#I`j!{g^~>RM`ioE;hQoe==-r2hr@_}J zH+$om+-L@|-r3VfZrs(+t@vYR0gv)u?|8AKM7gEW3Xhi>)ED!L{Zbr16|q~Yg%(CV zieo}Qx*Wj;MTG|RBbQNl%U+?@)v5%WdB0v0G%^f`ntTuQmhzh8Wo2#hd%GFaDc*4+ zsV< zk$Y)9dzJ3Wt(+7PyEpAVN?LQhQg00eUX^=&lmGX&lm#ccK2FW4o~4 z+TgKj4JS?lW8*~#6K3OgL}Ft2y4b8s_@Eqk!xrBy0UF6^FyFvw_yu^>7}k){_|k7p zI}FnG)6$dEfN|>E;d*7Um7JQqcPnRh=grro>wZgrB!7B5HrD+4>75Itp>bKx>wRg- zu^5q%r-NClpOhd`axXJ5BD}DsfEBid3ypq9D8`&;=?=v2uiFvAaTPjgtE+0-CSRb) z7ICFUv5=LdcMDmHf=5rx4nJ_JK18NNDMFWf>aCu$rK_B_zr+7d|I7To{SK|-0AuKYSx1Z0@(H>f@>iB@|KBqum*s~?SW z5L+uE0b&S8^uFgusm61tIs44dMDqK_tQGD={xv?!PYqIK@7hl;AtlL-8xsCx+=tms zX0-Y7Xvs?oc z6byj)AM7S&$d;S;8Hk6T16&?9{g1}-HCv)Z??GHjY>9B7ncmL=EHtRr>8uE7X7(rv z`TT2W_uZ^rZY}Q;ksZWmMFvC_!0Xk)u4?~DVzr7u%Qkyen_jpl_K6E5*o;l8RI)La zz>SLfNay3svB#yJ(Hpd^G_mrj&rRZ<2gdj!@E+FtyNB}k$0Uab>+4cGR}kc?*I#v^ z;x1#kp{0$p$LB9kZmQ*etg-$oU(s>dZ-ibyb6_LrkGELbULrpj!OW?nI#PY{Dh=(X z#1~d5@R^x{yt%~QQDE;4K7iDgym?5(!>WY8<)$o1boV|PqqsH;eI%I-%&q%s!Z~p- z128n~G8q!}MXcEVtQ-`i0t7wnlsPcU&Pm*TLXM%j3_+D^ zQRB2E@mG4>y_kFNm|Z926SA++`^ku`4N#j6UTAB*^wt`;d~eS;=vd@O`X_}a`3LsR z3=v8V{->gpEi4`%Tq#R!UIyno>_voiRj$z433X`0pib9#%_(bBo1jL; zZ#FymLMnPgqHC{ztjsQy)z2uqGgw=)tH7s=$sEyF>qwg07EZ7vP(%nX>F@F|*5m%h zMzEfu&rXrw+u$y4W9&>{i)pmn>rAHM`MKQpxY>RJ(&-)Kl4*p>tNYqiJcAeK8S{@P z`u*$I0lo$@9hT}j{*>=1X`m^{JnckOuIFcihrU=655A)b%IYrUw>pm2b_1&Nf&1k= zppyI~2#|(4y&w?Li)EpVQ{!Kv9{ea7-YG=51Tr~Xka+}S75u6Dw9`igFyoyDw;C^# zS&RhBe%kIMa87FTv!9=|tLk4#3?5${1T*^xZv4Z#n zw$})rtz5qkpPQ}JEBI2|>Wpm$k)Mo5VxxYVy3?zKL1VHsC#%TdS1k8`u@Sw_P}qyr z@Q|yM($bw;VKgVoC&$_ca+Z__C9Bpz>R4@H7 zS`rv_6GjW{RK)r6BmA~$1HaZbl0 z1munM1tO0|+SA22_h>uK@sTmWxS=`E@n; zqz+_+dN}%q82R~_;k|!qH@DVVH%QZs*G#2{UrWMUW)c*oLpn?RK-Q?}`4R0MHCq=v zdPz^(-#TMq<|+)K&fT{_L78xYSgzHZ+{Y-72H%`3}yImIBu&%3&9G2)Xgw(kF)eSHiD z;pV5Y@3Ym zH65^c#oAL_=KJ)v?~N=I@X%!u#I}~7J-tG22w!XeF#vrgUTzjyJh0&8^O)BT1q7`P zeiBj|sd+JQ?IF2p_MR=XiK{pIT-ID0q)obhCl|N1TSJqQJt<)&unb$D4SAIF&f)*P zv{HYZEh^aW7uJL~GRkjB*8UNzdw%^UbMS@ncTy~RO+n+(o=I0>%v%@f3Zzuy(o|!s z@OCS`j?N)7qEC@pum=7EK@|E&5p{(FucyZ?$Axe{BmYPWm`R_q=KdGxrxm%M5jt$L zFfQakj?uxSl#K26`e-KR_-OI9btb4}M&Lc=jhMF0zaIq^lePlx$X&R8BM7Hqo6H!p zu;8}F&h77Gyt*TSM_im*sqao8usMO8kPpcE$BppJ-We2jd?`MtUnY$*kKb>TET4EVD zHZ>vr4scW0?bkKiyg{sr>dvx)2C(w z!q*8BwD$>H8dh=K!TJ_~t;0(>Vn}pARPL>SIS`mI*i1OEACjf>ExU`&f?v3dv9pQ` zniW9{m~)WGu2uFO6~P#AtqwaIge8R#UEw+mqZS$Y+|j&c+0U34KZue`%aMUCXF+5{JB5zig_v*{$O_xxy0_H zHHi~OX0U#@z}0~It)gx>f5fUyYRJRg)3OW|)aBRDL^~c*`!()k>A8z9sb8-o^L4m_ zZ3ow~@vvoX20eOESg?d2{;9p1(jgHXV$00l?m+)KH)$!EKM(4gxaPKWAWpZmqmL>zH1MU-bz^6 zB#U_D?xEjDP7wYM#m4|NVZ0mj=57X9l1T&QXBjzG=OIy((E~x2fA2J@X!)!#9o78Ok2hC;RVazrkn%#>&Kj_!5=HBh{ zyD3bxTh+Rt@{Vf1y~cy;**IM5M(4SrucE|Su+=(9$kKlAj^}0-mwgy6k^P3Vf<6Ay zl}-Qgk{LOXTl()-Bd2)P=bry^iU-U5(^dw=gL|OB`iI%5~w2cqhVZu{zVyfRja) z_}aLmDz&``wr7mRx)pP0f4jHiRZ~D${cZ5RBtMmHOzbj}j`WYe?OXxRx&7|sSg<35 z00ls(E7qR|lqf5b8%Z-~MVVGZ0{+{eKBRLx4V%V*mN@&vfBKtd-*y~#)DGFfGE!W8 z{&+jQ;M^?S7s^O)PTg-L)>G$`)1D(U^`jMdA#sv&{nhp{%bvs&#{wVyKJ z_SZT5Wx75|+3R7(H0=661O~JG(Cyb>vGdtICmC#C{&rg-HYmd(BrB#97`slv)li+| z$rM_Pr z>H;4J?}a@J;odJ*^EmFo7>*NO_8oIb;NrUg?rAtSb!c*0!q0`vTb{xfF7_OtOtQou zICBaynE3LXbQni=hSM9LzkzQ{R8}UF2$mF@tGmd5rB1apMPnim$jrr44#LW|vif|p zuc+CfOm41s4VlE;)lAv>emB5(jO+?BA|NcDseKROL?+RKO6#n!lgDmShc{W8Iy=m# zt15mmFYYKo$IU8SuEuVX6S-&)PqR>0AlUL;`rxSPhMv=+7BRo^EdH1K-@IC-KYNd_ zjuN2JM4xZ{0uw^d#4DqF^S9sXO&@-wV@PkIIAqs-N2KUxcPZdBS8(+XpNULgep_m}i7^C8}FV zIv8P5nGRh8ph@PK7=`kQ$b}~*WJA)Kxc7e4fBYG5x?JBI0e?klY4<8^a4)PM>FzXh zgCaFdyQiPvU;3H0aWB@}6$Fn|FrwjCI8lA->_NjgH@b6EK zU6Mlsbl+v|g+{Pj9-QG=X9B*}stOn(0%+bAl=Yn^{l$k-8V z#WZaxuj}SYv>+fgBAo^OP_DR7j6Lt>lSm;1+1J_wi&541A3wsV$FBw!|GfnL8l%Al zmFhXj3v=I()}kii^0KQn#Ev^{i1Wp(d;`Ec(-9#xj3|3kvto0Jsy3~Rw?H>s>GA%a zLgjYhL~;MNyISh9p0={T3UX)`!4*c~`c5zgO@Yh7!?&~bKG2`B9XPk%ZeNMgBQ5F3K^4G~`Jw>SsNV~)Q1P+#rRSODdrC;Lco&Y>&#miDpy)iu|NBOZZM zkZ1w{$CkljY|BqIN;*YgDRU_*`VCG^OLlKQ1wRYaH=@x@mO8py?m&ER)ISwc7)Yhj zhQ1JhB)?P?9mexs#6ES2511c#XD$?VokY&OwV-Bl<1NHwmv5-;D-ddr1QjwUXON`S zdESc}W$cC81iLM)HB;)ohQH`58Zx_XX!iQ~+jaX~`nW6QHK@OWR(RT4XU`o{Z8Q#{ z3aX0nlAyza3s^?SK2hQG9xrJv&@K-gp%Ue`^LO9k*nhB{mZ&ziAEEmGX+mAzTL;7Q zFLxLR#4Hi&D@8Swj|TcP8u0JXsOxO}_{QElQ1W+cG1%N*#@?Zc=1O;eG#?!+f=wVI zX;tj<6Gm~3za{=yp_rZwV9<*#m&|R5!WE|vJq`YT%kg2Tb=NW$87I9 z*GPpu8Dt6#s<=KyTa3jbfxbsR2sqyOC^$HSaI)`Pg52iL@6^Lulo-OrUd z7pCjiS&~@!YB^4)*dlw|2QuhBw!{ECY~=e+#ITpdNPG9J*@h8uc%;z73;b4t&@}j8 zhh3Up8+I25p*dSV6-iP=Kh4WfvdJF`&j2c7k1T$Vz{RCW>G&cFDfY&}t!jRWIGE_L ze+@kKKVIz?(>GR4IB(wges!j1lpJhw9D0%iR$bPrmf8;e()qYpH}q>RD=KnUAvwi6 z@?*MxPp3y&qVU@p?n_Wt4_SI3R)!mUcc>*_#_b`CJK@QrsC#0TVwR94t*OgNqO)Q-E*zD{`b9jk7uL{u%~a%JZO8o7z= zq!(q6wyBbC_RQy?Z8z7-(@QLue<>!~C-HICyj-4ymugYk|6Z=`F<)?l$(B*BEaEj>CjDe+K{0>TBYU zb>hGu4{xz@&x#E<^$!M;Q%O}%nJvk`aE|*+EwPvTN;Or|C_2=#$--v%HWTaawVS=- z7P@7I5}UuRy;thteE?p~+#At}?O79fhEfnE+yIWkuG}q;ch(p=L+qy?n6wiu;it0g zi=-y=+z0Bu<8JvS`qQ^ej8|H!JAFp@K9Q0I(d^Py=FS;OyRk2t;_iF}4RlK^anAp= zbkTDNMNralO_MN^t)x7+Z5S|qySwl6B$)GyY*nGS0`&?9U0Yd;0%`YeBPB^)4$T1~ zY6QtcPpFUf6$bBxghO3|?(*c~r7CPb6u7^VUAs^1XfTXYl`1&L%t}pgEa=q@TQAfn zRHI`4wlY8!2g;*FQ9b7W(oHP&@SeTiirkq~ekPR{yFI7P2dC>y1YKG>5g&s_xMlv{ z#^Olt>uH~*!EEzcwSHG5f1QAjtEPyK$LU7e9orN!a~ZpO-W0_64mC6U{G+@+ zQNkY5dP-wbk~ckya~+e~0qql}?XhoMI3HsM<4r|%pq^@Lb}h0*I1`+f{wxghbZP(Y zqiV4Xc{7b0+Sx43{Pm!M{qlRU$C)d>s@8*wVuG2e@HweH~CMPz?*Wr5n7ih}kDf3PZP z@6jXKOtzX;iu04fVCQ%)Bs;xf<0&)oql2)Y3No|c^W=pzy1sl2^mXH|MGIZZUS#p1 z^9O%R!5OzEdFO%Uc1EU)j%V@d3&9^D*Za1!P|@$=C~w2SV|3fueXBB04;&(PkfQh9A3RF+=c$p3>1$Aepa05{*W2S5^~k{Fd*<1^J%MjuHaPc)+4#$##XGv z>*0Q(qGZE0zqJyF^J-}{S5ezar-h$%L_t-<(=hQ%eL(G$_0qD_B6&xT%`F|bb1I2; z`Ze2<;NN%W%frVc7P>{9)ba%T!I!T+bC|AH3y*WG51tMk4<03i!FNfy^I-bwbAr=! z-fg6adBWN%d(C;Mci>Qlxw~td)|ja|oAf)&cK}(n$P$_y+OKuk@;Uw$Dn&s-@;!*5 z;|g!dhZKzjHbpa^cm+9F;3J%9=-|z5Yd%3vWC)KrbvP_`zQChmSF5~%9pFC1OAPAD&8g!0t|sl&P2|BrHU{f*PQQ@-z&mlsE;z1*A?F{$&N_du5s>3 za|3c#hE_pGE8p41eDZUpR-3bQTVEb`se3L0)MQRYA5=H)DhEYAfE2nP9N)2Vb#dS7 zRYhiYxsE=RcXYj^jj!Ud4!eDRfwPiVQm{F9C~`;pa8PXLV8v`#aR@zVEuy*vjY-Sx zQcrRj$$LmRjRKm!0(@cL;|;7zF2!S(d}LXypO3m8@Q@#xY-Q!;DV>_rAUS`G(}x?H z(zN}o8$0GPOr6k5`zr?(g}F*O*u-EMpqQXU8PWg6?CYy3gnoOT!7Vy0HEDnGJ-5xr z!W1LCU12NdMn2n6ZGXx8eAOPeel-zD!{Hg%9|n^l`?7ol+I3|?62=+L#Qm}%x~o*c zwchNqA$i3@q5EHnFuyjpq}&(Kw0eT{&6xKinpD;+(4%7tcJccbuv zhBR)dgPP3g*-wPNc|xYYcQT0bRd8#VF4h-T%!!tjS7mxFt=xvGrL?rEh7i?y|Jj#3 z^l`7SukHNRdT@kg){S>uenY#)Z7m?tdDPu`oHtf&r~w#&>ni-d?S?dBd&b@qbQRe@ zKfF1P;#~g`gX_Bt@&!r_zPwJG($~u zCS-i01{Wk&e==$D%y3*+;TP3IRNIZ!FeyXO;tCZA+epXRTYc>(@a2~*OBCp|e|)na z-_i$)UcpPoVTs=}Z>5dj?qpqlny3x<0M#2L=Bys3f6U+up7n*u<&E+XF&De9C)CZ$ zw6Tk`jM(N5_toP~hsj9qEjHI<6<%vEf7{*7UkGH(!ENXN1uEc%#tYBX+E3H_E-cP0 z8|Db7_z4h8tiwYJN@`z!sNrXy6g#>H&_RC>&V^FNHLUi!PF)vzU$v#y^fkt}4w+0o zxV3W+l&_VtIlWH|9B4ri$+5^nTFxEwO;2ub|2Badzl@orh-t)Vh>K{8F z4fGe2Edsp^Z*7%D@y!vX(wkJV8Q?Q^Iq+ErqRL*|EfhA|65=71D{pQE)B|{>#_?ol zz}Z60mQ2-_Z=Alhxqv3#ap-lobX(08E_FUs_!-Q(45~gQj~C5|6p@^4sOv(_3>Ug) zl2DVbFXa~&hyd}>*m(|{ST0)~B(F)p&b(Cg-&H~QXKdP!M$F3DbmC2eld5B)?js*f z3LuNUA`l_3Is8zg8iTC!?#Iu!Ml)YqvlkRUnA?N;#NzgRamSX}ZYOOc8ofxhcuElv z|F08G29N(Zk-7u3C|u_CYweXzJ6(dMa~~g!S0uUR>2B#z?i0TVxR4s}7JQ^hC_9*P zKlHXih_h1qPLt_>U23sJ6ahr$`YR1N>HmcDu5;_D3|kKY^Nh$i*|wECh1okG6v0Kb zNEB($wEC_`?BG_S0H+inhKZwb_0w6WU3|m!CyukBXXb^|T zx?QF{x@FdmIm_`rn1p?7>DJGSymEV*n@B53V~%Y!(N>2j#K6$_VIL#Ed+bAYRsc`0 zm*ZWS>4;}i6A2&oUKSI|onu=wUU@v>o6zS*Q@T8?#=fYk(Up}aU)I6gAI}BM*di)8 z?X~_G6AAk#s9AgR8xIq|9sqsVq=bJXV6+N~ z;k&8>Kh5MK&EipcU+j7)&A>l>{h>L?6nuf)@(m~_LW6;t@P|U5d+}iG%KOkA64)64 zd2atbmYJsqKDbyTPrp%kaNM{Y|dW)8!PZ~;T51gr@J?8 zyBIT3cI)>u^!AymFP6>psYNrN&9<{ybnrHNl=m2yh7g6|R;b+*Kdv%NCUk?Ns*Kqg zlU)E-9;Wm5YB)!QF8m!A*L?pWj-u0a1GDU>$_-+VTFQKodv4Uq!V9M@B1zQUhT_b{M?u3%jFTNuIbZt??ZNECe-J&6S*nA`GM>~XY(CrgLB$E+BFpngd0Hf?qAB;j9S3&M2K-+xq9y?R>X^Sn(R{9Sz&SizHn zX`a8nkI^nZ@v*@2*RDs?iP`#_MxENf0=Sv`RDYxR$sBh__yh3S9>AP1Pd%kgZT?OJfkfJqlu)sU*HS%?$4{uMd z^1v?B*8+y+y~eeFjO21fox%9UartzarsOY@8|$_PYGXtT!1$s=t(9?Ikj69Ypf{UG z@JWSdf&YU%O}9PmD)I~kAwOeGp27|eN9l}mH?vRV8(;Ocs(M)crBNKCqt!~aE zi#7;Lc=XUiETk6JAf;*MDyQEE;q98?xJeMZssvs%Rcp`Hv2oXmuE(dg_hVc7YRuQO zsP&=vhTG}lU2}P4DY4%ed`)U!aJ@cs`09lJjv%Zl-8n%ix<}Sv5}OX@x`~}D6!eb} zlFul9k!MPsoXU=wCzIe?ErywET`>QaS673H4%nR)Vv5qo0ttv4fHsl)BO--d%cIH=X!r1q~ zxt3M!W{LOcKmCUf0rz z)cgo&sgVzwl8)eU^($i0=%plV3dM!DTc^F;zNU>pHwr!t^uQk1?&-n)#@SI7DuRPN{?N(2k`7QC!4;_&%Ii%AJn=yQ)401 zP4l+$o;)_{>%9MY((6F0Lm34Wk4<|%x^eYcz0I1iF*wvYjjjEf?eg|0=t~)6ih|9g zC5J0teHekO*lmsN)!zIrC7D28Py$`AuyQUh!49!h%vk}cnPk?Bn|(ok(vx>|o;p87 z_cV@m#fqe+3OeLOT2ZEP_h~H@4^C2oe0l7f8PB~^WudK>d=CVB3ZYkifGlro^{@ve zljxymGm22?W>=*z*+9~;;-uOA?4FLk-F|uCA z(A3#EenCkfX~^7bq2){jKNs)3ReHg5KVWZ7_T8&w6 zb@_UkGf26nDZka2>vP~(5BW?3kN{sp(=`Bb+zT0cDOCVTRsth73o~8x1y;PgftI-{?*s*<9J8as z85yJI#?DK+1ZdWUmeBb>;u!4_&UXyQrV+XRQR#og`k;pK9z@+;3p>CPvk9ked#Zo+ z?ED#?@k94@){eE4l&YV*Rh&T(cZO*>7=*%geKEu`K3H2!MP;&vS^RhqbNGG?uqQD; z#g+X}*a`lticj~}4EQaC=_%m{02TW?IJ#r56B3n8b3g?EKm0AsV4!$uUpmYtPzXk6 z-^;Wdp;353E8@uV$u)}@xAz_&5J6`N*n)R3dg6ch*YhWlj??ASX5;6quMYE9d5_$q zTcg&zvbsYbPm09fLYeI#ua62XA&3SLVrk+r8M$1$JU~Xb%qaOIc5KAhj1F^z3b|Z{ zjf%rnfAUIYS{6IBeR-zLYM8=_;iWfY_u;o}#(;`!+n)>;`0)O(E3M=&Vq*lfmv3e) zmW#NIl9-`H;9dcc3Y04~m8THGID|R86{Od}OLQ_LFr0|s6QNpbw%Iq<^wM7B{W#Ym zTp(7>>vG+Wp4O+T64>msqIyBhaaRvOI}F3@S5ldqd2+o$YAK`Vp?(I7&5bU}Oe4M~8jEtFR=b}2;9AcjkR%s;3bE|y z!owLIR;?QJy+gP}z4C3DWDcD{i|<7H-N3{2Ys!Cn5LpSd9bC>R8&KkW^Ih*9bSClW z@bv6&=*_I_iRW?m_T>e$DDn!@%=JgEXIjs+fS!hB3^zzjwltfF{y?k9Mg~{J*z8(e)fk=3TJ<3v`%{Bk<~BBLucPSN&JbA z$xJ*u(=;?6*|Y$_q835UmQup*;9_qb>~-3f(@L{T?H;hL_j;%IM4_+*IXo7;Uqn7c zO{bmV-Ux|CO)f$WvA}+NsX<&VqOT)e%84^sg^d3tf1R7mW%vdi+v00*-i=&;3-Lhj z049`X>QWn@y%MOxbHf28~F`WQ6F0G{COzV8YkUt~bKrPGCR{e*f z8>fExcs_)^tm@W1EI#NdGIL5R*1(%@py}9&aW4y*afxQc0-uAVUa4?ys*mGeKJDvu za5r< zRRza48~jIEGklD_e)Mo)Svzd>o{u_-1~i_sPA9DwBb#;Gf6;&!<_!d_n_3Iex|3MX z2+L6k1{?Z;kz*hc(1kX>RU|5ckgY!PwZjkL-vQ?8WNn~SMQq*eBXRqieL!Vsas0Ep+?RmE%(4 zB;Fu0f13WD&Qc?9b@X%CyK9gMqMava=(gW5u~&fic_`x`+@=Cveovf|QxlhEK- zOEGmov>QrKKWQnl-NoxJ~|A2m@fwgR2t8d%tn!<8EnL+b!UEzp0g+7b!B@V5PLxO z4c{T#_fo^dqb=#?h4}Rec%y+@fn9f<2NU?izrB=K{0y{+dY>TUr`s$rkq>^afBSNT zZ~=U4#J8*MYz?cce~D`8>N_u^!EvJ&sT9t4NOlDSkY^oAhOMfDF$o#<3hv?;m}jYW zeKG{qX!`zgNsAv36rP`7P>%Fded9mWVYLrkKTOgJ>=^vhG=`guHBC z1AyY^*#7IMDbLq%juI`XJb{jWcjw>6{ur9i^h?&AKbQqUJX%>UgQbcn+i8UbcBKp1 z0Uy64L$y&QfMFUwC1dg`hdYd+w|+g=rUo#GQ|$*cXebf+NJf?UX{Rrxz+|0%Td`|y zRek82Lh65h?h}U-TeEZLvvJh%v|~?>C%fGp68p(12zH{mrUebC$okxbz)2b8E`z$Q z%J9UR7QSkZA=0!w^8^&d$gi`B?KZ<6ia@}AUEFlsCW>qq)fzG9;xEfe^N@O4CFZ(Z zLrf~zjR>fNVw+kTk(VMuE)1FJ)@i&ydX%%V-B_IN_}V<($-ECMf?h2L^~)sf8T!EK z6@Hp~(e~~7-}}nQJRTdi7kja}+F3@-owHbnmB}-ghs0-@Rr$JF=XtGlBG{8cNjg&A zG+s^AbdrC`)^5-8&hA@kgOM5OVh;ywxByi@X1`6Lvr-qcEK@ZovxS|KGNerKRVpx?%J$z2e!P{y zOBkCVfpdg28^;7tl0tZeZDLiBWmhv)8sP*^7L2uEtz798$@RXPfY~F7@DP>(8 zT(ixLW6ON?N-gtq7q{Rxzx4H)+VXL3q%`wv*tKJ*Z(_abejaY>??LB-(;>XlDebu5 z*W(g5Eb@7M8Dryn6!&|XAoz9V4Kg+7Q*61yn%ACSBl&86IJIi9EpEcj`(hpTM@nte zy(UZ%SZLDbtscMTTr~t|`mzbvn1KX*0vk6R6y|t74)A}daTxvN1RVFw82fsv`rbzM zMm(IYw%Cc*3^sOh;XpwOk8)3(>d@<5Tayzq`S#gs`}?6jc5;aU354Wjyg!QBdD~}^hu0x9(2}%OOTvAggD1K3AB25uotFRGW_RMM@KpthXp3GyeK)JXK#M;on`d-zC-kaa|E3O!@;x$ z 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

sKAKTQ@UM zjcDm)#qa3l(zm~NMRvZY)x9lYqKdmX0Q|0~`4Yr+;O=5#wDW&qa!JemG)gh~_Ndzv zX1#h8@r9OYmv?YFA#JNlLdy1W$eE=5&r{a5-0F!mHAsY~ECT8)HIvgwmeMmRJl#-Q zFv_E(O%Q3p-ELaLo*BkHlQRj9mx^&1jRUy`jYA~w00YkgYIADz=)n2IzZ8zBFXJ~# zz2EmXIyj@`#z|CJjgabn{>lHgMsK4J92u^Ogf*qXp6EZ4viZB)zcV3s_OH^H!uE$1 z8r910UjEWNp^|0ylA{CoS3#_P=`S?`x7-11Dm%Uo3ob_aOINOb%uuv5?E<5;jLp5w z9-E0B=hc09D`YQiD3{Bt9jf0u_lIY4ZU5H)qM`m2wjb1M-L}WN;#+WZ8MTb?cW7z` z;`a2bu#H`i!)6PxB0=R8wQ%g{>!cnALlfe0A4-1-ujtVE1(~!ZcisKzIO%gOeXU|3 zT3#I|Easr+L>e3Au6 z*WrW|pNcRR`c`DWs?DjVQJeHxc%%YupiH?OeK$ZvB|>m}aw+6fEUMpYpvZvbC7)ow z^9e=q=_&-jpDV9=OttSjitJkUD-I~ga^RJjHpPV&k~*_>DL60fDdj+0RHKO|TEoy0 z4|UdonO1f_K&e^KAx-3~Y0(GwZ9^(HUEJo^ZJfftyYIMqM@CKI;BZm>q~)0t6<1Tw z>qA&gG1#i+IVs9w$d`Dee6g_U&F7`;W{Uhg270oD@#scX0Qp3d8PrZsNoG$TJ{ZQp;~OjV@Vk2UcjI2;AWK}f1k;1 zu`!%vsh|Wn5$Hc)f<*=FcTF25S^j_Uiut+4tNNo1J$^*}KX4`U;n`J!W=0OkK`F0A z;3DC{5_Ny@pSQ-SiEHaaIL;z?j5OtjxL(=GA1tnv`8RzpBjbD_n4=P;X1eKke8C6j z^7tw}xBFB!U(xOmiP!rjI-}S2tT9yyZ2%C}! z4P`78h3H|!-|+n&E&*SD%KO3zs192de3l2EO8p*~dULLUqy+>aKqwG{K?4cpHL#kh z-8Z2Yz8H*FK+%<&EWtkz*Lloiv}Ze*PyTTD+b}jnX6?gSGZPnoC}=52`H9X}pZk$M z3Id`n#>O2iVx4S-U4ydT5&|Bfug)F7D}iphLdvoVr#4GYLE>r-7a{3?=Mj?yD27vf z?%_l+BEGP{j54Nt9q6?9849NZ-t6CgQDavMcDE3pvdCB)7?Y2WGxlyLpscpWf?>7N z+vT4hD(&mE7@b&A34DtN~dGN~02 z&xzaf@-}hSF8umI`6cz|YgoLq=&6@#YN9oQRD4-pg{3#)Yn}3+fc0L&dWuJ{E$yrs zb5q^Jw_Km#{IEN3DYuhv1jKSW-}HC013a z=?lh8D?bIY>l_OfD$hMExHw~U?ow;$!Z55!xZWT9BNQhR1U|mMx;-wgV0b@hMF7ZL z66ma0-)A!x9jA|x`JC(^`P5%A0fa?^P_6KTR+xL6B}kiCAlvZRWNo46S@QUj0Y zK%3KcA4QZGDsCSZtJN*QGC6s{ta`ipPA(^dm)S>0;{{ln+U?yvJB`9@+;q<&7NdkC9$|w*Z}y`(_@fGOlJ{ zoW<$j)y(+QH$W*l+&b^j_TFIx^2nW%0rt?d=pzwJo{)xELag6A z(KbE&pRvCUwPl+yW9?92Ymm@Gc%nv^S+|(&VDb*vNG)-7m5FCF;Sf-pssNiP%iHCZ#6XOx)kqI!MTeRlk8tY zVdkMAS!(o?-2o(A>pu9E^rz4FN}sIeW>(AU1X=y4%(@nsY{T&|N6PDg%ead{GyF@$ ztdFq75y^=_`)Vn@a;yn5tmWYo0*t+)fFuRuj)-c(VgH9f^O?WxfSiFxy-x)G*+COa z{&=V9Z7JJ0Fo6W_jIFpiQS;~Az4+7G0spm-Hbetr!>Q3ILefIr>|Xax8zWYhDPbzu zP+$>?!Iq9Ldwb-s+{AZ=F~h))ts}}KD~SO>Ml+`rbDSK`ppxkVXnUsgC{Xp0laVBQ8hFZEXC5w zlZ?L-Yy=HP>F20QwBi%IoO@$!^K+ri46oWCIbNBa)S;4o4a%l7daqziWUrs!%3SKd zf#qv)If{k}(4clBU7Few@Ejq3-b&%I%V#8@Wr#g<@5re68&j*TD+mQc^c4?4G6;M1#5q8qCA129A@{8979VEvn5OSg(JXcWN~jf=5A!T-QIsaQgy`O;NE{^>>Ol z75>I3a`yMinos?^__5mxJ_+C2zzfKiAkjYX($9oV4Vh4i%6w?IQTLi4e*@V=JVxjv zkrAb(MXc`7;wSE^j<1WvB`hDu%rZ+I@j{ZK7{*$oM8nP1n#I~QlO)C4aa$u%qejQb zCti3iF&2g@c)+{(C-bU0Hp*1b4@@TS0#N?YqzQ$GX~?rd_BBv!*9-(JrMmdrZ2{GF zMI2sZ)1aq!$qA(qjL{@JD30}&OlogSne5cV4fV!|+B2pfH*UelTrViG#-yenEFgqv z7GSS5-WIiwzX+Cdo~ltL_LYf*Mg?%hO67YD8rzh62ianI#$0P-oGS>0GbSA9lap8+ zXYp^gT^MC=JeKhuUzeNSu;+?!j70ljf0Q&%St(8$8+)f}MP&1g)-y+{tIiWHlwN7? z{Wy0vxtmiB^(VO+=g0Oa{`2;)%)^F_Iu{#RWs2PQj8GfH9$iWPUrCIc#4=iDZjJa& z1&uK~4^>l5%cuQ7KSyZO{tXy-`VJMcj=Y_}PYn5-%mw0Z3VD6<^lErn6I_1C5dTTA zwC(|HByD_q`K%N{1l;1~{~HVY3=jFXraTwTGivN4W6f52VQel`zGD-}cHMi5B%}C1 z@bM`!z<;9^x;Z}3sX;xHpkt1#jrI$t4$0Uba!&Kt2GDFbO%ck4We%63?Ci{-9>+Wx z*PmgY{f4Mzz#sGtXg`ITpN-n4Zd@MQb#@J^HCmM%VW@iX0Tl7+ zYGSD_yWPN`B3hfsv7E35Bxul8f;sElWVPeoW_Na?Av#u{N2g3Y#Gy_Y_~;DPJA6OO zit>9TU%dE3!94e@WQo6i?h2UvV7h{nA5emnbb>=y6q2A50kdx$d>$BDjveJ6s>Ww>Bwk}7XTpujr& zqdQhgj$o?QMM|UmIY(c{owhx<7=}rYSpS8Tw*}Xrl6m4Ft@0?McbmceH|24IcvG`5 zxF;f6H{gY1SbOCc_`EDK^)HcuoL#gckJ}&)-7NFE-s^{Z1a2QkwSE!HagkDY?}INX z9fUr{rO8Ki;&fT(#I6EX8`7o?CIoc-{HA4;qNCzed2v>6SVZK5aYi0as2HkI+H699 znQ)e3R!pku0ajtJdD%@uIcsi>J>3CGg!0zF+HtUcI>gr={QGPJJ-+6LM7R3iE9wCuXfDW6z1SR z@nW+Uda7T}-3NVhvWaz-E&Sm?&s-gI6j}K?b>%XdhMl-?@z+ymWn3BBh7vN!qJdQ9 zNDddDlh&RxLDK3cm3{q&GHxdNF6p30bzVxS$*L%wRr7`Bv`;{;!vLze6abo!27MwT zjV{)aYL%ciPx3WIRP)eomorA_cF-B@D5_$$xhA8XKhrI&l9ex>y>mT<`VzZ%V{JUh z>2m`ZvC5q-`O3_+<|@rFqHT$ajK=cOO)f@VIogHW4Ao<$Xo^%4Y=d_&1L%YbBd0^? z;xhOoPY&T5uHud$6vX+-eSe9josRx$`l1n$$lfe@ zGe-9M<_rZbgYi^UrzmHbSxmAuA`!Za+p8YxRGi02Bw0}a>@(b5P>*jBW3P&(vFisV z{cpo>thj#!>uUy3C|e~kI&w1fG0FxI@SPz;cq(6h+oo0y);HXgc&}_KjHP(qvr+bK zy>f;E?>@rCl=B03gH+`&MJCY?a|5gZ#6;5FgE!0JG|AXeVAfe<=*Z^y_+#MqM86}4B>;FYLsFcEOV6L(yTs)`#%xERpU~_>+^N$NpaM;Ffs1nhPjWd z?+NW2qSCJt*Xc;QDyroV#?6bk@+4ittaAR7HHHX_Hkc*JVq5h6DH@+lR`cHW9F1ol z%zI5FHH!$z{!}FZJxXW{Fw?n_XXq65RR0o|cpPmkCa`Bt^ktH@#;o5@y<{(@b&Sb& zw0onu!RbX2jrppBJONf*M4YJ^*`wEzn{G+F|%zVH5*ib>aG_xPz!b$ouS^7BEZEP4vR$%#<+44N$ne#OTk`WDKzQ}nw zQkH|ff98Ef_4mr&!KqB}4tbv5Y2l{RGRqXjbdF<|or72{+Gj3{wNp%L?)l7-5s5O} zsg`O7Lm>J;)LIp3+r43*-5x@Ea!g%FfoyKYUnzuD2_Jd7~a zuy%@XtxG-}ua>|B(N-jm!iO`rAOuq+UE&uO=e>=NR8+H4;jxQ=DQ1rcq%8xpGG!No z8gWpVw+f`}oOU|x%@HP$&gYZ`)$G%54a9Fz!|kFV0!{SdmeZ+&s&;Mo30<)TFCMX7 zCQV8Xv~6|J*|xrCn|I>7?k*zB^z6Hz&#rn{JDT;8uwu#hpY>7ag^NiZ5S9;5ZgW-u z{+_hTvYt*sG6dMgvj_Na>a&z)6Xp`9NpnBpTb`KN`MF*58I+^0>T<=6F$~n?t8L>& z-N|5Jx^Kn>p||1LfLCsNI!CHvHdl$bi%9``YyQ!eF{6#$SRWj@i7Ddxg`zpAn|wcb z?2%qI$Z2rDRrW# zQ=%q+Y;ub`U58d8y6a8fr*P&$9GhG4b=*+S-w5vzH2vr^YB?XG( z+l?xTN5v2${WUPi*mep65^_272t-b9ZVq;|x1Ck{(NK*snWpu7wXxUNwOV7W^tSm- zRe_=))8;EA;WXBYmVUu2QP)|)+Ev#08Lour9_EQqzNj_BrSTw)-Sgv&c*iLQCp960 zL6%B9@t=;z{)iuw>-y5!r}t+b2Etiugee!(XeW+h0`|$qT}BfE-1u0?gkK;HvZTo{XA$LQCv9uq9v<1hjFWEu`|LBuOz_c=e)mB!51m$#K3v*?-A)q zjf=h}q?QrrGIBRjNs4jERlujklcL>FPD!w-p=6z-D(+QRIhNt}9b3i$#zHnN6>*rO zA<~$eEG_Z|1G^<_VPaZ(2gNGOjI=)SDldGz5bQ){gDY#ztQCf*eM~{aUv$V*OUgdy zisrNVGZ;TkAO(a?<_iU&y${`1hR06Z`pZsVp~vPE#>S?}uM{^4-**XTsTQTv#lPEO z4zBmc+BsZob=J$Fi0L;M7x!KY!v!9mWbnA|sFPc(?lj@FMxk0HG+E<@0go6)P%gq! z(IC-=f{JT5_&aWCSw=RQ4V5xxhX?hASYyG!>7l15lNagnx^t#50w33R zlvDyySeRBG)rUjiHtE)O1X%%=#j-e_$HIxO=g3qIbYRvS;%GUuqA!VC>0@5FD(eXP zo-oB(AEQ+xaL#bzuH4!Y@@nM-;;{5V+gELL4cUc6oKc68hn5>= z2328Hxi+a#D5z#V>SUSavsPB@0An);yG^1nKW)xs%j!f8hi?*`dqVGgj@;0p7_;Wo z7W+b%6K~OzeIsN@NW0D=(=&3L(?nwNmM51X&XY%RT?cR}3*F6b$sii|X~TmGU&)i_ zM4##2p*}y>cC4^4qntTyGBk0gsUZ~*1D(X!w=gn)D6q|Yoi8t(CupA>tqIWWbNK1O z`cTg-&9Ep8R0tMjSP3W*wO{VVU*r5mX90ri#k+Xg4){;;ZECUb0Omh?|d{94}PZN z%T z={1*U#9g0iv@S;#j49nJ@Aj+|T_`Jh#H6BNtsz! zf|37ZtPcyuMJY_1)QIFy@>{*;fqOVrf~9y;OA%lHYJe4Q0y87R_v|P+!r+c5t&}I; zw3b8WjFF~a03D0Ed8WFoeybCgo6Jif>AEf1+()g*pDqtelGI_qgZ-aZg*eB*$z#7$ z(=~~)-GuC_u0T#2XF^B+A$i+L!8ZDUr+ijw3uRiwM&-f@z66=d?Nkv`JfBV?h}|;y zh0epmw98D&Zxl(|fz{q3Z96^TG3~$h{$dt&gT!aF6JD_-z5pg>M$pOy_rr*>#|(ho$$@zU2um6{Lj6 z^tNT=`jjhJj<);1(zb#=1sdoY-U>=@2YTG$7VyQy?nl7=z#P;Vxau)|8yF1GhXs;6 z-c;1TmdsGo(n&-gY^C!z8#p+6%{6+Fg;=XhXv}yq7zk>!HRV2F9C|*#bPAV zM|K=M-u`X$eFCtwH!A_!`P_sz)_J)0&BwddAgo5$PrE}!I#d?rNGsHRGGGlBvttBR zF!0QCssU?N+Y*kQa-)DE_l~|m?k;iGMTV{)M@#%0wxk0>t{f#Ym16i}*)C#C4b`yE>=Xu8=P@w{}2ET zy#m~ryo#hn&Ad-?$=uvJzb(C|M!DV9C|owEyg}Fk|5vC6=>SJ6@8?nl#Sf*$wx|G6 zGi-hsDuv}?6>VkmF2pZ4NA0L(M-u%)-vw%;uO0*!3Pf+Ku&arbf1@Us=R+%5 zOhJLKk5oj+en;qi|39f=OI3TGP3YqyRiKK#s=2)Z&xldZ2hvHZ(opG5AKp+xM_!{t-zscpIkq!loQJH7NO63!4=^Lt@{ z%Wp`PAH4d!K%^UvNG1ejAL@ET>F>ziU_=kCRT&_WW4{sLs?5!iDi$(2qQ=cLs_Mbq z%%kPUm(3g}qyq+w`_o@rp%YL7Ssw_U<%pV9PJ~0nD)cQ<( z2)O2BhKCdyaap`b%nl>{_SpmIHd17|+BWQJHr#zG`h@>5!$# zBn>6DjQBCr$HNR4--K@Q!^4`?_xUN_`awz*k#7^XuUy49)_W^_K6Nhtt_{UF@~d>= zvLrOwk(JdBw$_U~ON|)$&hZr zx?lUjymCEpe@!4LL?S;-K|)q_5Hpzj&)r|S5oG5t;K}{&sCOO!$z0;eMJ$J5?LO0@_cgM*F%&(eqdJ^##tHVyBn+@GL@W9-yqF{xC<-}kH?^X zvGG*jNiY#_Cm-V!8vLYWqY=>d8kyR-A+xa*1v>^7jq-TeC4f)K_SokU*~`?Fffaek1g_t zlsa|LhLK=^!%Z$Ju6fX~For#N+TIp#5jP*YK;h`XFV{VF{!j#O4EQhFHbXQ#;Joea zDp09Ks%Nv?EYrr>u-|R!4R+GT=QCv0A9>`C2=q<}-5rm9M-``;=fW{R+>joR3q7d>IlB_b~0Hvs`yb=9cq#UBt;AK9ryM;cIE-TpU$Wcei8z zqIO(n_vN%-)wNeyZF3PE5RH4tB&?}nT-+FK7}8Z=evotBPm^D!8Q@f2Urm0+7UkSu zBi`LC9~W_2824j-$Tjls!{{E4J(|g}(N3kg?yVbluNE1KS?);c;JxJA>wc*9E_cAs zGqP zFlL0EDdPL6^Z4JEUhq#wP`CfyO;}=V1rvx%Cm}mwBJLrX0VuMAO+N&)t0y}DAkrS} za)}i*c0U%wp*$O&CkR$z>V6^-Zy}iPlWRuV9X06fWbCuehAaVFuGN;<5m@}5v^Uez zo}^Cj9#eH1pmz5=JZ?YNQQU3v(`O@U#QbE`ti$Uiix59{vIMuz?NGYH(8r|oAX(T( zkx4;hDh=V`BU|!ucZp)qy`nam21{t{GtA<424udKm7MQ7vg&yWZ6J_`BYj8xap>fO zY^W9LRykrd^#Z{9!$mBWDkT_R9RSF*P=v=~u+tT(Oqfiptoj8*IxyQTjm9`ps7!yy zENQ9XOoSOh)W-5bj!ELuPU>I!(2rK7$l^nggmvZtN?A{rjarm6>h9jpW1G-ljgjA2 z(=GYjo_jtAn}t(JsX972L&Mj4>;gvZ&3OpXF5T>-XMEo9v+@ntT<)Jkr>TZRknxP6 zZSycRgttAx2m(++kMql)Oa)kcG!5S@1r2r3&Qd%u*`RPjG= zG=!f}vYsfz5$lQbSlQg1-~;ONXkz3iyYcegy`FNJqmj#4{eU%n9ARIxUK|nJNW_C2iaRweJzEbEkhpU-X%&cqvgW>b|fLU*_ zW>0(me)RPX%I<72fqbxGU|5a%?`rWIr>|}Xo=&0pj6x6brl7?9AST{~sFPHUGCi4saxLFZ(Ye}P6ZjSHIjGV~+Kh<^T%>!;^b&_#sHJWz!OOobomfAEh z6QQPwWpBiq7_+^T%=T&_4nwYy0(^e=)MW}_Rh_#3TwC8TCN%8%MohTqz?j+M_gqG1(RWPtaz|FGHr^6kGysbzuOv-s?@>z?`nsi;5B7<$8Tf+434TZ;D2_iY=~-g6--qLyp*eRZ{vZ zYQ9TwZ&w+k#N4FlyH`cET5kH%J0SPp-H1QB4hTko=|E z;xpZHZg0Ln+#NELrA;I+;ASG)bJ7NcDeSemvuxWn2j@bgrfz4N+3#-v4qiX!zCO!v z_HN&y8z0$_doxYTBabdx#b_{9YnYOO0&d?Y7deW}7J5PQORw1gn|=A!)8Ml{L8>%kznoc_B*6UdlnK&1s#>C7xtZ_%LBQ6+wz* zfn2-B*?%`1$~m5$XYv67;9}k3ROpuF4Pmhid+vX@nxrm|9k)=~BHYYsQJj1wnLpd1 zTt)A&=BZ(IICGHniyL3PFxar}M*r~LEl^aLBM)yc^B^OWd;Oyrel!q|DJk;2__a=` zJHyD;>ho!j?`hI!x4j{TdDPeq>!95@;O8u^5=5!H6jUQz^>OXqKr9AEH-S2uVzrXRY9R$|MCq=1N_NDS)+~^nS zY6{C|$pSj%%L+mkE?)7UPd?N4bKKUMNF0;}OxVILJ#0I3S9*!RE{RTT-N58qbNRpO zys}Oq{9XlyALcF?m|OwKV~)G=Ds?Z4zM8#oo*i|SR-TOAyqTH^>(O1mUg~1rHwpQv zvzKOE?1B;WHhym&^fHa5SSY|>7{cx5+3VgBy@vl4+)X^V&DHL5YFfSclDfK^O%=}nvb^EYN4h;?b zazzSKlH4nH7mBBTP=v-C|G)J%`W^B*_DuYR9WWwaTgYg~`b(9-hn2g7@QeL@sIul_Tglw$JN?nUFa*!5 zj#D9_2Nm0<;POt60_k16T4Z*=L8<39&t}-hDZ^Zj`pTGW~!Li zw~~;1B+Vc$jNE=lWH|lZE1N&0BD3Nn_$M)yVNM_QMLi4kk(&ci+K!I@)ig09YDQ<_ z^ZZQ8=;M%_rqqS!aA`8^Y6I~vT)D*_o1gDLn8rmPi`6@87KnUct1?q@fzV}9^Y116 zCU*TkLh%#@qG>ixG{7O5$81>wNqUz24T#i#-)VdMw5whpOk0(E9v8LhM0En-GIu90 zEJ9Jx*E0E(I1|ITydq9pKw_?A%NJQG!v4|SFH-#kdo~VpRS7A(?LaYSBY2XF5WlJ_ zGUw%3MO5)lSgwzgB*GDL=P^Il!fno|OPvN=i|0j8!l5mHz$m!1Ll%*?N;|xXONn== zUvZ|5eA=+^fJboZwy~|oE(hqKjTcY&*SUCX>KE`jVFCpxUjvU7a0+CsVjsVz+xI>t z-un6dhsPHe9q}0nsSIMn@%8efmCvSaig5L-s~S$Uxj$B(YCY|L{jZ-RE9wjVG1lrhdbHLljR&am?I%+@^XU{yLo#<% zY7`!yj32H8kt(5|(F8dS!S8klfso7>~stWaE?J)VmQ1vV^_ zu`|g%stgI9a5aROqCVY#@4~Wa)W2|bI>!=YS;*wqUES@PjQHnYu?*sNW;()S0?;&2 zyC4))3>VkeJ5H3q;L2^jpcV@6^Rxw7KRp96e=mU+G>4f-eG)b)sb4s&DVTh1#3R4X zIQ<;k)$>`Sl$_*F)r=)Wg*gw1`D5(Yvi!Ve>pH~;;-4T{j3@}JV8+%7ZoX^p;` z6QTp4J!g@p^>Qe_5ES)=5+SXl(*e*Kn#^|ex7!GMR!(BI%*>4-aM^kToWdZ0erfoT z)RI_6s6L;IMyAR90OH zW5iGB&M%{3jLc2_?lR27lX&vlU=qVXxXcyC*GHt`VU#GNWw1qd&HRm)kbjrQ%-@4T5I3rwtYRv$_BEQvWwcBMPkY1O;5e) zu}yPynH&(0rkTgMX23RZTMbEZ5$mOmIH50XS;L*BnyHzQWpaLByZ4c9(IOmwD~UeYaq#7u|Qo7l>(S5e!F9qwE+}^;8~}J^Vmj9 z0{r)8S-%v~GbL<0#S?HR!AIwEeA*m-y^?L#{jcF^RYidVby&}KPo(iAAlyK=BQJ?X z8C)wHPcHfIFK=Gkvycnnny*-^dG5WFq`6qp+blUP-Tti|;83k@c{9yjnGJu1KX^s) z)O}MGYxiI?!BMN3S3!W!YvnihT9IZSP~-_(pfA%){|%owlMIOP_3>Hktn2^f9NIJ^ zh6E5wX3YYlo;^eMdY_j^8bDBn3=$7rgRwf(&@R)8@Fo5Y2~nE&Q_na0Fex6)a?bVW=!ymje9q zGzmH7>rdn^IA`FCPlSKJJ24T;{Z;=#(;6->sG=fAWsaQzY@`gYRhAk-uA$UNY9!&* ztl~g1zKXmFZuo*S?Pb3E{%W@Pc~da@LH$04%Df%kMh&oTs_Z_yE#iP5-2d*bm)8HX z(?``*X4j&|@Bq(K>kYy+6VgbH`U~poGI7TZ>@&@*YGi9PwP0i-IIY^{s}+%pcUA4W z8|?F`UHU%o#x~~nKXaPG%l*Hij_Y@e3(*kAu||lpgVjO9666qy3HJlE{J03G5Qxad zK9Td0Gq_f4PbL%=%48*E;%9!gqr{=WerEeMV=KX4s2YlcGX=v%t{4&v&9kzNms#U5 zGCE(VI()r*cudZGu79)7P8Gc9S~z0V481=&>b%HF_B-6P?`rWnc&?#WE0T)BqWPBc zzc0|chyFolSc$n+^|+18qxAAGNL0k>f#2{=Jz~wv&K=;rDN^EO-O3E zqqSV^eZ`HraMJ1-BIuTxp=*bql&&<=8>_=}FAFA9Bh@`hD|ea|YEZ&9?^nf+f`bux z3in=0tUjSut~FvcDi4(MFJ(ZU+P!YHZMJuDjD%c&tF{ZwhmQ@R!rEd)&)$ENkILu4 zIhmQ?2zA6Z(z-JpsQXe0Yk!$QI;&1mhaDE7h%!9GLiAofi&F`QxUdb2@#O>~bkJ(WX4x|p!eB3y!)+Vh zKAR5il>~7Co|3;g-BmJZ1=26%;LVnWN-LZ$!hb;L9MFe;-!2C=JT7U z+<>0F0AZ1lSySw*QnbhheaK=nDivXkNN7d}TVkW%UTBBxC1+%96K`zzs3#|zZPvCB z($Bz8hwVMIzRLg1I4dpW`aJ3e(K;yDaIHH;oV%X`C@G&`K~E&C#fGYyhwN@`17uA_ zAfhEF)jCjl&&I~LEELCOaJ`dT|Aa;CltQ5Lx1QC+RhLQ;+e-^CTA3{9QHbV) zY_58OpH`BscoN|WCwxcpiBS6|s4V|wK+Xo^MZV9z9Sv~5`DH@&J03!w-=iWUc`oWj z+=$eETBqyAf6(IH{zN^G3cy#!$ojk+7HMl0x7Hi>nN}L{thF8YhABoDL=>l(wPp}w z@_tmFcj(Fd*k=D25G(>3^(LjyQH`^jrhwB{XPvk~ry~CH@8pJ#?B{iko=KSdY@yn> zJAMX*Z@=gJquQ_FiYMj$`brF{}^ZpRv?VQ%!kd?4kEe@%3l!N^|p=Nq3H+oELcK9vy zm!V$norkoPffv8xuqf0jJ3>n8wyWXI6_he}p-ciAX-K^=eOF_aTV!;gu#MKnT*iHdd|EKsKomuu~&S1{NF{eEP4|2;#ViRDCOoa^KA+fBM|EWjKX z@W80$wbRSCVJx(Xo}J*8)g_J^Saz4p@89%22^)!uwC!s{G`bREX*Kk6!u4ppkN(^Q zzw5*&Wh<0&JQFdEfjNWTd!v+maHkWfC?y5;{VPwUamuHVz_X#Z9CRla1W;4wgLM=m zjXv9DJ)g3bC;q@+7w0fEC^&1%xzU&C6KMJFxOd=yEs&sk|MJve!#}j1{&pE36?ru9 z5NJDFoqNbFViYu$>?#Ztedof&40tjit~?(;BY~FQb1Uk^{xH21uMdr4Z*VkydH)hV0E8A3V@e{>q3PUg@7D8iK95U)S((O;KKgD3* zCOyJyy4wANG{7{|u+SnWp3S=;)jJO@_`JTo8;|IQ`R-b`DU zNkX@`IxAF%Xz&THrM+27O3KU0O|C0s6ZYIpvZ56uYbBg3%-R*Co6t)C!Lu7RVmE&Z z7Yl9S^BL_S3)Xp65QrKpW2TXKrjta*V?!dW_=Nlx(t%Bhmqw>21(f1fIhC19e>N; zQ)WH)t>DaIubEc7P4Dc;$hiC+$SW8a5F8mv%a^>mvHj|=p2uZZs#tu5@t`M>g&7+j zKp4|eotKJAQ(j+Vd5;0ndG1?gKWC*GdY*uD8edFsYdUkKcD zNcuO0h~+6H`Kgs*sfpl|QF^8we~9uW=Kbu)UGtnZj(CMoJ_icRJ>vL{9@vO50|W5m zg6A~Nyssxa z(0X<{-yCv1sB#Ia1B49<17A@dT1p0Y%~>1#vfoG_Zq%wm(b&REjT+)fl^%Z6)4K0Y zb0>SknGv+Hy6EnQaSCZ?Av++KpAuJgH2C~2VF>R=XQKcktwcx9O63Oq_N+hnZ-BXaP+g$P5T$~FT>7avn z=&S@G>AhZsL$h2pIni2@!^duhviY=x`cs*nTjJ49bdYKZfieIOcy;eBfU)zlXAjkh zim>1nqwbR~*|%w-bPgcr3#`ug1K$LF^2zI@?gH>r?7)T~1X4X83U%kdcc&Mm%bs6l zk(Wa0sl!?z`TwJg{|z_(&kOW!siHXui{xnX<0zusA%&tn;Eahp2h$bjz68l4b?NMIQAXw!*QueA>eWij}lh zP^+4A<&uvcZJ|F-eSxO2b!ibn$CIwg$M?5z^CW~#xo{n+-$H@ZDn1i)cZ5j}%!!i8 z_@fgOEYUt18{VpnrIF=gM@rk@GD|iWc-RC~kUa7QoO>$~OW%gQ6EfLPF<2`0{1!b) z`r>KAPQ&)`pz3l>{-km6cFBw=aj;loE7!gX*kE1?Hr~MX;P<$F-?%;7QK~oo8N&|} zt-~>?M4=L}wBA(1by`nWU#w34;c7J3?=s=Q1y+j8h?AXmOvN3t(b8p4C6Bz;A`*A4SSa|Gp;FVfvTxv}+FHA0x}&6%1iP9 zrf|-%6;Wp;8Y@wts(&{`XAbzLRzbLbZAYbp~P#wFIS_a>w zFxi+rij-f6dDa)xRoQ~HXZgJYQUow^w!O%?gOW{%@grYGuv_*+m>g!NGQ`;nlCdY4 z4zk?GjjN3k#7g>r(?1NF|Iy;{wkc&1*CyNFO!%W-877ogXTySjMZuKjuy@TK*yjmF zUB^EGR#&~s$1G@d==jx6k6cmQtvI}9=sXfLGe4~K|bXSfJ{|E0mwG6e&p=^DDd$C z`uco-3G{^~(l4sG zY}&VbhW654y@mI1%$?{c6WJb)kaH;>hV_Ltc-7cggtu6Hm{nE#1S@?)p4Yno`#l%t zX=0!M{w43e-RQ#cjH>1fpSMOFM{Hqq$Y*yrU(@1=o5{@}qos#7FI9xIT)&KYpH2vA z>;}#G*PhKkhARm0MX67l4~@N9xahTJy@*zMcw7XBQsk!7Tt2;|9WtNX=P;ZD8|?lW zvs5?jMlFnWxOMYzH)uQeqY>SAr~oIM5MR6}^CPGfmQLKg4N(!-FNnxhasv0np@6p^ zy-!I>>TBKN6Jbdm@#(^NwdkR{C zn%sSlivy^$0B%w2{nzRz5YW;&rMzhqIKM47ezVyLr82TE`o&MeMBZMw)RV5D5J_xi-@! zY?{(9Hh&AuGVP_s}#P!2uMuA)tW*e&Sk=c=8kh58d}P*Mv>yMJS&qw6Rgoz>(?;DDh< z7pIN@8@A*zjs7gf`?AoC@TRGrsX~&3eXsckpPR6i#6T%ebk(u<{!w5qinf4j<0C`G z+L`vMt)mb0n9y3sP9eAWk3WGNoegw$ewM*?T5y)dxjfm1s@U>@igpHKH3sJ?$@=Uu zzWhhTGo}S#9lpd*At;~4!A81(S;SwG*z^1E5WIaxQ}32pVQ z+@&mKzk(H~-wGs>uEtEv%|6&MQNe>$Am;oLsRay)g-uNz}G`Es=8Qw!X#vN>()pQ zHxM9?Wp8EmTZOz4NX>0TU!c+@es!zkgZu5=O)qdt@yo(Os|oi9@jF9ll5?NiL5>%l z{2PR4&;6L@1A-0(c@Bb;CP^!W@J;)AKh@lkS6(=dblT31X2PCyQdOb{faq8>t{T8R zN~-+-#3KLKZ=h}*Sh;VM`*i*EJ$S6L7d!^?#oep70m=Vf74CSfHgZpehJRl-+Wt{% zdFI&YZXH&6Efs-*3p*Toy zB31r1-gVGPDzVMh=5bCJO5ro7FGOFuq3Zl#Wqn2e75i%WTG%)i5%I)Cz+!Y=uW#qO z5LV@LNzzqqvJa*A0e*ftp8srs&7Mt4dPyty9zrHz zm;cBby|Pt15iWn=B+W_9-A7hre%@!06m%iHI{&;9^o3}|U5xu-jQC{OT0>JC^bgpiWm1mTSUo=d{@={TcJ_xu9_BdO0)Sxu9Chpu6H2S1Um0 zu%vMqt~M$4aO2qT_}Iy3xmO{isB-NqL-B$&n?GS|P9$D05&aZZSS*m#RRagN&JIhuqstCWXU>^4S&RSKI9&dIW z=1Tb8TvP8N?oWe$rkZa|6gI&M&1EZfk;aPod?PeWYdTzpdmUeZKJVLWbYp7DqK?`g z5aSWf6TT+=ZF)F4n-%a^%OuT)we?tpu=OZz=RyvZz~0=bSc?Ryy_?}dIobZ(^&dN0 zgBHTHN-^x^2Dk+3e}~p$TRDhhyRtfUS=3~JI}hl4>*yxm-4}W0gG10@iuD5=IG z&j4wpV5D`oXHAiEIkbiy2GcnhNtv$IR3a3MGIv?*cM&%2W~c0?m(nsiYKq=uigK|O zixDBtd+wmLBZdw_K}!s82WXRU+0!84CnUftb3|RO9|^+MLtOwI=SY0C8@!(T;R4|G zsTkI=La);x>?t@gP_X}M5A?-$1p4)bp`+RhgF~#e_=!EW32Uvwys>t~j<6HQH$@Y) z=O`<&_*%3q@q|Sx>5T3y#;`PB?R#$c3*WN>I7LFrk}^E-cLxM{=j_dYi;Nrp>Bz?j zX9iGKc!Y?!#&A&dr%H?OH`lw>!O7xnL-kU-ZhyGn6O0Pk>-iTu-#0qOn&tk(*tnj&3 zkv#w}?N3WD5Y1_}eR)2mRX^ziF#iD~am0ts|qNSv`cn2L{hBSa!i7GV2Ay_Hf-BxUA08RyD65JAf#DQ)So+&Pih#dzgq;cxRRYtHNM$SSnQTfZk~FN=SZy8}dAEQg;%ZQ` z?Qxaqg+%UDBf+$s&yVB&rTLp~Qo~oxB|}`tmyWm^u`{?Kjl}^oEgkv{-W~`Am&; zhxc_s(=PDGPs&|7KFWkaY^#6ulxLa`<&P=btg^NZ?E*m;AOCq7>seH)ub9C(1c;tjDCNw+ z8nG8gCoTOuh4LKCxU@eNyI`1Kv?uVouV8pUdrI|+dkC6EG<5g#H;v-7_^Pz)KPg=$ z>`4K=1w`3;qV>|Shm|((K-Bq~%#8d0zpMGb!ju1RpCfpR8?NB@QibfCz$`c;U%nQU?ux~B;E68A0Nw>b3VyYbp1t{3nE%h(r%{ko zeaG^uqUJ(TZ`hhu2D&Qok@IZ1ZpkmKQ3`xCeASm4k(zbv`tf(d!A7C_4#;zX(Bz0e zGea=3v?aprcB$urQggP{Y09OB@pAbXK6cQjt9iA+k(56QmFtwLQf#`=Xg%{(&nekt zt&0DVe)Yt?O>@L#gGMzQUc~X{BevaaOuv(Se=r{7LR`6Xa{rCtWw=87^WECPj#2d^ z8%=PQkuh$;y16LA`GnS?EiyE_^J8_rrZ{Fd6JvFP8f|m6;MhRdAsD6R!cFuCp0AkD zwwu=3i>mByQ8EHIhj~*VY=N^Uur^B$ktdOU zSA&?i_%z_!JX24?_Rfa;t_SCQTvFi?IaFf(qsKg{n2M4;>v1nHp+Ogm71lXCx{T*8 zl~!1yN1_su;dpT2+Qq5kuoPCFeb1FP+&QEBatM3FcasQf_~rfO5onplZqEFqLUO97 zX=?ZM97VeDz%xU@**CoVz_~1iAh&>Q{rN~XH7sl|9H#%>>Re@W5s_0Pu>oobDMr4^ zCf6;zIEl6&2KeOn%>CRZ?XrW>QZ_-1LA1WP#}`aUP>SCsHcRY3+_(?N7v^ zR{Ml&*kA=4!trw zOFPm?bT|H4RwusEu2Ozpin#F_)R|~49EMSOSH&*pjH{cdXwPz*+R!)T1oX_*B1xA<%a`qm8s6;6pZ!X* zpSIuV`hx!LXYG4846=g1aj^77-s6sUk#aD)jgJrDC&K4o=?n75)n{a_mwhwC+9au} zM0>Lv2ce(+K~xWbFUc;ZQ?Tc&UB+o=RL+a*YaLMw0uR48m|0rJPtk~KUJV3hazTMU zKee`b9T#A2#x8gV0&@dHGt~#Gqd)}SQrb*n@|xxb;yzX%xjz;f49fins%oS+cqGs_B1V#)=ZsF9Bt|NxQ$ZgL1FxipZ zx41YTzdV>?Iv6!@7#4iJ{Axiytpvgn0|nhUWH_crj$UoU&QAh19WmXHnUsR7kG}&d zT^_#S-~f0`_DKo?JF*NC36D|4D{0VP$$k-CS#G@P@Xo#fd0lWBfTAuK*>eoW1%I~_ z`#e%JYpy2**smHP4#m;MDB{uIxrm<{_P6Mi!=$bd`EW0W$4Or>RRH8G?{#q+)fd<3 zy0w#ExQ-Xc#nKIJf89u7Q|ltABZfAAd>J#;DZ|qv@%I<272H4LTi3*AKJ`o`3J44R z$cA{(z+U0m*G&E{sp3+#znH5&N`;Kbp)9`Gur)FZA5r^-WnIc)nK`O5Dc%I!`7EyL zBU+MjtMXP4DS?8gtRvDOFmx<=Y%)d1n;i}VSJyw6VaT5(Uc&$Zn~ zU`Cks_iKUS^3p!rfZ4mW1zF}lI(XUEQOvxE5lCY*Htq3ZO@4Lz)c(14cihGL=gXWT zU=E1_+1AxnKW1^ZT!%aPs-=rBqpWSs;bB0~FHSSxoSUB=A^P%-9=|QVGJR<8V9MKw z07T!(&8ZFS4#{>a5;5eDR!B7A;pgfWr7OALx^#03Kem0Y|H%9~qUZy;8Ma`OFFNro zi}yVX9?m2&nufUe7X5uVuZ2ig1d7wcEqdbaq1KvWN}E3UrLDgg|8>9T=smuYNytUm z+xx9#8#&9Y?dH{Hk6Z7(vw<9BGe7Z$fsp&5t{%_>ZH{@u^xQSpu@N^SJ6$WOsLw%n zU2-bde5&|8e!){f)0^E|4|+yVbw8%WtKpQHVpfZK4I+JwKVyy)3XXo&_MbDei(T@F`_s4OE)NIC zXI>{;EcFJfJ~$Po)$NGxCE;MCpe7HBs*29O=$DCC*} z3Tz9en0TXIda|XfXeDj?&s!ak!CKn;?7o8{ZhrUb<#f~d*cX@HMI`O*3d6sdMK zk4}b;r5AIgL-N)zQaBF`L_@!M!x7sP2bb;4Tlv0_7FTe_#nVy)Nr@ciTe%&}zjqq* z1!~ySREp%zg@jh})DJo83W{^da5d~eMR8qv&Ol|Gf(VL$*}j=yL>9HCudJw zL3c6&rg7V~F?HYtuPnE3Pj&>mx|Ve=T9+%4QD6f3ek2V5o_)A4OFSsdL}nMR?B4^` zwa>81J24M5>b-pS6RLrDAlO!Qf*=I5unVj|c zJcMtxB$gg7QKUIP{`YtVBi7;Q5y!JYH@2hw>dQ8jGW_mmDw8lnX_0;D=qj1HOw|B$%wC7A*Dg?(mAi)6I+)r^Y`-%~aK6L(S|eFfLqqBMPXUE^6t#GoVIFRq zE1+%gg$+j#L*KkNtcV=hDBygcuguKaHKk7(BzJs%P zKV2YeV``)(jYCwhG%m||Jy9q$)XdM2UjM6SmHBDAqH?#$_}|pqH7)D0E%ee4yaZv3 zz~j^^f`jt3dwqk)BcDWf0h|+q?cn429-k1CiI<g&41=Pb&>hN%FQl4 zEX-cltfrmXvz=z__op6AT9fYe!Y?gjRZc#ki8%(sl*5Hg!t?M^w@E^t=Xdkz`mBz+ zVgq0Bbz9G|F8^Mo6+iJ9gmk4M4ULq_sO1EJW1DR4G*)7Ow2Qk`E)yq+v|%RqE{wo)RzLD-aFB> zHl4w8mhQd!7>Eo61E`XLsEyc0>w}+=-*h~pyD^s##gq`PQ?<3oNCsi6R@F^3JAIpS zhMr*5VH2&UPpWrN=qVCo`(T|El{`%!dsUCf;@&-a=1IQ-#uo#?h@S6i}`4GJTL zL==8Vg8!Mw_z0Z7b*Ez)3^X2?IAj3%Ljw&ju7qv@<9IhZFR7VivweQj+l8OeUIptJ zL9EX@3L07AOZ~(NCfE~Viy>bW4r4wqVc8m_bD28uWu7hg*d*G;a9;~aiHpOa0K+Lk z=U)ec`>dpui#cfIvB(}c;nCL83rF^-08y;CA2_enaMbU#Pvj?^{P zT{ow*sT)5k2q#x&Z79w1>!0w(I1A?Qv$#7XXE8+S=OE1;4xrF47`%s3OX9T{=tUTr?liUYReX@=`dZ=l7yS z2kDT@!#n4vmu!v}<)R0C{IB&uqM2ya^AL|;oqfJ%Zbrv`_}p#EE~MXqBo`w`?qZdy zRbu&~0Fb=ZUdfbuQ)kJ899roM^o?vGMG-Pwojj{jF%5RRi5!|*#<`d?-P<$pjvV6X~;^COM1}!4{>AofD zkuOGet40t~zc@r=|tj*jc$ORq$1jYuJ6 zG{WP~Cbb~g*Lwjuur%90Qh_V*Jf#r~|E z!i`|90H$wVuGeef6So-xsKpn$H>SU@a~JL;$o6Qh?W-JJU&X$GS1tGEyc^Lp;*u_R zd6$DZWN{T&QEjNE7kK4@Wdo*ZBBJJOP62A*{m{uvc}8(JQmKFnn{-OW8it1vS6Ooq zFop`9VEYuoD)I%sMf)~?^z2u?+w?VKusQ!S5O#6HBh|2ZaG&u2AKi1dm%U$6yc%fq zf(>`Pm}M!S)qtAVU2|FmV*krxufD16mMD`!t|b3=k?VgWPIg|i#P3}S%5LI%!}lbm z5)ia(4yqb!udpEHKQ#@L^Wkw9$KKV}`UF*-aX|dgQ|)9Fc!|9(;n(SIhaL4L#7av! zN#Z3Mi_LQ*HHC9$T6wgY@lDE8=4|N4$?~6_*Np)T($YQ~{T4O4 zSzha@aNp`1)uMDcm09KNw+dtL&QG7d&!B*Fl;{|eYCuJdTYxw(yRDr90hL1Jlt-yg z?|W+sxCxstIXT--?3T%|Z_GhVU2pE&|4@AUZgWL(Q06>a@ele~K+`tbfXUe7!C666 z4D}Oemp1;q)oBs$tQ;MoZHX(h2`@gM>Yx;OV~FF9rPBU=c1E1mW5W7AK_lg4NLRU9 z6FVE?sXeQxAm!x$;mC9t^xKoR*mqqvdnM${Yx#(zb2e6STB`y4wV}J2=0B@G<2Sp4 zOT;<%EL~^Bu)i^q9IIxcq8`4Ba~6S+oa5ha)+l5y9W*=b>h*QR{f@yyhxgEX0d(34a1;XF@Zv^Bg3EvG=G`@stQ1EFjVfKUbJ}(Gn|H(XGv%7u)@JT=?Y;kW>gm}Ab z?!=qV6`ak`R}awqK$Dd{q*w};s+{Ph!CPht{bI(!e&+qRHPB;|4UKsEW!Q)GBKnnO zV{I8iss=5kH&|G$LdTeQf{6i;^#=ymi7kY=p67tEUQca7vRT*jLi!f%m+i)XAD44< z{K?EnzjZ>D@PYZ#vgdBI`DJNbh1Fke%11HWg{zR+8C-YR_@hLG`EHf@;ck8 zXYgabOaFeXlJQGmRAFI>&9HjPe>TCw#eUK*5uu!3$Bf6KY8dh#DEY9ekW+6nylW#6 z5;VmTPnlQK@^4YD4U*@t)2GADS;*SuE?H_>Un0ADg_ab6lN#O!(&^{#Umv>Kq8WRB z?7pv|VC83x|){xr7H45L`S_6nH?Ir-Rb?50jk?s}D=#K?;=V1qwxUK9E>7fG*L zX_X)FtS4b)5Fd@S1y#|nmz1vj&3fEpAMGo7u#BAQXs#c(UghaSPNHQCx^xvDU8){W zv|4+Q28PiZFr0DeRC~_QsB%Q8AHm0|=vkAE9Rp&SL|dBd`=MLry5|HJHZk0kb(iNF z9Sx#HmGzZwp*EA|(;?2{sJEjLS0dNNFWpjZ4IpYvG!(Q<-%hm_TLeqqh_@!5pUV^yHwX()8* zDFZa!=0@elO&>4hc{BNb-!F$ea&ZeeOzrYS^10n3=`o*&2JlXO?5sczZ%~fzxM`f! z(PD;;hsN?>8zwVYF=nWEcthorzyUJul+esz-LQT-N{o(x;pm9JQxSOFMu;Sc=c;sC zv2U(0C-U7%`BY1o5ax$@wKwA>co|WluHNxiw=|Y<;^GBa^MNr+)?>|oz!lrya=}5a zs?a}Y#B&`gC$znNl|kiJM|Tl`)h*~32dtwsfXfqd!{c=qDyPB+Ja($)z9x`Qe;YKu z{Q=9Yn_Ee3@AKA*Qb0CPHJ{(~6A7D77SA))!PDjqj|0UR|0O*yjFs_zlpNCsBt;FghyJ&IStuephQ0%{hhYW zGTOzM+uaHQa8woqt38dv=gKiB1NNX<+HW(&|Q;B9Q+G|cl@+G$QI zgzRJqsi{K~pOQ>G>K1q9B&95yu+4rdi&0e(v!Agbep$v#JgF>~utcVp3{MUqx3QI} zh%FD$$Zmq?P^jS*&0^$ZQYm^o%pP9ZoSzB?#V(YNtCY`9D{4)BbGgs9S2Y_5CHtfv zL3bTd!`@P}D3zFT_%%oi=N+M{yA|m_w~LZvCoo1}>uOxkf`Nga26T zjP+AW+qoOrYoW$sRx?}8g$bz!SYX}quNz4>z&{kjiaL~&^#6+`=f9zq{|IWyJ;Pc4 z2k3^?b=9CSNopWfJ^puq(uau6l$n2mi4zFB5EKtE+pH8-#pCYxOJl86jxf8+JCC7w z(Pw&deQN0|!J85IcUx<_M*hb~gmAU&Af@Y3YS~T44GXEpPTW&^`CB>sUbegs^GYRW zIAKyM;r;Zlun#2R<(L7+qDGbijhPy&CB?lV8J$Xx1!QjevC1<%mxU9+Ns5ijp7a!~ z2!8pVkCS2Qf5bBpNkwL>Bb;S>%1PLx&C{P~Y*omPO+@r8Rrv3~Zc+>a?`dj}gTd0) zJ*~HN^4*;q?g_xAe11)b5E(5mt6vQfc{PZircA*|kA(^H8dWz?kQczz9GZw0;*v*W zT%8RJp8E+RbuV4=ec44@{ie&H$6ns{HWb|$g0Cehk&!XTi|cEF{S5|EjWjtfLF&xb*cRGaY$Xhhl@797xaho+~sh0Kc z4EEPNm@a=9N5TR;e|ZDZb&pZd@_c&Z2ewJ)cn}D)jG73>eNtNz7JZEsV(Bs}R8@@k z3w>ev{e9x8M53{bnU)fkE5cJvFP<1}Tj!xXXGX zoue3Pr~=b5Dk>`I_^51DJ&l7tBv9;x1IKwV3gkB)C!5K{e{yJh=7SQkF0znc^YoAH z;MI+d;f8@hQ`qyFAxicas`Z{%OBpq!F>TKsnbDu~UQpvt%4JSx@%C>tITu=uEQq4< zQ|52Hycr25I);gbW4;BD@&5s?v^fqH?iZYVE6Spg3M<2RIbjgpX`1|m+Y_Am$!75V z*F_Sv$uE4074Osxao>L_V{{feXeFMKe=Zj5Oy)Dyd-0lyV%5|;xk#=ZqwVnH05*=r zKnJ->_4^gY<*@$oBt-J8Bc!k=IJoD9OAZ??YEMNHZu=xQsR}xhmY&iX>BCk|FpeQk z5>U|&vv76p4XFlQxnZHl(`S1q#SnQ5xgK+KQefP+%%oX7^gcudkx4*Edj(VD;@X0Q z;&$1KTBhd-0n&dw%iU^=2GvRVoKu$S!hbzr8|d*0(Up&nSS2Sa<|+#M zav5mRW>(pN@?fS>6z}asTjwWlNyBZoiOSz7MeLhawSrEhRZG^c7ab{Df43pCP{=@LA%i>CUp8`E8S9LvC!f^o39%=D!73y`9U@Gvt#v9}nP zI4os^tgqHnS%1ctltTWTWKQiv_6lAmzH`m|i}J`k(L91=wum$8>k<+fg+tu+7&`e< zzL{<%VCysU0~fc2alJ>jMz8#mD8d~QrHaexZ?*EBdg!~FQAU*c)AbpQQfY->(7(BiHCSac_&n7T*y;Oyn)bs8j2 z-DHFNUlfUt=V#+)oE^?fEj4|Ia#sqzb76A*#cOR9-rH!#?w!Ib{1djQ)uC9&M}Wv+ zxB0?xArd=(9QwgGHmsEY8Hr==H~3dV$#izzR~F5e4UtcIdM^Bfvg?tw+rM@1os(DK zkDZ7Ux;QgIvfql&my zXUs>yZojFIsDbCiHZ5+=+da+oLl2gPa@m6Rc$;`OX6g*H+Ofoy&>QB9^9m-Be*p!& zCoLq4r#`P>0`NNhs~^v`rH*i5U{mbFpG=gdJ@Cn%OI4$nRdlf^H0|@q(W(IG0X_I8 z?y1iJ@Nt^Ns-+SBzTgskhHu6hy-yq7{83e?ruV+2O>`_%q$n7=W!q}_%yoPr=^|Mc znR1KVb;&5C4zYx0BVK=0h4x%3dxmQOs-L0!=P_JYRl^i2val@xOVE|0}Q= zM%AaB+-DKSz0$bPW4W2_bRzb8*PJ7>ZEyf_(}LlDY`+#XYwY`ck zOL+Fl-7Z7Zb$*3k69D~z@xf;g^Sahvc2?0RNM1gaB@tdk6Kv2uvp4H!bN~I9T6x!p zlR_n@J{zg-9jpN?grxJPfz)>53*D<^HG}TLZ)J3{Tj(@7Q|Gu|`GX2YVubXwnX}CZ zM9yOut#!2T4yOC6U*|@3>Dve_WztY_loKb}PpUrhkYI9WU@brx$d+;PI_D~bO5Mul z;n?%ylY{QQO__oF*4=hzudQ!lGxuwK0fC2`Y}o<+=|cJP27SB44Z*eyAv_83I54g1 zff>_wn$=RFz*wp9V+K8_coksikhy!0T*(?HLgIW+nP^_-DIEfktv;~b~ za~~m@%}RP)0dr)gETxmD=#-QU87dCzBQsTA)_Z!QA2%cWTVwa^;hvwb+;0HUL%Kl9d;THN~^`HV?skeCmmqjErs9F!3jMnEXi4L@s2?8$a{jIV^zK#r4R<_~Q%M;xy< z-yjQWb^XC^236nX6Sx}I=GhcBefVL`mDln!TT1;~ILx#8Q-WMT^PA+NNjsHfnKWb9b6n+E zn_^;}c@vknjE%^Nf51_!_QNJUJ=v8gW$%f}N@|$p0*v)?f%jVB;g9Sg&XSmctnkgx zv<>G`&Z9Y_DVVqUzg4jD!;SFaUVuXLD@EbCOwSt^azVE&2+p!R#drU%mn^mXnI3l2 zcqMjCBBu*mXOPBmy9U;gN7uVuK%!(nRX|^&;#*4+<^xeeDw4C>%g!zyc~A~=4T7!* zdqTJ?(jhs z?>>{(H_%C%xyAr7cA|ikg!E=ux1Q2GfjRFO{uPwZ{UKUJWc1xx5)BLXq{ndrKy_|r zT2ZLiY|%S>rmM{kmD~&Cnn& z?g@*ayh=^Y%K@bUNwqCf8X(q zcYqhnt{HHB%=$O?9YXPkLW=3X+kXUt5U2Or^B>d#Nh?8tI6poF6ui%~9I_Q zlXgwkeLNm;=mxG{6XrE%_s_t`#`SH4;Q8KHq#zV5Yv2e^4LDBn*M7I0CX9`j z`KQ1rG&XkB%K_184Z>L9NhoIG5>Knvx#l?#gL0Q>S9SQe74h zWk0(~$kHg)@LiN?LVCJ(_j-#QJkkL^`B%g|vlAfBCR@*#t75tO>Qn~5XPFb<1`Ue^hBX-WGmA8bK(@-^yT$s-HF8< z^K5IW;({$pQUoS^dCqgwSW3XTT>PA1Q&Q>}cBodrxY9jZjo!Txq^ zg*TF6l0`9V6Y!6pQ2#4sK1}e8Xzs)^OyGeRd=TM&Qusg2jR#T}%9@!QX7EE_;paWuN7I9~O1%lIE&T(jl23(5if z{Jy!(w}G@7PikCi2JVz2b=`dTt=R9kn~+P&(L`+bZ>suyH^ZsXU-*6wk=+MdawjiL zYdc?v*kq_`CG{V}%riH+M|A*Mm`%bK7}fMjZ>~{Ay`UYkx?D=tK}#@EXDkrb&LdgA z&w+H;F-0Xe0ufo;?9mG(6>Xv54_;`%YbiA*pDmQfLQIkS6|-cXqvVukoOnCys!*__ zVr|c^@37nx$8U)=K zI~Rki!ID3AgEsaP_# zvd(2#fJ8DF7tPLEw+?Y6OE2%p>h#SRr_*a-`Fs*;g2WCv_2%}jU5#HT1GCSo-vdR8 z;Y>$tA5`^Z6W~Azh>wGB8E#4+zYH`y_`J1czAfkDm!;og14#f*W(}_BGv6McpjT$A zmp*_HxDI#NCCPDD%2{S5g`iVDeys7p*ODOV1R6{kx`IYihkw}}hw0Nu-Xxe8)Xlvi z{j{(6NR1@aAHRc|^g7Owl6bu~PoxB^THh-fnJL1JpgEe0)rUPOAWtzR4|BpT4{VP_ zG{q?+Ma7EXG5}X!U)A$f%4y08`A_XB6#UoIa|y8bAhqb?!zyu~Oe)c zB$-oh8Sy#3x05v^HqHegVH|eHUMjkzen`ZXaQ?zt6IDo}MXQkgk&~aTdz;*<*7Z^W z*TLq-bcuY%kzLmf%1(~|X=8g|PB2p?UcF#SdQsC42(inEiphhf>S*Od+k@N8&$0$1 zv72evQE`$vGq~T$>ZdE1RMupKzwl#%FI+!aUOlC zRer)^LuiX1>e&eTZ6)=kUw$Kxi39xEwX}b|afdC=Px@CL0|>>X&K&N_RtnxW_xF z_LDrt^r!eHk`TXH!tuiUlIFSA;VT_MP|66$yIb8%TVG^8!=li`3NsjV0cGl>=1ZRr1WeYD^MNX%jP7%Jci{TxnzNFseQ2}w1XU7K2@%OI+9}jOp#PEF@{RcYU~Ka>XHk^r94Zp=n=k3zko5Jh zABpJE-yNBab_a~h&j)G-ZP=Q(48v@?Z>q@a>UIMDZQ0Vaxj@N+;;T-YH1>Udg=vVt<%H_1Cfeu_N(9E&XA^ zjs(rE?a9(bEbFeykVgwDoMJZ@a7aoByStgn8yiY5+-(derRf8JwQDSYw9>GHOfH@3 z?mpw%Vlj+9al??WbZ)UVx2AR)}pXE{|f42x)#UDqwW%Xh&o-!H;@^~z^)N5geE1M zn?Xq0VXmNDW07ORcieq{C7uDAgbD`j}Rns+cge~K?XJDyuxSTnC-vRW|L6Z&hx zK)CimhNA`N#!<$g^svE6l86(q0zWt3d*{rqx0z2pOofgk70cv)8zcXb9;zS9(#DV@ z(UT6s_Icdln^Vqfo!&P}x+kj}HrF*Si<;0nGNJ2Fu(QqBZ)0xc7FNOe?nlQLoX$_Y z=~2k`NX&ng83nB5;?H_M8slHF9})f3@$AA~C)R*9UvgNh_j6a^Y5MDt@~oEp7b<_U zjto<4SlxYM5k?WcDe7ER0Yknl8q^f3b*c5ME7pY8s$72a#!7bn2CDJkjc-PWyy2RWQ#ckn|^X}XJLqt5b_EpSk6uI$?@nfhRO1Z5%Mcxz-m<0 zt2DrVp@Zkwi=B#`Ow*1Ajw1}P(=$N^W` zsU>*NUN)i@I*wjQe{ha5GwlVU<}_;;x{~Q;$_VNfY!ocEH1kP-^RM}u=Xu@;+0mC( zb^^0+2|vUiDA&+&>_*?0Yqt1IlQ?W?7{Ap7lrd1U#zwUiXo}t;slJPIxI(Ks-RjY_6|hG%nB^yI09~wsyEVj!4U4 z&(J64Qoj>U9?Gj>DVm(mrFKm4$-gKD!RQc;Q24&aDUkqTsAbLZ!G3pB<>b^p;qabz z>D_ddBPq@w_aFF!h=S^mEPbQX>IAtCpP+H#K!0M4kQ1##phIETv+mBAr#zO^GPUwr ze}08%=lLSLh3YF;{G3d2 zaWLX&9XTN!Xf8y4lTCB~o-HHvrmnEo>oa45s`L_`hN3Ih#lkPA{zI@z-K$6|%ouf&Dgk?MoQKkCk;O=8;Dy9r$E)o_ zZp2zp4ju*Ka?y-m<^B)Bf>SS9|G4~1;6gf;_h?=p8Dg7O&(2aO?#=;@QB#}Sz>UOo zFW`XnU!g2N*a}3Tg=4vqIQ`j57UM#LC>5#tW(i9?Ejd$>>~aQ6KTTv*RCkFyVLK+{ zeh18;X{O4mw8l(8F~&Cfx`kbE*(=OFq24Sf#c>0a?3Oo{7zX@`(O=Lzs_0?7W(Iz~P@T7RB9u`(= z**gtLzMGtve_3ysvdCFf_%=C7sbFO5d!`9=N!kIMo?7u>Lom6CN7To zy_{fCO}!?yhrK4KN#*gYp&D_lWTKR(UnZZOAc2g2{>5K%{Hm9+7f-*v+#HT03E2*0 zOG6V{qun--p9TvT7wZZGd#M|7)UVShbEKd58j&_>_@3ydA8x=4=oN+6XF>fUBI zPY6`_nFC{E@t2w0|5DS;ZqB;qLh)?_u`0MsNGk%eg;<3v*ad_Rwo3XewJO?x?K4ZQexpt3F<4yxl7E$Y%@+x;IA^uVql@-`y$v+sLW&Ne@t<0X(FGAMufPCIos% zm(Y0+)H%~s4_~`826c~CRHlxPo-tGPD4Ws6&y5KOw^9jHX5yS!zWM90w9Jkncn!Fm zfDxic(|vrUM1arw+S#~#_q_vo2-_a7jG{bq*}@0w%k?P(Y+W6V9|~`F@z}d+*TS=H zEUXxV&t9-V5a{wY9+8NpF_IK#w-+Rhp>P3^^io zVvs4NO@uUF+EoeH;h?RBgrOd*z~h}inCj`J0;#WD{9sj(!zXq ziB~kygm1G(e3!DJ_;&*z%o#c6;h*<2f0~(LEAiT3HwFOOxBb42Uu1R9qt-1@JdHum z`KAxf9C`(zP3%9uHgEN}>#0`j?y#q&6X_FPi=>V^ZDj-2z)Y^d>QC5J(aFY&OF{Cw z3c-Cbe1@OovVF|U?}5dqhoaWDgYD~0Tu?NQjyo*N7!M$r`C6=D%w@f=NTPz>kfP}Tt@Sr>*0Jv>ZR1<@ z(Y(&e7q7G7xDJCO*r_P9Txz;vo+#=)W=^|dzyJ zoG{xIF`gNoF`pbOr!u&8#zrzJ1eMU?slSvAJs{)ZeejV$&6{0u&%fC{_?IAK6 z43QF!=g@tbcT*T{FekoN>ahtuXlbf=!l#H80Hn%-h93Xb(dhR|&{fe;d}>)-VxuYV z#@`gxEp<9!7*Lv@F|3+t(U#oD!jc_eyfD?xm#-wEBzvjVARTQkV5`pH9^#5GF0Zy9SupcR1!|w$0>t z-uHU~JNuqSkjJ!<;hp8G`NZnXc__!X(W~qKX1Z*GK0d+Zmo$9`O$$)S))VOk)F;SY zlt|9Yt_+8oG=ZKfK8d2PX2w|R5{RGDWhop1mgMu4YmZOXi~!>-b(#k# zYn-dhpwVm|dn?hJt_P$pj?`bW&NmCN&E?>f870Dsdya8X5qQr5VSA@e-OFQ@tNU~+ z2KnyJ?m3J3_Hc3D{>+o)vZ`c#nY;C|BUc>%3!rgB0`zJt27|(ix12kXu|!LMv(Dx5 zp2qcS5|!*BkK69Ib?h9-G=1koiGX0=a%0_Z6L*V$UMCmb+;ge7#1q9To+`~|Pv2I6 zQO|(GhMSGEtqaTfx86B$+o9i{-TNK0c z;~EdlINLt5juw+4s#n;!qWHyD)?<#DhghC#oegc8OgBE<0eS0979EOnNBQK@#dB+) zV%vVDPr#!Rt50@T4*dmoD~sw=@I$DAJIdW!9hW2zLw3}gIWg#Xz;c!=C(2z=vZ-i- z&fNj`7()Jy?QkS>nIQ*UOX1{wqio3b`TwEpt-{*+n`q&-6ev(!TD(xa#VIbuiaSM$ zyF*Lx5GYP@cZVXy-QC^YHF$s!0t7kvf4AScIPXoak|#Uav*$OnX00`??(h{E*#?2* z>2Cc^)ZDGXO1+w*B{H))fIp99St_B&ZMN^;ulT*|5^jATW~_6*)Qipa_W#m9D&(%9 zil=g!l&ZE|+A!ot4r8Y07RChOb+q_pjoil-f!|RG_a(~=2=W*JMvX#CaK$8$1^(Tk zjN*zJBlST;<}QNXp~DEX#sm=Ty3?ayxz>Vom4xW;!Mv+R=Sm$18kAzIl&QS7yg_tf6Lv8^>iuH^cz;|7!@%nV z?JR=QHf4F{;tMmASKt#nv?vw6_NDBaF-~HdI8K$cei$=NE%=hrrQGy*Nl@0&I&i1j z{;B^-9sOl-GnwKoYMir$3MX*gOW7Ax*?R0eOQKbUkn}I2^J2YlqGiTPm?d=#D zN!TayUgtuS1AxJcb-`%A?WttD47oe4Fco#i!1-IK6E)iswnFs9@j-OIu)nc zA#1zbnSX;k;~Q{S)+FMgOd1)!Igx?43H)Z-r-_;a0fPBNWSoA63H7Y)#lJJ>zTV9S zLVSP1ksKgaDzQmj3*N}o=1+P8&!T{C)hxe@p|dDo}!v8n>)@fdTnpL7`;n3f zOZ#@SCFNE@e6L%gOdQ^oVK?DG{9S5fg@}xgDM@n)*3da=w@|Jm+S=r{kIazadOaI>dVyibs@!UpHof-VFO^utmx0IvucW)AcdH`v7-6}TZ80!A@@ZhIoo4q zhd3bYhfqJf{o*P+tqyFJV(+pq*mzm$1W3;o8sJ@D*==(_gXoUzHX2zPJVY8HJdq59 zUMH^Uqw&#q!RD>ZjV^7N4HrHjk=qFPsh(tMByK+0lw^VP8$?3~(E`TSy%ztrcPgf_RDZatdr&cbTVi@n z*>HvW=1cBmhzNz!wP5LKNEcvRs+?60n{wQDsbIo9PW9>dRKXx!QzF&cLICZ%x^{FL zSjJFoW~+VzrS$jt@ybpSlZ`DT{+M^b=#Sz@eCM@#JsEQ@+?%j}s3<_ob z0RSH*8rUL@#w83+y#^6ZAw^%DJkWQ$(hmqEa5_k$`P5!M^!f=$!ASLqj>a=_9g!xOSHvGQU>TS4W z?o33aWC&>UM_c-`UIOqbm_UfRjJ(y zKS8k~Ae^mnw@XamPgZt-{(T`--lNbO6SXbL*(0oi(oCh9`sp{6N`NYFh9t;F?`hQm zuw3E9skVC;{Q$8~OMs4I-gr?&y2YZm_C?pZ6=smfmLCDiYw&=vaZV8A118VclI64NcYDUhgHzS66IO+@fj9+`ci+Z? zW4g+y)JdH#Rtz)ZuRfuabbB@&BrC3<6@N|&%@;C?w91G-Yt^ZVutqG*%*;W|DS9Xn zx#t5PvIS6wzy3qoPcD8yqmxM6>ilRmo$;af*ULN&Wh9*hK4c+k2x!Dtd5!p z9~7R5zD?@Sjv2_J3JA@qe+$o%`IK5s`8N`T8C-_twj_WYmD-?WXw`*3F&(>Q-Vk+s z^{sGoEQ%)m;s2~xB3Ckjjrf4Me>kcX*O4S)rJo%jDjX4V92~i5ta!Ft$Z6>Z&MBBk>~K(x zEzXF1b|K3C%C{E;tFI73iesrktl!L;RYdmKErjd41BZ<6`$CYwO6Ail;1#uRpE^B; zoeRb*^Ef%7D=@C_>1^4gA7yPRmN%rk}Wh0EHNL+>~2!WT!%x+3#7LFG5HvcvY z;Bix#Kh_KB=ndo;4qGmX|FdED^v~29p;~?~KOtz>_H6O>z4?o)8JVYfgsxC+@YG?J zbP4w6V-!HLC^yZVOq4I_`U@Rn?aME%&fbtEKezcE1&j7+I!5nqGy{8Nfu!a9XW7fhDL>gW+JV@6aWy@e%`zhZ?Xzs|YHe)z9i_n5hn z5bYjuK}H+CesnM%|8+K*xQ{HpS6)t+`~mnCmbFf8zSwoykP~{DX<-#TJ25_<7a`Gf zP(wDti68kjInI^wQ(#!I*x@egDXAXL@ZwU~d-w5(QNdTuw(xsYw%tnrgA!6!>614! zbC985d~yEt+84k*fkQ3j10^=33aa;Svm1Re`}NH)gF1)CQ9Cov{bm+w03yn3;UG2d zaW#+e&_~d5#$%~S$o+2Z^!yA-S481|r(?6BFoSUp1t( zlABK(jh)B|TV=;3FH)Fw!Bcd%!uOw=mOA^1HhCUzW9|=!i~3pNa`THJUi6x0HH`VRkjQS4QxMtL`$WPU%1IpqLZ~f}k>{|X(&iJn z3Q2`}?*{3Xrhie@G-_`~LRyVQYwx~^WMG*_d0ge1F^n&EcFz@Ah9fNU$3c#P00Tec zFMkm3M@zzHr(z5_!Q(qm>FM4J^`QbR02#G?lh7hBc`mBiUe0HZS){_Qbqb zh3%mkr&0ek(f7zoELWPlL{E))dcZqVtD@xKJG2!ZUWtXEP(2$K`93FNwV)D+Dd44P;+=FB`mJX|Zg)cPpl#gT+U6sh$X*%~ zq(mxD1}|YEQvuLBeQsJ4UKJY(-VKoW@J7c-8IZ0RSD9gS9=Qm-*b7bl zusL@|o`$_8&5<^te2)M1o8^J#Tt9l7XcUo}(mFqRheUW*R%zP<@p^Ba8EKQ;&MpDL zZa)|(NOAs!i7Fzl&lhW>GX7X&XFZZVtl9&sCtm;{Y`#^Um?RwL?D6!Ot=0;%zzc-Z zo1N$`*@V3_JU)^Nn+w#gOIW5f+xf%1;ZN%Q z8NzE%n|V7qkO%5$?ZWJ%;E*tvOx;%G>W7Kv-bwF3BrJQGi=?$2g|=rw*O6dULVYU9 zbcQZck)@6FEkTw@JK&CfxCkOfPG}ct%83w`0OYwKU_@XHu#t znLiA7DUyf=HjCDUUS{hvSu?|Rk0MjkrS3V}tO`^xh;x=r*>CzS9OH+Vyke~`UMq3@ zQrtTFG;yzS-A-43;88jbVn9VT#{40bghAg6zg2q30Z);)iNuyiAR0HCBZW^N18Y9Q zJ+H6Pj=Mp*=rii2y=D$>6E{Z$RPnEVHoFFiFciH9hXaJ&s6D&9FxGmM0&1J?E~F23BM11?#2G8r--!Y~l_u6nz_<+M zM}WL^D+kPSl?HB^9G#>ys`PvXuwfZP(jc5rfiJ}9mXg6+_wf4#yLQ~kQ=wL2?X@H5 zmsKPi40OiUI6W?Ma@T@;uS8wf2y-nIC}RbXPr7)B+9AL7vWDbJTtoJab>%n70g~tO zjF(IbfizDh6a`J+gn78HvkUXn8GdaZ^N5>TUx3jDT*zGt9DBX;EIW1^X+Xpm=4@Yc z4l@oqGFexjxU!s$?)N>jkZa#k2dBs@p%3k-BNLXJ8&0nZ0?WA6J15@4VL*g;XXH8U zxyj;K2o)%9lukoA4d{?fzmgwY{8?j1H_i9t_f>V>L{^9U`Nqx(g})LOz(|IRZ5$i9 z_={!lGq;e?p%i^uQvy1l?%x(IdS31C?rKS0TN=!#3wjIoA?is8x3Jt0lPprDCLg}W zCRQ&(aPS{hQIAu_DmHzT`Ey1Zfz%c{n)O>+jhr%E`1vJ8TPt7je0!M%Ue_YT@8KBvB|p; zoqz7JtEig$aB@lLW}<3v^6U*F{;rp^vJF;Q&A5H7C)nwev`TS|kwmXFFs{4>x_>VD z`bK!RB*KiQ^`~K}9W+a{$o!;HVEflvrd7}A3fJPv-e)k)i(ZXdx3>4o+92@D<)g6w{sz&v{PrrHnpT>M7)3o9XLZRMhk?1w8LQSG4!Z;kG(CFcT z8adV;=$%yK;?zyl236j*!dS`*Yk*WcHYB zzo2;D*z0Jl>YIxOx;HAWaED7+#DLx}iVPa=4vdOzA=aC%W+=?pI^D&&D1I|(bqr~S zdFXgKZfj51${0+Oru_Yy=Zx3jWz#bJi>eq~nxLO14u!3SSEZDy&pw z7{st!j>mZpt}~C24lE%QGy!u&KaL~*VLc{NhunP0irNCTv%#2$fI}JRgzh(7>(e%ryc^+4_|Xe6 zdWutx#KzaGqhL>+N_)~Rt+WS!nki7s{ zjx{E6u!=e?I74rk3KJIp7^n9ru^dGQ#dyyA{nYNdOaM6GY_!B`>rkMed69madc&em%M_Ulu6$dl>1lkpqTF0mR|Rc=B6Ky2|EN6hg=4}>omXW}1)G{cfF z{d*^g=nV)IE~1)ex#FyBda^i>u`$?2-!jYzm+w54PyJK;5@-$~nQX2!G~c;9)6?e_ zDD}K$F1!@Ix{YTzJEgEU`D;Vk3cCL2?sVTH;~Ryftr~e#S|C@L<~ccR?82N(f)F0( zGetFIHDN2)6eML*gsOXQbGRGFEc&xzLz%j7M+I}R0#q~dRETmwjM%^p&#PQ3r10O^ z1xbN@I%ek*xbA!!wAXt)B!dSj|e%9F(Ua zRbnfr0bLt4eD*J3*~!~M>}n@QI_Hvdm_fK|Mu*nC8$~=*o)jesWwI;+?dgoV2i}Sf zdZm*pD3inIh%R-tw2YP&fy$^&f~CMkf&w2ebq0&_SEalv#*|tGya8iL3bVGL$UlX$ z35f_>K|TTePYLBF*Y;W5Et69TuRcYdCohY&XxeGzLCZvg%41qivM~M~a??;+r)e>* z#L>`V9@ST5qis^-39V4HyJO^wz(o&Yy3Z z_hKNQzntTh<;v@8;f2Bud!+F9-yXBUI&d_|vHf+-!d+uaZ@t6quA!JFyApVU@MKJ7 z&ZYN1mRa;QVm^Cnl9*nxRe&1R$6Md3)4DQAQ`?*z(|u=>2#_W*2mX+*)+%oQr&uCE zL{dS*%0B(c&Qx{jJM;I@S|k}w&H9_WcfprMI-m5`Ly1UmMTF$MN*pG|mpP|bnWb_6 z4)R$5+b|m=C&9qX-rnnD?Id2ce^uv+xn!pknC<1)q_)GDQ{UIwF$_I!^{p<}l@at_ zPgBq|mOOH|PcIMZRbAxMzl8|=n>Zt;EcTqh3b%5JR&dScqUl@X-0Pgw$JS-sCi&O& z)R&{Q?^CQ|B8ZZ(lebP^K*YwGyM8NbwiO1z_#U?s^R78n4~wOkC!72Ysmlphh=?`6 zgK-|$@S}P+nnF8B6Y0Dp*<*z5C+zbu{a*v#BRvpn)Z~oZ0+95Ms@{fR-d{k%TX8Al zhsdws&``lQ0rhQ7<}++4-$gpR`7glPo>`%xIOq1rJj(7JCkb{X<1H9m5C5;QI^X{WCS~}w!eQf`(`}J{;N1$3rOXOqckG2 z1xFq1d}H5vJ&L@JZ2)wXVSMZ}I9{b`oeLu};V$>(7yp!@U_@*so&MnJI|$Nd@qNh( z_Nou)`k7JX=jM;B{YxZ45$F8lb|2o3<8dIOSNfWSL=6evZis_#O1){LiV< zIH?Ks_Qk>)8r)8@jPZ9fxafJ9;xr`$>(?k4$O}11q|0b`4#-ThTu7M#{{K{@OP}%U_xNmU%aw zP)r)grgU{zmK-fCYQx<$ZwlZ2kv_1G*9>YYu^-jX0DU-({3ro-;?Mo-T!v!G#-mzD z0ho$ZIzJIYv7W3iow7jaEH=1*Gi(js7e#dREk;Ifz!!@hlM%k}cn8aY_KZPJkdwl% z{Og~$Ip@ddTnyBb<1kZ+=gEHXo8bOXV$%??FnEi@A1K3VP~bgR#L#1{$XM1E)Q=kP zW*I!Ij5ouaJ%ZfX*`?pJzH$?P(VKdxWdB;9_GD{;_oQ%tEF0^M&HWxB?tdEW*0lxp z_6IV2{7BXHs9H zG~%)O1{Rxeh*16N3-!zb@R2NK-A?N*BF`>CTF!N^!C<;kJlfMO7@uzTt0=c39Iz_wI#j#B_d1egsg5tm3YqkdcGJHGj!-Y$< z0Sapq>`XXBA#l{a8DL&$=)s7zp*>B5Q9_+*K$x4_9|K7B7`|JPUh##DrwN%f-nemWFUqA{Wc6wJ-=)L0v3}lwR#q>@djL-(j^^n+&m~U#AVm?D%*NnY*z937?lA{ z4j3~0RNF}BV)GtRA>b^A1Uo&$>!848jhnjVq17AimsAi9Y#G$4as=wxGiYUX_vw)3ce%-YJ23jk^`- zUnE~*252Y{BG=|M?p8)Awz_@i%yrPQ>Ts!(HMrsG9zMyFhTU2y>v2E-9jBv?OcC4%GGE814d*^0K~IWr7Tw=0(!4R&)k36zHojv==%|G~$=&}s z{3_O>{10hko7a1~ED8>eA24ct>8&D3|LuSFhU`#)xjsn#rW0!iuCqG@z2n4b!dxX9 z$s1w0thv(1i<8G8UK__h&L2sj_-iV6vC87hr0Lhw$|SJoFpU{B&{kc!!K=Ixtu3hV z4>*}v3XYdM4%-uy*8ahcvB;XQv zGv8^IY-$%_HkVyldVb|gY#dk8`#Jg91vGqV`RS3bolqKzf#3YOO%^!1Yld%)vX?vm zV>O_CV9^Wu{A&ofSO5;xgdNbO{1fJhmKp~m1OWI z#!AoT;V}v#(Ye`64SZ}}4J3aSYCNhJiYHE1easkVz))x)K=Qr!ux;zNNh9SBHzsiK@hw;t=s2C0?f94^Yw&O{{{7hhbh%;|KzA{f4@Tzx zdcI}5qiOW0bRN6#(`sub*&!7szE7V{rRN;G6`1QcBu5pH>2)sc_Xo*`=H?+P8S1+? zgkKIaDsB%@ZvuUGX@RJa4Aacd8QTc=Te{5Ro^{#^&lsMTMfND<9+3G-z@ zs4{TPk(=^{Ei-7)4j1VkV4QliZhxAP=6Na16uW5LmF1}rzEJBE=H1ZHBpUv{wl>FH_-F7iZh6wW z<6AX2sYgB>?ZNZpH;k8-E&2t+LGqag`=3EuZVOO@IqPsUh3*1uB{8%ZJG!u+G$w6o z0i(@DD16Q54E09qvwn0&*Z>wRGGX-5{h+ACBWD!%28%lxljiHWSq6j~0;shECk9~n z-aS%t|2fApGI#Du2Q93giA>nJrk#%`!_Y`NCM zyUW)dqWf=s!-0V@vVr5Ba&rWsYJcF^Zo{VLLT+3oWse;w%q?@L!@+}|k8-{4K-UON zZ5h4s-^-5C-CgI{{?hK3{mf6=N@+Nn9D$8aU&5`1oql{b=1}(B-QG1j5=pe_zEV3tn5ysVB(e$rP1hiJQ3(d7i_Y z*mQeu>i>Sp5=$b{F$&Lt!i-TUgt|BR2&Q@|YWf%07Qdh*S^~p;Pn4R*l&+8ZE6(C^ z9XQ%qnEgUu9m&d@PuNy9yg>~KWwN{aZuGnYK_YnWMxab29O!Z7bXmXa|1BUR>`%GT zLQE~&l#4N#WPm&4q0=$s<*@Wn!or==P5qRWCHU)!>}O$-NYOzMxBGgp;qVj)gkLLh zkk{R{k_kWO8n)rzxmno+Uncus(}iFKaZl)_sH7bUA5ScLZv(QC?SWOcd6+%A-RRIu z35wsmO-*fmuITgi6o`h&$TNrd1I$B@e9?QH0eJqPr?BV~KP05%_E8KuUazjT8UJdo z_fnjXo=O8{D%adVg%TtWQXgh~cb}tb*1vHhvaxO#X#c6bJFes5@wG2^u3WQ9uP)o{ zsZ9fF$K{z5vdQ~cYy>pHhr1qdkCg;le*#p^$-GHXvID+%dM-R&pL*^akheIy76WdU za0e3Dxtk7+e#az=bz&dYRmzi75#O}k1Z+-!W^^487`|nF{G~0B!Bs#XV#;j8!I&tq zPKm{e2BL8vY!?5B7hBKyc3H02=>WMF0y`O?>>8y{_@PU|%y`dPbehU#6~dEWgWT2xOkfQZD3al|+1VE+eLBJ-78 zBX`K7xoBZ?|Cf~)!$-FPRu1^%6npWcdQ0dBhhpt0Q|(Et%Nm8W0@`F zSKZ$*)eA1qyoPr6nXe)_UZ3e#WJ0r1A^-p_BK}X`IjBRb7>xKGqI{-;+ue8nJJ&LS zG4NU6iy$$ib5!*6T2Xsj+k*`#P*x%DZ8)3XzDeAJ!&EBiS}W0c`6sMQ`li@)I|MFF~r6yvnwG zrhA?qawhvO<}LKT0S(Ku#s7h&ax64PvszOGHezhm#gq>3)CjTyBvf$Kz5+Yx{!0E; zcXPgvJD>AObv1&Y8$@<%nCU6koAuXW0vRs00W}jmuN{p6y$5LBEHW?rbqS+|c~C z5ueYGCHxrIqBx?!UQ@{e$aj`D2f~R!Y3De6!!l2EBJ2jZzUdHtj;8$|d1jBOp>87= zzI~gBu9T=7w0|Rt8(Y}TuZI%lntobrDJdGX&}ICkt(?Qli@NqVyH%R(J(Laprx9Gq zY+C`QWu{e8GHI`Zn#?cp*^Q?cI&MJr5q+*s&)TK=?If?uVq2&v56C?9hRF}EB(6-H ztV*94n@M(<--Tk>8OFR*5dz4itn@WrmdMVVCUjFsWS?U7Y&TBd@xjQPJawXcG&C`E zucFr$6Sb2$mWLuxq`zQnssKGHMS}xeaaEaxL8_r!34yc0OsZk`nppi832NN$C>Gf5 zXaHZFl3ER2(mv!5H2;-oPFoD+&VFkiuVtshY)h{MlYpv7i`IAvn_rc;jU#LCix{PU z4vt>-G(@N#T;cDSo(gU1eWcY?)rfdnyEfKacVclW%aSBJIiqyHy-Ty#$`}4ea8sDm zBkU11%q!*^ zh3c;d+q=$*p7c^ttp!EV4Y;&HHtXYN0?${VVh-{AZ(k-^yyx1+Vc_^vj zPt8V4uS-}a6)CBRz`g!P`R~&~@~g$W5O@tw8+Egu%^J zHvYeN2dS{{%0SbA_PeWCSe-*pX^UUAuX{Z7Jr>Pt&`+~WNcKvpZtI;-XgZiNd)2Y?XC1|9pqB;P~Sq*vLX;|PP9>(>s8{hAC_ zXx6Md)zJ-EdnxRzYte=+E~{&2oexFXyO4^X>0H-|{Vs+WBbVu>P@4xyLy zkHeu>+hS$gCqA-yY&>`h_v;i(xs}_7xyotzOAU&G9|j)sNfP`l;ttLWA#bzVCE8Ps zxj3Y-?cT5ONL1lR&w|*V7v|lORTKOMX=HsIu#(Vfxc=SaW!eisN14j`HLV?TN}{kD zU_14a-jXD+>Rho=eSy5PR_3_W_X-&s*MGoN$fGcRw9V(#;c2Rw`lJDck|$k%$)XIv zTucF`_6VKbr~?5Z1eL_d5Bw)`5`!!FMuvuF-7U%FsCZy_X)q9GmbLfzRvK80%td#= zLA11jz=60Cd1i-^jNA+Jv}z6h)1JRUhV7BSFljdfF@@*(g=gScCtg>rfoB8O@)aIYh->V~^8hyJScbNKzxW-(IWzlb>=Y#26%Sbw8{_+3BET65% z2+XMlIL)&A_B_9nk9#4vpk-yRXY9lKnt4rDR)zi?9Q(G4H+->{$dzjEH-0GZ-5Y?j zrHI2U+hmE@?M8S8iHw<&$59bRWo|0>U?b-Z6u$9S3(cc$sf;2lXuR@BRQ zYO|WrKiqBS=K%xPBNjJJzIQ-jzU#sTHoNj#tEb~*0pzj9X$rzQuY%u`xN!B|`()xM zu55@*xIfY@a+3%ARI9>?iyPgrUg3QYZ#ERctE!-?a+vbl2yAlSroI%0kC`zlt-!tn z+)D^KFK0cxC$!h%y#~ombfuDV8qT6WB71rUgN~%p+8~S5dVBTnZf|y7c*`b zxu=+gp8IR@YVYx+Mu_yz;&ldE#=M!vc$D?rXT;HE4Z&t?aQ3gE5B|1veYItGGC^;y zZwzv`j>Eog9HSK4Q}yBC!1Y>N5SeNV4ZU$|$YE!L|D^6T=tS~Vp`R3$js=Mt2wZA} z2@QTe39TwlcgK!%X>m)ztN0(4#o&&avt|i7URo!l*15QdVAo{NM-(G zR1%zed{N%mJn7JLe#%?s*x+Qa15rQq)$(+(Z)nDaR~IT$=4q&7+Gwm0xHT;ImVhd_ zJNa3ev5`fFA|ub~7-L|8uH{0AlB$hmR4wa8FSR#vU6AN~vMR{s^S9IX-sZQ7sS6uysC{yO zE|eZc88{m+3M16U?V) zT5kVA(^oi zc(3b87A$jbmW5AmW1cpsoqf=;m7yikkN-Kb@7WZx8UiC7s(hd3k&3c`&+q`k950n> z_D!@)Z?nD=P%q7&ERjho;_?O+qt8_hFwUoN)2xx2>w%hxkm=Aty~;`6$+aF`N0cS< zAcYhXiFnZ@?PoF*qt!8rn))d;i;m9^)%rBpXlZp^BevAEEt9yHy7r4B_0s!jH@||t z4hTIeOe)?^xvYgtLZd{X|Af0Z7fZmU;%Wdx7h?~ z$sYeiYsauKuTMoMz?(T;okqvuORNiHcHU1=%M1z6v}Q_n{6VT>$r8hL9~=1~gt^{y zv|02`v3=b;@yzlgtLg_87{!VyD)HX^p*%!97G?^ceSPw`XNO9h zIAm^F+xpG1`sA0mO%xXP;}#Z?G({M5&no-)vvqv zO3PPoMzkTM=><&cu|$alB}W<^e3~U2OY=UTr55aD2nz`Q$k`Y3%<~0dV-I)$&{PFr z#PeyetGDt789LH@m{yf`H*=~#;}^P>CD7GsB^Bpva^3a~-UJo!m0zk6MMf(m?l>EEyD4UG=yujg8wN*40D zq!wpv`&Qw>1A90ImyWRyfK3fSrR98Pl>{)8F61A9)%H+FhKnox3=^lmNQ;{;AT$!|V1?Ui5;=srx_Wg*tfIPxEtR?Ndb5(AT78}V znyRWDAIKDqIBmYvd6$ru(cZn`eMHVMUND&uSx!Sl#%u;F%A ziYp=12k&9*-iPt}g=~u_8#qA0#HtsJk|)FbuP?v8!F|j`DW=*O$mw}F%!94nkMMOU zBN>~UCb;&w?uimMemCJIzhoK&IiIIMCCA-|b?+(JRw9Ql(};gywaH_80B-Ij)06?b zIy?N98d$HBF#J)4KFd&VM?V`0(K?k=G~bM2 z9l3e0lrQCs9!_2Gj`sS18o)=DuQA7YWh(v*;!->>s*he6Hcw_)T=r? z&D0!4ko`eE#hdw~OebX;b8^s8z<2n_9TYI)nVw zMF546x9c@inv|4N$1rsG^?e2^sCv1tiMs3C;j#e7%a=}|)J2FH*i%14U@+?e%OIJ;-POsG8*Dd&i0_y>|r(lg}M%AM0wmpzdC$ZE~}Qo-w0KJ6`J>rjH~TCk`y; zerRvVfo>13xm~*Ny(P3$6oJKzr^m5M+}Snj_s8M(RvYbOJlQf?-chbM3veV%4tc&e zLQ>n1OvK5wI?sTUHj$mqL2B<5$j3*Nf=GMwBkV`f$@DYcWHlxffdP}K=B8CN(D@k> zr1iaHfBwC?bvlVe&bk9v%^|=4kdc=P?B6A*TTv2tDVNef#X{AC#6%->k7EGNl1Z`c z=nEXGVu2HyUg*L>@Ilp?zE9M<9IkJqt|}8A9u52?U|%s)Bbx2G&_Y88B=MB1p0K^_ z-Kl<`&b`phTdskpD+Z+mvyV~5Lfe~%? z1Vnmj54MQHTd{rV^H4YQ#%qV?h!MRIOxiRCp7=`;uA7dpnIN+3sB9lNdHkqyh79_Z z<1i&bwCY*B-~`GrP`v_O?A`Q>QjXxae~0lh>ttFUCy@SG>@L~HRG&0fedJhNglSUl zz`qaHmguVf$z7*X6{BH1rM2*1W5>b1mdWOpC5F+`@b=C%w8!L{pA8jBuw0C8XBHi~ zu4nuqDfG--McBFTkBvT)3%Bwm({nuAMlU3tvtCgDT zSUunr=KFO0K_9DUTzoQ%HDW3$_=O2{<>9B~=5 zs7@n5jKi86)XX#Z+iB$5-d-q4j;0}#we++Ze&bm_f~AW~Bry2BRyB-3AmE!`Z`N|} z)8AiJ4skBp;&Tq;%`C+YzpUArd8qq8GZhyb>cytTC+@vr#%3lS*CJ5D%*&&ZGFM@K z$Xp4LeZu}AQuM(YTc!c~;HMjJkKy$xp$hUpji2;mdb4A>DQ9-NqB#3!4uEX|2^q00 zvAf?|qXaJv`nw2ly=FTHD&$Z&IbKq^J(h`Nlc$Tg-bP$i5jsK@r805TtHbZ>)7&b3 zcZeV&ko7jC@HiZc+gio9+kH|y@-cvSv)ALqchMnH?1&>qA zqB1R>j|9FxF^lla_kDjw7`!Sd8&5Wxq5n;l1XL+2H_cZ)d`I9SU4}(N&8}@WZ1{Sy zu$IQrle0AfFg;y5iq!+_P6VG^kJ&f-HigRC_PecRdZ=FQ=!q9Ikvie`uM^_0f~A~0 z+2?wxLoVcqO(Tx^EGvrD4`dFUb)m$LPoQ2C%5#<#>Hl<&d{{?rWXX6YKQR}+zG?`0s4MDa0O3+#;%^}_6c zdzCbbw1uUEr-kXo{OS?{1#s9^hwPl&|D-HvO)xo*LLcQ_|0V6bb-69ULKe z_-ceyW`;0=PS8IGeKGLy-4Ed}f77Bxx;E}MZ&$R(61Ca>v)}E1mxY9ZgLA#)@@sX! zG-BdD&3WzFQ-D*h8`Y?7GBAV}Rxp5q>ub#xGh=MOn|?o3g7%|teFVU245z=ErcC|2 z7RnVE&Qf=g!E5cBI?QkMypudFn^82y9~KPrUf($2O3ZE&;Df_flXY?38x+%G zf4#?#Hp%UM@6J&yAoXtAFkegrlE(E@FIOtGXylv<7#UThF*533!2aexQ_qm1hqs|R zCw6NM$ob^qNd)rd^nTjqqOoTm&|r|N8F+rrZ5dk7BzPsh_IQt55!UbP*Pr%4{}5GN40+4 zDl&oe&aR6stL}sK)uX=A$sF+4-#%)7TLuX}HJ5eiK+iepPb1?i9a`0TeSpm`<&%05ay}J^!!Z`K zkPG7RJbmlF1oiff1<%61pWE>{T~Yix_X9AD`#y;wkcHP_cqeoddBF;cDKm5O%^gar zGGT#`))vdf1jY%j_B}Xy&TGtldCx3h0@qDYJ*>a8v7x!r73`VSdez_%&@cUTzJlFx zu;PmBz*7jd-!)T63^?EdyzUnLxvk&Hdr2j~gUB{>etpQ-fN`+p8y5y|{h#wM8nwg)`KRm`?CroC%g@ zgJy@!rZPoML>Z0xx62fgk?*yBb*b&o=jTyH2m-2{J9GK?jnK55&Cl!s=BhfC-ZZoC zcPLxBUR%WfS($=_T4NHZpxkJa??e1P^Y-251UihIBv+)?HS#vIPmcYfcJ$lh>0aX? zGkrArKa_pvJ6zxQb|gZgw-5x;qj#eBh)xil=mZhHjNW_iZ4fnj?_G2=dhc!Y!7%FZ zo6kS+T+jF2yqIgwoPDjc&)WC8OU?RioY;tFfK{%A(^el^wJzX6BrYcGqi#UY)tm#8 zP-grDV#$W`FF;-(d`*HDK&|K?Dd0T0AJ*vVd(AGQ9TN;;<-v2x10Nd``A#?UmF_?6S7;JvGuwpzRW^d4>Q|+dKwau*&s|M8Y`;qO|MjV~&glKevQK zRq+RHUzF4Ey1elu{0%?OI$Ia3l+zG{6Ulrn)7)Q|;0E_&G-Qjs|9oSd)v)IJE6pWg z<%cbKTjnxfyAqG08C^TEo8Dt{cN~2Bf&N6&DU6l2SnpLhUj8>;GO4Dr`}kB#QF^FD zfNh9>a#1WrzI8%qM>L<8$UgT-M{8%R?KBRW0g%Bir{mmeyt3VnwxUXBTBm$&@SOpq zQ`E>$Mf6exAHTAi2a&e{scl0gW5Shpjj&--GqMlFp}a`xGcLPO%w4fQKW2{G4fGA^Mhs?J;|IW@!AF~e@Ce77M0=c;p*0( z$|J|#nLCvVo}Epco})&(Gw)_&6d$6*>cz)LOV@(Z=Ae5Uq|04%!OGD-Fqb|vJABO_ zGzG#p5+>3Qd?rI2{wH*>i4UKe9spVeNs}4y8&89ZaeY&MeDyzDU)auvBFjqrh?I&d z2yqaVEVJL$U|*!4DyLBI2#84hoX<8?U$Jvj_n+w(j7!GB95{IB+v*4WoEN!>g^qx& zcN=&15*Q9avB=Z}skY{<*lb;-%q2p0f0Rr+N@58!l&;=wr7-)VrPc`X0 z>LV$I=7%Yk*}_(K1(z~8apb>Ze9`s{>0rg)aPU_a8NNEYJelxl9S1jwS?^owV%_zY zanw~FTp*8)Tzd64WedS+GaBWIB)?%8)059pe7b6mnegHC-h!jwQzh*zWBpL`9)A0` zH@Z@MXJ+H9lsh8g566CC;o)6RNN-k~h3_8Vhh_H+mD@dN?Zki0mMU3Cuay>6RtBF< zu2(2iv8u>`4b&dix-%~Z3N$HsSL(POEiP@6=Cdvag2O+@rD!O*wRxRlCl!Y{&zyY# z1!A>^TD&B?DCejX^*#$QZcvW@OHT6Bpz!C*^TPWMmc=8KqXL{)>fgU~@L00!GGO?n zdXY40YaYmNeGN;`Oo9BmZ?!pClE1b2?i8-#g5WKJmN3a@YT4&}+h+lO z(%YBy`I7j3MN{6Q$^EJ99!Nu}u6{~h^u*4_vTy*F3aLI=mN_Wx2If1G6(lXjeinY0 zSmm5&enMl|pkPidYIM@Ah+%ANVy!}o?Wrgl_MK=p-q0RpIri6j9OPL&`hQey`Xvx} z2sXy*C89pbNU&(e!c9 zS@l_Met4%W4T-e~cBSSz!^!J|^Uik_vAi~AMx&X6pOOa$+S$ET)n*{$pItiQ|3wuMshWD! z%IlLCB$bY@>xx{pui@~KF`b^&$bpD*A7iR6-_vt*{e=oArOt_2HSV|H?wu!#xdwLT zknAJJg>gs>Hat95yeC&_XklxPm9lKu44d)^X`nhWAKO26JJEcL=|S~UMk=XxAig>G zY{Ih&=3*5F8=CEj$xnP4^f@x4YO68ICiookC;amB93}7F?DZg|?@G>~ zdhOH)U~jX~8M;HC?%!1J7~RPhGR+$jb}=`WrY2ssx&0U@516##n8QDKjp>f0dSGlUQ13`ta2TbA^573mGJ@HxCk zr!eD*B(a{WUl7^}Tz=6O7>%2+cAADQBw@i}{E`boc{ApBbtjHQAbQRJ(-{qJ+=U@Y z&pfsdihfqj)3`|2(SPRO-Wf5#b9$J-$bib8rr@Oo1-7?pOTiVB<}cX+BPx>B z=Pba==;}wnGOW_A7o~#Wa%Kn7GrV=N_T5;hXcZyS71VWNM4{sr zLx%O#SFC?@ZsK+r|Jo$Uq)sv*aQE=YLL>@4we}0B>xe+ z+SP6|jge6`v(4Ktw(!TACuaMq|G&e#S)A{1p{`-T8hYR6slEsU;9;0#$K(a`HcPe7 z0`d2+n(07o0gnk0_@v+wYCwzO_kBk-Qkt=iOEJT`5p8m{z$%|{ zwRc7?0k#ul&3>puM@TGfMq>e3VKxo#c?(&=F4dWwu2IvopCrK@>>^!u>v$%jUu- zx3sHJarg)rxmLYv&1#etsOWwtftnQJD3syL#d~~ zIV-lob2^=6Yu!1ZEO?P8RyRbljD2r)nBDqTmnVS2`fFAlf28R9&m_E7UZ(XXIbYT0 zU-C;GE?)f8=_17N@BTi5U!dDQ+JnIA)SX*cO#MY2!VX!9&zv{^YHOhdOtmaJv&yWG zoSXJ3Q@g3>_rhixxa)En%&&IE(0AV5LyAPrgVDl2<&=#JtbWlrSz1PDGUjtFe?KYy z_d3@d-sG8scfZmX-AL_T3*q(jH^}@^&DInFm`~*!@a;ih*J;n;dV#Y=J;>om8`U+m z{OesIFzKCn^g}DeITEYHfsV*jJ1+f|TvmrF6-AAYX#1$k(EhlHQ({NCt-`xLO~3SS z%%-Mmj*2zS?-RdmW*4zeWbTV{s}-@>e!8eb`s1IFxxvr~{Z(?d8oQ`Z)A$h&?c-?U zj1g^d>jDQ>#7Bx8e$speN4jPv^VVIK#HX$#$mHi4?|pcY_!H7v%xCp=$a|V@u~Rse zL<>=M4_C3VW#a~+7a6{K^O%{dYsi93el(TvAS9bDpTD(9h55Rllxlw-tLgZSkG)AK zlQQrw1KEiQTc^@bPWe6?KO=YHPOqql&=C}f<5n@>t~l3T<4&2}BIxl5XmoxizWi?V zC|n*Cq9rqbMP-BOVsDkSVtUF8W+8vC{~wY$>~ey!WUxQu3YH&}!uM7!*rD&DRM z#>6}0lF8FN8LeP|?hFg$Y}a^%W?pk6FttcX5aS~`&(}O{tBQXY;-^JzH6Mn1Xe(&L zbN?LWzHNoD9xZ4Z`wTyQ7e}AjrFFoKzwhoON#vurjL*f?(l42N+E#~U+m0!id1PL7 zGus}ez5b+axqkJKTS$Fg&9P zG;~;(m>w2e%D&;dOGCQL+Rl`MB&j!T8}!hlFVMeYVm+#dZA}bv?XfW2oqSvtMT+!f z1&s3>q$ss_z)PTCH;MAK&V81>q%$m%xc*LdzHD)pQRi;e%S!eAh)H@~a)jY11K zv6q^}l9LUX%t|?0$f)phG|OX>XBp;;>F7;xr6`NgkN zX{!3%JTOh}!0GF0 zf8Fo9ghy%a8#}{ZwK(~w&iA4DFFz)`?iW6Y& z+o{G{L>)oY^jef!VSHHtYGUgdUa$1^o)TLFE0u9VxL+`9N3v2UWhzHafXSjCjSRNk zY^5P-{*9E_f^ji~LppM1zas{9BpkmlEZmv|VOSjKmUP|P=KtIGO+s3uE>zYERJcZdVQ@aUha4R> zM8v;r9T$Eh`TetxknBkl%53s}_H&ki8xrMFiR)JvdmcuT;;zP}kDE^A)kevBb4tZk z-m@;Al1d4sSUG42REhvP>aEn%8T>V?0bWUkGQ32zPo+wN8Vkz zUrs;a(+UR#60@i3xJ9}tkwv$h*snAm-rM82PLZ34*+dvpo5?&X`inPcG$iUh`RgX@MET!>DVKDlE)`lG$-7UI<#X3 zO*wenhIWHNYL|XGE&4Q0s7M7thn3taa}A!xB}XP9NWE#qpWl7Ee}4H!=V3&%Z+`t| z8W?%-`_(Bw_|EywPF=)g-d4jKzwmQ?w&1+@rquXsqfc6I#RXE%P2U&?G&)6ht@Rt6 ztPd@IXYf{+7gR1420Mo%om@i+mhh6f&y>RZrJhEWS2OSO4Zpm3OY3~Wzdz&6eLkur zGy4;^I==xCTTkC|eLSfbM{?SZhde&0D3Ghb;D$J-{EK_uICwb6Q_dY-&6X{{Iec#( z4E*YBa)NV5P>E;*TUmgTavj>Ow?W*^f0UWE@3J}Xa=VwK^j z56(t}`ST2b50(y4IC81mJg(o(&-rc?-W?2ygBEyO>?+xt7aqBf_m|m8HunUK|C74% z+dm*~o|B%#k&5bh%B_dfI<`rf^gqGNwPd)=h_7#W1cZ}{%@yRXra1?UNI$-?@wB}EK=pjzJyK0Y7*nYxrq zQO54^3hEgdl0u|>ixwO)vde+R?Z-iHVs^WdP{Cw6^ikxiO;${|W8qizFA*3uE8C?9XHTsK?DdDRxO zEq?bN&bqDXDzsR?)}L8#wc`6L6%yVKNO!Kmwf!N^C5%Kj#q1`EWXXM9si=2lqNJ}v zP)-_1$Ayyu2>;rqE?h?h_ok}FetYdq6zbWu6`Gv@V|nW6tVb3vBbVHgGpj&Fy5EyM zSoqNy14>7mz%NTyA^jkLMBCK?36MTGH&ou4kD^tVxI!ochuwtl&$zZH= zu0|?DhtA;u5qpDu9G&h~8f}v3+VBz!O-D*Tvyqa z=EISi>|Bp~aSZ0C?ihqBmC1WBaJ#ird=qhB>L3kU!UOuQr00{RC!M&-7(SknGxi8|fXe8v zLoXJ+AItum9QM5y<3U_1{^vJcF5pRdJB3Zoeb>IQXyoxkRGp%$KPY=Nm+x02H**-Q zFcixeyq9wRm+{mzgG%UZ1>=zdq3#uc3WcmWmF zn@O7V$?Zf<`?CzO3$Q|Sr5>VVH8-^8=9mDCc*|E3YZS?K(q$D0l|+A;D{Bk=NwDJg zy`Mlq(8cGK%{44Z;r$nPoQgxneOAXKAGd|DV7yqJlg07<$S7CYi6@ZQQCV&O%VYaJ z{NO{}F5k{30>FHs7QC@F#~Vi^iPwwGY_|>R!v4P)W5|@;s1s}pXc1m3>~BGvN3)`y z^jA_pe0%qhy3_7yuhty`_)0$;#=J$ZRPxp`dDa-2oF0TGlx?g5E4C?E_pMfQ%x*4X z;n=z#NQ?K1t+>0nJXP_~J=ZsOf zWGd(QL`YGjwCA&*BK=95KcaYrLTX|9U-k7gX6zeieXh7Y46Wm%qNsMbfFz=mZ>fwJ zu-B?s8inCn>Ae*lC$pZL)_gmG*hD$#Fs#;;md#)P%MlVE#5zHKI%mYiNA!tW@NR)@ zId-Qu!{m%9GEhOm29PD{J1{ff0RXn$Xu#5p;x$Qbd?fqqSt)HN1o;zGfZ~=_cV|)J zNdCKkk%cOp2R8=^ztorTBPWC}xg{}^L(EE4GaB4~@r>-f@92QD8zP0?l-4gEZda^Z zb2IZqdb5xXB->_(iu^Vq`@k4-=(V!vO)37*%ZHruyZng7amb6pi5D;YU&zZyYPzK& zf0nn=$kI%WFq5tL07)!Yg$qam6@ou*64-eQM98SKVDgaID7W*+`~*e{j8em5u8K0< zvOk+AQioFrw|{gGXQU=zW2+@O{QYC-UoGKk6DH>43i0yAzVcIhU7Lc8n@IFf6L#f^ zw#<4~aeP*{TthYP^hiP`LpCo-b8~4D*J1}hnvPkEq$>^KeS4`vhJ%EwF$Hu4hFB*f zR9JsJaVIzSjm<>A3d5P{S%hBe#EE;H{>Lic!AW8RQF92k!X%+fazxD?SUcT6=G^2qlEE9 z_Wp=`Rh8kK0a0Xp|DUORP{|Se+M&ibCr3Cl5F@@Ubzwk%j*)>5+r1t9>$#2r7pEn< z(`Rxj@6T!m?R+eZ%;W9|X&Abk1{Vf3^b^mAcwQmeAA}j~Uzx`fP{KlR1@gaTe3X$f zvmqH@qnLalbXvSn6~Ui6LXS1t7IclWp;*Z+$7nxk@$KbX`W@Ra>uLs0J?!Yl-YWWh zqJPx3GXSRTRuTMZlDN6o`GEE%(4z2A($aFx*ez{z*m2DjA%Il*hGY*37=4it(xUz>zI+7EJ8Y-PKuzHu6Z>4 zE68d55n9~TlBK$@jN57L|F@_VHa=CE4ScP_-A?J-@VLp8b?T!fcakdLNt z+LGI;{RZ;Ikz?5OEcSG=!!Yp)@;Dmp$|*cXhdC-~CzGkT;GwLaUGD-cqGv#h)~`Xa zTx2+eu1V{*u3H?9%P(V+?m$(=p8peY99qCD{EldW`wt{;PplfbgnHaumfqbs)+RA% z>g5UF4&%R(*Oa%{Gzx#rhc|gptiMX24ieM1*PoxwmVT2UIZw|wY(PHXff1wVP59b$GV0v&?i$RSB7|+cWm@;uw@l*@=Bj%up8_>IX-?~ znPIzXZI$h+f}D`k0qaorFwE*%TLRsSYh=klh?=Jl`j+G+?V~`Bvr8RN7P+qopDZX>dsA8@CuVb)aMJZI1-rAGHeqMku)y27To4S8z_q`XnjVDtLN=L1>}T`EI8 zwytu)+j`B|zl-pMJ`y8<9)FY~Ndkg-SX0N0VKK|HW^doJmfe1h-$p>?aw>*=9d( zX;ZhIVYak-qF&1R(WaV^qPqGAV$i4iCddKFDg-}%AXGx9wH@k)ON&8?MrY!TtX@v< zi=M@G-#0)1m(S}9(?VAC!>NGsG8V(~7*Af5_&F+aUVaikG)o2bNm_AUsG1Vk=o;Ku z+o|0c5R`fO(CHrwzrnTU&Y1KtwU4(XL6uyLt!u{HL>d;Y@G!=4Wbu}OE?XDL9qN4U z@=4Ooy!sqxYNpWAKS~DrG;wHr^jQV;`gpTJYb_XaQD@g{w;^gl891d1M!Otj@Tuf3T z=Bjr9Ja97R(s4UWxYwZVM|Ta5>ggqtwIz;T6epHBcav?#v#ILdE#tlXX>AhmwC-9abXg7* zBN^2C5>ohm1|mhW~tV#pEhyJz}$uh#sg^lh~PvGVP0M#jvQ-@Y{p<${6Q9Mr1mN~kGn zLJs5P<1u)`GJDe`+|{3Rhb$?|B-Za$Lwd}sSvC;u6bmHj@B@1F8kH(U#9jyo1+~Z&UptPt_m3`eI^UTuGt%v zls!hy1QMfZg_U%o+@+VepEs3?&oPL}LR_}EL}sH_W5ZV5`6I$h(H&Ip_D%)~CfxLR zU-Owdj$GUeO&BE$=e_InIV3fUUMyqgNrh#9w8JZkkC*Y|2DF(3PoeF=ue;OjCG9|x{rsNX|@149Au@+okKGs z`R~&$wC^Q=RrYYKZroEHF1@!2l!fkZZJFcyGfPfJl{Z@5W_TXUI+dQV2ft~pU<1MGfj-%mnFiH&A@skfCdrW`y+(e{bc}e?VjN?Q{YeZ7 z{0+uwl0vW`;;%pY&v_H*W<#$~{2hzUZ=bcTb)~J|bfqbWNe*+~Q=Y?<6o=ZIokI5? zP(~uMomvj|fuE-?`-R*$0I!5?F{xUXkOrblvR!EC`8NvH;Ex{>GV{3ZhIqJqdnp`> zDHmkKU>kRkYYik z%j(5f@fV|L#w&v!`i7gXJJ(rF{aEH5n6=8EOv9E3Sj}d4)^WfrLksC}F7YAC$E4bE z;id^L`>8jY_>Rf!oD0QLT8<|_E?7wl>|bX6K_UMkLY#9VsSRcOH-h)$)od5PT|DtT z&ykustiPKE(gnQPOx6y406=9+`+!nH$ z6NQF7AH;iZf4(2ZJ@yW+o%>x}8{uF|Its=r)liO~&HVUw+_K5{Fn$HHeJsA~TkE`1 z-cK7RGIpQS*z}XCq5n=67(@PRR#H8HjcdjOh;>l5q(38i zXq7~7g2B~FkJsgm40eTKl+*{L&<@5w;}bd1yh2uHkL5T?OfEB%iT#;dBD2W|Bqc7> z$tC{|hqSK8*TjDi_)(nNw@HH?2FfW%?lJd|(oG1pGm7!In9i%YEXPBW#>Be}3=^mN zN>0mb5MJEuEq;oC0jCF{4G8dQ|3B-xl3btVLPW?j(wyEOsNt6~lY&9W{ zj)~)k${|iw;bc&ARTnZLipnc_$3Yo-39(njiWm@YFQr`cjF6FUnPtRJVaC)X z-guiK5%UTwS)`#)k<6@rtD0JC#6nBIN)z607Bb)G zOa`ra%&bd*&~oaHs*f+7h4xiI8_Z*M?mei|E*5(e`%3LAxqW+a_yos;;*v(XXu-*| zxvE&BtwPnHLN(azicPHr2#7x2GPQ=J9W7N9V`zc#>~Ue*xQC2RPey^WtKFVUh4vh^ zInxIFfzd&tVR%xbHK+E=i{oY>qp1(`*7u}f$52ypkymg?+6TAM*?2ckv11|B znmgU544lx8Csq!2M`EYqfC;TkO}?LU@#5mgJShYH{kM?sMKogvLl(a}v0{`DRN2mU z+J!|N#4qtQ*f%^OiSmG>anJb>R!hDan8}p%m4GGsho8n3;>qXl?*_m=NG{{k&2!c> z6S58S&MEuS>fH1jKe)L2THuM_&o}7-Ih}0xi$k7{f6!J??6i4brrAFz58164w_PH| zOsD>6kHd1g$RguWKR-a2G{L12a`5 z{WYdA3Po`xI4RCnxB&aS&0}d@m;d#D_wrR>at?$)QrC@Gbe56P{PCpgcg2*%54{jn z#cb+4V3XXa60zFKevJDGY6f?hKWp3Xe5-cOT+~5x$P+v6FX*{p_Jes#Ym|1>>&E=4 z7PGkim%lNaYd0^VPg^%wLu0apE_{Gl_PoUL3>fy7*PpY>Y70NQIsbFj&m@sg-!aRq zy}QJ%-iEnWypLZe9yi*-^qHYH4g*?0F_6nfSH|3``^}tf#$2hHl@ELqThJzRC~+Tg zNEq-yx}9#m1sqzb@(!0wDRk*>ioTpl`T9RhCTXS)Ur~pdxb*?0p`Da>6uo)q@lT~4 z$>YEpj=%@~kWzfCQav;dK?RDVYV1j$D;5wR2bMl#*k8szljO2C?hWA3UPl1JsB={} zwMi_X`QaZqtvtf5ykkfIyWVUEh2agF8^IC7JBmA_A2xf}mNzlxvQ6<|&ue9eo$%sK zY#Yzux}Vj!$|rBtOU50#np5C`qjRpmj%K5&TkY3u=fc7xWsQ&-#hrQ>91GvNYoVQU zxJNqw?i5p&I*k^t#dbu9q}P+Rrux3Y_`R-uwZQcc8a_DcrK4BziY&Pv%lduJo;~iD z#2wHGjaI*da=jsR;NZTohF5n6!BOoVpKOcWU{>S#5NE=5p8)ing(je((Zg&Hgq?N1 zyV3@TyAL8g4){^3b~%rDj_Z65ucI58zUnF8y|7xHm{?owxA8b1j^0hlFf`20YcB!( zEq{yCMuz_S!w=4ML93ediR`8Eak8kT&GDC*E?`N*ys5Rh3J)#fk-xk63BBAjB7Lpx z8Li|3fXA{U)-%75vICx|>}Uzr-Te_xKWJGvMyHdkCe&Rt1{zzLSWf0Sa1oDhh+2I_ zwmJqjn#?^bA3N!+2Mn*vi$97DRrtXz;8&ho_p&OOakquVBNSoiCzZS(YTY-j2aFWa zMd6%Y5Bz{*pS=!vWC2$R_(zq^U}!_lmx3ag?>qu!G;gV_T0Y z`oDgQQS7f#O4m_DO;t<9myZ?GhK;ODtvc>QD-{9GBZLWL&1m`l!K}Q!=jvK=)QD87)#f@RwC zyD&lpc8;pZl{)LivRgm$#$wK%Wy1 zBi!KNo^GJNu9^)AXP2Cu_r#GdJQcY4q`Eov`Gaj{-}Fnsbn|f@eJ`fKD?U?<$Vv3( zB|!7Sf)U_F@F(bWskuP9QE}ohT!e9tZOHF9hhY%)X6Gz`0dGn+_d$J)!R#G=M=U1$ z^9A6e1{1PPe(XU5R_omVV5@<>g zq!T}=M=0}tLaHw_FB-!^ku;Et z;Av93(w)aK$8$EcWWVza({Y;J2|z(m5PQ!sV^fG-2o8C<_t#@eyfvS`o@*J6azE0g z@Zg0-wOg9M+UMNysvA4Ydn}VKA$jhXo(=^IA-&<%Hp;CWN7zrN_6J!F zy{8Y2VD2d!72(R6`9TLH$3KOo<7|9_tzg_+e4%%mc(SCp02b2sN5Z4 z+SV$LimMx?S^y^^fZq8wi69iE+T=3&SaEej6K$ z3@@FqtQrmxJpR$&#`#}{vvVSUg(E|abb_*6C%q+#S9|Yy0=hKs`KE`ARi9^(r`*^-ZG&8AGXA}DX(^6B>zP5QK41OU6+t#08IZVxRrj6oZ`~BL z7RgEfGtvU8=cVpPTqK{-FXOZZ{<`?x^*xd#`rQ@arkDMl_h-Nb{y*ggha_TRh|R6J zT#-$XHE{s<9J*{d)y0hs(wM*v4wLbk2+wwv2=zN#IS^W(<*O*+n#ZITvOt@&;!L?V z_-gs+gFT?Cn|h>N1<}yvo3ioEu%Y4x4bc{ts72W~7f*6AEVq044%@`WqL(tR*pRRr z?XPStBMh6y#99y%MLCZkAo8hLx@JM%#f#Y)ZDXso=Nn%H3DO_C#CN~?FK_n)G~?F8 zzmd*q9|30ocb{<&cNr?X5YViBd{z5dWw|qBCH!Wm6cmd8j_aRnOyt*OoM}4O@)M*f-U^bLcPw5q-G#s* z%&7wIxK`l+l4@@79@ZP2CnyMRfMyyIWq<7QE;GLuoGEl_exI}I@tVLR#{teRFl>#B zIkINMQgw%BJxvx27iN~g5FT#Fu5+mJX=lkRD{gpIX}9EbtVOpLhU||h68_&WZOYE! zS;dAK_S)|(deV&N@U^!TSkqcKeMxvF8Vi)ZTd?*U?G2&{BkcpVQ!U{}|uKko)k9r0U zBe%me(9=iOiwvw%tdxwyVa83il(URw9Q_oTiOB+wVrX;fbD_p#%-0t!!@uL*woUi zp6s(FxWm9=ahGAZJ0rZvqAX$Cd4V+(o$CuHMf!&2Y(QWU&yU@Y4qAyT?oj0Y-WXe8 zTt88R>#+bbf|$0T+DcCTeTi>YxL?bkNN7gX=3r zJx-x3rB(Fq$9Jlr1%lli6#m#q1_i9&xC#-Vya15r&zVLmKZy9^IG)MNxEx}vR71d* z8RNj`rT=pOHskF>UT5Dhx7+VUDrB8H`Gyo6MZIP|_IJ=q5Ci8Jt2~dFTwRrw-rIe1 zaB^Tss4smddzb0NCnGSZLW!&p$`x5z9b(AatY-S*jI;z#9cK9V6V0#qfZh7Z(D8aQ zs=Y%-7Fh$HlhDZfh|0YE&Jw60S?5Y%$hzV?Eh07xCwZg#Bl~Jap|MNfPv3|T811qk z?zz@-*TtCb&odF%-5v@SSnr3dn=fNcKizlnV+?eKWY~||wJmy3o0aoe_EbY?}ce-rau=pbu>Z61TfjB=7-0?&YV{f?83} ztaEoCe3!s0SoeIVHymvz`I|@5n75iy;{K=KEK*O?)7caDCqBVM?CkG)uTE<^YR8E2B>v#fR;7*d#e!|Wy=SNLI-CH zqY2txfZKny7fpA-{!k%b?)V)`satFuJB}h-UGJ}!$~#gI#2oyC^NQ6>G;A)TALx`D zK(43M%Eo`;V#E=KK6{g|>k2A{%-OQ@5Cc<;0VH>*Mi+`O5i}61O~K52qZCZ5#h_;F z>48BsLVEbkl74sU(S2i9wgZKEAgY)B7G&l~K5t_YGkqMh6Y;(1MKqP{ zjZ0geeQ#2W_-0!J*5AGfWOkB+!JZ>Qul~99xP=$u6c@Q(9Nn-`1=wX;E^=gb8Y7GZ zAE3lD97f(}o>k%@QjI%FX}bC4w4L~p8p&d(40eR}FSnlOda z^+jDGg ze#M+r$Fb!TOE8b~uAgkM(&HawIU;3RsM#KUpy`7%Z(pPHN0)cf zO|D|MQ{~L3Q|uainR$1t>^vif|459G0_R??6SZl6RoXqizcc>pft{^);R|&zhz|Nh zP@wDT4AGeBfRCfcfX(1!*2bNf2Fla&we3N7m%6yE4l#RcG*sd1>;n$O#^(wuc z#nuksNxv)`DN3GiiNrvGi9O{R$`k^)O0}a-yb4MA0`iLl(lnu^vg7 z_;W_>W9F6xGK2XQH%y~Cs%om8Zpsqt)3&rFHUU-5ok70#&c^?0tBmXaow|@VR8den z25>rJanC!+9Ur0|U)?E+fWma*n&MhMVv|MM*$ak#nuP38sICi>0i_BAQ07I~(=56a?yj zz`)!kNhwcf~p=$3t%r*+yz3|h*aK`#KhEMBkRJCaf1U5+p;8TJ1O@5m|{)|zv z86}o424`wktA}UPOVMu38hJF4k;98KhrAh+Vwz8rr-^@0gkX=W&tU1NAPtDB2{_ciWti|bkV z-O7Y0%;{)gW63IY4wA!@%bkBp&SvEI1m8f!A@`9=D$YCS)4sO0s}jGn|4KmM>HI%s zHsS&4et5ujkf;6oJNIC&Fc&n+xn{>~@iQzNdXMS7Az=J~lo#1=MkBukeH3^`N48|o zPdm>@9S8h3e15=y!mQ&8V1~3o5)wNrYk)+Qa z;UG$$PgL(HXUu23`g0p@&cHWy`x%Ev>&`~+79*~!>eq`TAvp%_( zPG1yQFG&0riHf|-N4I@^|Neq}iumTUN3{ph(4wNH@*LrVZ7%}9Ta4JeI8ifjNTErdmrNSNd{WKuDXkk(n zeib9OZB?I}u=97j%bHwPmZ_xR^91%TKaOB=LBT!6lIngZNLP%OoizWE%vG=`@)gCB zU!(i{;jxxmIx9ePXZWt`O=p&K9C4wJ8nhoL03Li`xV{gW7M-YT(ADEVtsb%sz7B_vNdP* zOfF2&-8FOzFMp6x(G{cA(TeuU5_gjCU9s>Ho=9-b^3GofsnZCJSX1T@V zEmU70GE}GX!0iISxc+-f>n6Rbs^pzAk}C~OxBoSveqaD_-X#r}76c6JoqHP_nsU^8 z0YwvVLYz8|9sJrmAArs){bsz| z_x7TuP)M%~gx0-~gUx!=0?MLrbC)x%V;f zksQhBexL-$c^qObCp~a{0qhUHq`o)yG!t}@&@zsz`-Gp(eSw4K6C3=+3@?XUmq(%^ zpz3R0mJ_2Y?28vJZSH7Oj=qxzuODF?@8M51gW_S^%=bIaea}^@65u1p2g(3DX9&)5 z0RZ<5d1wr~X&gFr&a3l2BzbOIvZwEFiXdmOW!v_rPFew(A0-v8V%m^Y=}Xt*&K@C;2d?A7FHzmV=n25N`&uje@(X7< zG_282SH)#ZU+c12$X*P-v_{9wV^s>vJR)>&@iX#(>mrw^d!%X5L#XIauRo|VCrt_2 z30W7Ww0>4!!p!7})l8olY#q7x2F6AWdTta* zuW&-;R`nxKLeptBF7N?m;%(PBX^4?xg_S;`1w%`W86JULIj)-Gm;qwwU)~9{ zaOp{u71fq5GquUKiPu-}{KPm*?PYtf@!IqMkFv9jis}Koy&{N!5>iTcDIndTbfPXS$iVJSMWf z3)^G za95T3QC5{piiEKPPp>~jF3t}v12TD735#Y^Cm4|5;GhNK!tasM#%N;l2IjWO#YH5& z76Iu$?`cY!2SWm!$>CrAaHW4cI`ROit)${MA#%T+-D9hx6mF$c< ze<*pDX;Lc36r;JQuLxwdRkB-YMksBeh))`Oyj|u{@h0{b`PalY_CR;-tE#i4oTu00 zO!cdbUt65G2u_sNm&#knY6OH;fI-tNqc-ryPu|eaaDo+jf@#~K?Vee)fQ29HLTIHb zV05nr8%8=m`@F@!WJrn8h?;Y<25&2&cjk~4<0)9ay7mY6QFjz`JP{al2HO$4jWb1eeKyP=%i zn{Xa$A^LP8Er;ACVY!RQC9hHfE7hyY0DkUY`q@i$Z#+hZ3KB-960B(QdN5B9m}LIB zB3T*TR#_`h^_G)g&_qY{B$`V`m%#jluNS$TiDcHFhvml0ZzY?E-p0b8^YlNM+=$lm z)%%~8qwXki0)4eJ_iK;`lxM@wBjc!9d~fmL$|vZml=BHiQjNo|b1B!-wF@(#DwI3} zZ9;EO?>|VWNJ|G@05-qcwefeTJymaBbD~};=sM_O6D9bsZTGr-s}%>5q}m7_AzLUr zLdB%B-QEwWj#JDmJ#G-Dl`TSV|4cT6LBXJ=nPH${x{Ye~GUMBjm!_|3wfEz(tx^z>iY_mfiE9uMl`| zCrfq4m3?|%>87r!*O<62&7ATB?p0C7bs&%u5SxYFInSCKa*30#?P8D<`thoKwk7Ru zq;+$)5>51+FfEdg)VM@EKuz5S${8ZqU$11Jm{ zQ(Eig{-A~(_50ATCv&g_oz;D`Jb>DiV)twnfy{xFX^{^j-W>VQ-yPvv4ck$cMr9XY8Urp^)EatN7?Ja-FN zp8Zs%_aauB(NsF4U^`1n^J-vN1w_Pe+Ew+1G0G7VPqzSE7UIw$BRS&B`(>!GF(>za zHk)6{3yJi6UnK8~mCTdQ&iPUI#fQ$^u8~x++_g%!`RYNbE)AE|mGi?^9Mn#!djL2t zcVd$8*X(+-?;Zzr9wX0{xt9(Pd`iH zOQa6jkaS15Qu8t2@HUK%wUtx%EFeXKIX6)?>z8t zn1wP~S6V=>lg|8Lc^cnL zdoi7_)yZ8ppod)X1S33(QSq6HpI{5_-A10iKNfyVHjoaiZd*vc@lG!^p{1dQ)zMv^ z-Xu~)M3m#D?OnF|G}&z+tEjyp4qWDHV-N*g_iGwF66SEEq{!le(x1L<660}mdb-Ma<8N;UXLb%o|{Fq)? zL6pC=0aW$P^7XU*VZ8-IA4cnY-@-wQ)9D2Z&pte=)9Wte1a+YoL62w|HjMLEccV`aPxAjIq{mHwtuHeU{!sw%+queyLq1Hr38)>( zKbrnvA?W>z$18t;kQmqt+9v*Z)u>EGDx_wCQmjO+S<5=^YRIL1W_B zCXhpih>P?8gt)cnMXg9F`x<`(%kAPW!T*-)zi%F^e4S~H$&{l0#04FRaX?j5*#@J( zJI`+FYA&Afhp9aUXV>NzNj$zNn|8F=z@n7Q7LRW=e;=I84EtsK=lq*@z8#V0)P{KX z@457rQm5c?mF3u@MLVlw{Lo||(}@Dch@{&s*V#i9HlqHOm-JkXJ3yt}=yCcTuhKrS zwfsNK9P?FHy6nqB)p<-W#UAjjUhQB~SNPlcFJL0dPcI1=bS?5`m7B1}`Lyi_)swK7 zzDv$3m|gw$Yy4D?^;(yci|b$=FY{w+p>nNko=ye{5v#l{wr|-nb1G}&o8qyu$lu+N zxF}$PP{48GvAfSN%PiTHi6!*)I;^)d-{e-UB4}$ zlRYBJWm!LVnmR{rg93j(#k=JsXWICI_bMXrrFY2+twv~i=Ipas=+VjbH&f&*)J2^U z{?D-IsbB{jEGRde)6`3sHJ_v)*qPpv@9T%;;GNlpHXrtv+60|m-ubIa>8$VT>6iMV zxE8p%O1`Y_&n?Mb?^SnO2OhAS2m~HT+*T=`cRj(qg`DCl^)u>B{#%UF!pi*e?i#)S z1SFDQ#aK$dTIR%L#j)tpZnz41nIY=KMMY&Dfl4&= znNlrNTelyJISmTDi7SDa)1iG@=ql>k7IXF9f1KRC(iDtc9sgjibv+MYhi#%Ev?4gj zsP?(r8g)3^0Is)~=T z9>f7d+g`pZ2^p_jGFI>Ct2u{CvZLd9A@bXi$qZ!_sJEeNu|L@|;_&Nl;?;*7JYKth z<8&Ezsjhbcum{wp_u>O5S7|s?jxG71>iGQ2=T@{Z>LjT<{v(EfkKa=KwO1=+-az~! z9KSNL33+wPBqsYGaYoPBBpmH)PJRHdearzb+sKwGA90hn7rqq}a)bAuc}VD6Pvu{v z6IewX^=OuTB(m-uK6nkR;8kB+TMLOkJm-Nu?m?yNS*w@uC@D`eN!*-qN`z@)$S*k} zT~(}k-qdTTL&j?!0O}s-Gz%k+X za~Lt1T~}#i=s6{vRTlidVIP0Eo-0*43f~5-!uIvf0P3Dq>rPZ4#UfIK+2BR4#7itm z8D|x++c|Nqp9y{RdmT+fpuw(Cd%teI0L}Hf%XacV1J!+*t}gIW5F;1lSrOUcHUWKC zFuvUvKi01^>Orx#rS$U^@reHbzUI!d5fk_ZA?M}c>HHN5LEDRu;wUjX=<)8Uy>m}D z@bW*tPW}A_r&~|9qXPwU8GJuN-L#Hu&A%b88(b2E5*YvJk)?#bC2(Bu8)*Ao|8N|r zPF!lK%sV3rCu5v5!^T!dl142v4qqw=F*(;I-m=? zP^VrEJuYq~i2k21#$`OKR~hFdmHAO$n<1N*?yR6TBj7;Kg4kewzb@+={fu$_nY0n_ zB0-|xzZofoLYcR_g2l%N9;QnQvWDsy!S1|d zGx8mqfs5Eu@F zAqk}qf?**He(DLOE^7@|!5AMS{ASDw&&JpG=lYfecl3Wg=Q~@$ij&^`#9YdY_#W#7 zFU->%Pd2=q?}6e3S(&C(A3$4*GYsIPl81f3!=%0*#ZQXVaw1KuYr~~F=mr<<76&du z6jmN+6NV4Yys949J$%J_kH>5S+_#!(E3F=`SrI1KguAhXF1llBb+;cU*^l$sH8fP* zHq$sZR_xBlYNdoO3b5(QUdD!ABu%MVWBj~ASJX+_VqAN%9k9Iwq?VQ*?GaBNAsTJ` zDPHTC{JxO$!K@G7xOXAcP}!QAG+s-zMZzRoQQ%HNw>8d(tI-s7LZD zaV3~4|Digv>mq`|7wU{L})+-e!#hHw~=0{wZF@A0=$)+gJ9fq!J z))DLIw)!LSgbM&LN*KK}!o>10lTI%ZzP*@vgBy1?%o&J+j5%)tKC2lcX31Up6r`n( z!g0x)JIBW!9=A~6(b88Bd=&0JvHgipZP1R%w=Wj!k1$g)XdNx7<_Hvr3~<)C9K!{9 zhKwiREzXe~sd6$?+~zjJZ=0fFo}u{SO6RdVs?!@d?ym}4xyvVhxN?!X1$K3HvE;P0 zhbm5YY%mSPiZ1Pf8ha9^^h@z`4>@iFRV%Q#{TCkuK0XgP12jBDfM@;cAxpq^(rIw9FqvyI~T_vzmDn@Ovy8$LA?@WNu#MiS_ zu!34l3Sn4|#63>h9-v+fWsX37=0V*Pi@5>e1oufa*M%uHQ_*2@IJ(B{w1hi2JR9%0 z6V*ux@6-6C2i~ciyJ?2~^74RuU7&9Pn1$Ikj3$qBWF!)~IU)QP&P8(Qq)V~oXlO}= z+E3LXeFT!`M>L_6@9au8!R+oGKm0;QU1|%Z9O3k9>!!W8QXB;7o4bruoCzrU>EnLF zlV<77Ro^A`{^ApoF5v2}zEb0t6C_HjG{s}oik@ngFO-9L-QC+Awc69s725eqzc>4&pyxFQ{Pb?a)rs6cKl?BqFySSITnT?i!lfie|b2F;bjXV?n*MGFhlwwk9lL zqkjKxShd5Rc#naQ{CT1N$O;GHs?*%|@d&;1qAX#d5Tn`>cAkM2V?e{8nd|N7oxfAY zpwwioG3v^#6L)vn-{n%x`#^8fyqD1tL_*N%{7RdK&Ge$*qXya)dZcwu5$^dKz&_$9 z%}3AB63c~ExDM@ITK?zi);(Itn&V`WL%!~th78M)P(q#kBv0wI9+9#6s1wh_VAetz z;l2h^Q3^d=DR0{b~;AAIsyj=ZamNDS9NGsK}y zMz(|gm^+|A6)S5mg&Y%EnN)fvuO`B4Mj7D6#NoJi$^Fkwn_C9%>b)XXulAo6!v65+ zmSjw2HsMmz-XBb=fU9429W7^Xkk;0IJ8t=9aV+k?wL`Om&4QVdQ?0uVZ*HJygYwzO6v`lgeVsThanaOAfX>gfUh3G zt~a?28pH(wcmc>Xa?q{Rg3NfEo8%YYe|h_f`bgnwu#9zR{Kqh9?>3b^V3m>1RraAf zX**>#^7OIzo_e#4buCB;V09O$&E?D%D8Qis7173f=1+i-zSM5h(YWmi7rT5rkavvB zz{>+BDZuk;q*ji@KQV?o;WjQJz>R?iH1KsUxScy^cfv{Qr0^=lZv2MNU}@Fj*r58{ zXk~d_*X|0Rs#ao1RIX>}C3Sg?gj|-mvClC{#Qi-Sr$*pBsYVVp9NiImdsOgfc=GQe z9lolttGZVF0abXI22-KeQFGc7i=$9WPGI2IOoLzYgd&}vk&2+u zYw#|h@l^Q%OAI5Y7^}zM={Wrc4njE+D3x%#5=MwIKa4CIH;X*CX!5n6Nkjc|b za$Fyd`~by>if+F+DK81xixtv9DX|n&aAC8o~S07;*=^hs}Ur!r#oYCYZKT zwU&;xmJ%z?FsVeh#IDYSoI^@I>+TNIs`ttNxG*~s+eG?*TA&lUN^$+LZr>6Gcv;ey zp_&Cc(a%ViJ~$YAP+a}uH@M3*u=(EXy+rW7&HSTHVlU6X8H?T}+#6ZM@;eP7Y2$x`^=6nTi4_-Y;#*x!kwY4BpDXoJlb$~-%oD8=v%?IwYTFh6EV&+s%O8s z_}(x~WTB@J7TeNDkSsnn%JFlb=>O%D`oB||S`T{BEHlgeTK4{sOVu|O{;`qA#_U~- zJ($m9?hcXpqt4a?0f>sH%)-m6&?qDKke}69BXx6-v)pq-lifUMZ==3w+(FU1x=Pnd zDbU}R`KfD=)`7yh>W*C zmb={W7IiN;;ZvP}fp)hTK`s>e19wU(Z44q${y8ddnxmwmnYH*N=pp_ryNrG5Le?5G zW^^*!EKoV^qkTUbAML8@v7IC}YU}(^h7IJhKl7fJP&wbf)3g;%e0y? zIr&DSNr^CxXunsoSz()mbrnQ=bOimakp@lCA8KL_c9F5aPf7dde=W46pS^+PStWFG_MV|u0!PQqa;Rh#(q(pbF);0L>XekT zrkYo33g9*x*5Umc?Y-zh&WTVV+RG@`VclpVqVj_Q2OL((i*Sx%=3y~637#0Ex z_y`Uuj-q15sa8f?UjNVOq>~5J81ymzr6=f(c+LE2u|K$edBY-k_WO{D-=$u+6$sc0 zE>diYV14?F1wgQo#jst>RpnO}xt;CH%m5qw{v1e8k|Z3rFfyRg?lE{#RmHWaW(VJ& z?Byuiib&^g`XEpg?^@t4e-_zXyYR@*{Z7^kgEw>GMsc2Y;7I#_#F3h>eoA*2p~|HH zYovHO_#d?2!wlz>if3P1DbKzZ(l&PMhHM*`J3?!&-P-Ztj1`ttD$|SHBMFGK5KgFB z;Dyg<=g`#UIb7Rsi?wX{;sew(En!CMEqd`xJNO5EtswTQ? zch0S9XdV|B%fGo_LuiXW2vPoxl zf|Un56uyKg_g8#*;}IpUc~Ng_+L2Y9&x{LI_gef3 zlI&CYCc-eX;rx-8eF{f&=_}WY;$?B8_^>_ej&JJ=Nic#*D>*cCX`sXZ@di@S;)MT^ z*hl+^%@ZN;a0&Fdm(+B2=Z;p#m6P=(w`jDS@ z6c4s!OO0A?t%xW}?CgOoU#B~l4J&fQnr~auBILh%Rk@s+ZJGKOVMk6TJ~8o#0%zp} zkfRL$XY!K(SOY6gao`|5M~I2IhIQ<&AI@d4Sh@-?u?l?u_bYzOfpb(lxA_Qdq^hqk z<=bf(f5z!={#iO_$*aY<)3evH6`oVdqZS<7DHd({WDV?cBuNaV3{F+pOaqz226@Cr zeb#xNj~+FwAhCZ)k-!0~aW3bL?!mcCPO%4~APMnL2q@5W8Hmirrz282|B7KrT$=a* z72TsWLbKRKs*V6{wo!=YM|bKjiulDosQjdsrOUF1;j5nYQT^|GmkDONsRiAtXh@#_&zL!PRC~M3`^5)Q=vXOS(>~R-6PX`GAP)H zlg*ZHX?WIUi*t*Cyx=|~3ufWr8`0~72!Er45sZlaO^b#zIUxHHg^D82WmKI!PX$z* z$P657roCO7DNpBw7QRT{yv5aHAvHBn93Az+v~p7^sehLTjIXh1!V!4H??Zg{CS=$I{^E8bKZ@h z+Pl6rq&NVmudlM>3Dy0a0@SdDLIae66wv%GFdm3k?h%1B!kMHRFcmVYAL;nYFWE zP>L)@#vvY^(+5jc172$m?Fy$mLvy>NN0vLue-1YK`fFIzwF)F}Qiv20%~Y(Y&lEK3 zL)a*z)74kgHk51D=(2UnwF$oDLfiK`JmB>08bwRMhy^XP`Cb0^O0!udf_}!F48l?V z<$;7NsiLIr73K>renumW3ld+%1F@vb|Nng9!TyJ+U6i=lX}{||FRcWt4O8u~FG!=O z!Uy|M)yh}xyr>#SH2clx>}i@k(p|yUVLQ{#xbCM5)5Bi;LnW9`cE%V@v+$*~+x+Oq zq=%6vnMJpM*`5Dh>~**zV#Wem-7ob6m#M5 zSn5^BgrE0V3)nP7q{Z!PmPSYSUeSTAee^ZLFpE)ljxUXu`cNlOqTXe7CkoxtxhcEB zOAKf4!t%hlaWC3bhvW%W?Z1iFEuT{H!c9=TjG+h4YA9d|aph0CP(WldKJ8t4yiH(A zWgT{*^toqXV0b<|5i15T>2yWKd3x`J0Yve`=M+G@_qNn(R1&NiZ6};N!c^UXm=7q} zp~QWTggNA4^WH(3jO=G7t=U$&n<;%CmuR5{t#BpB)*X{v?iHv^we?-2?&xA$YuL6s@kr)%b%H4%pJJV9wHz82WC zl7iM!p)_Pn{ii}E2x#l^vhTrE$f-|l_IKvOB3R#wnU3sNS4~m_^XPZcp{q4a_C(QC z%p&ISZgsAql*XT2WunQ^hnHW*-!lIrIP?iOP_XzQ;!R22573UZN3Dem2fpP-F4{Nu zS8~+k%jl=f9NpUHtoOXAMqt(12a|Bo9?_m#CfqrRHvYB-6^GG{Zv5pe?aA$nzjI}u zPX(dyhCz|5j4Vn-%e_?pmTi-%5$iTZD}f1jw}143$BX&B_NA5YO@cM03)RP2ymy1lf5Jd<(Kq+J9@93jB~VX4D`zsEeOM!@R6#R=+~uG7 zp64-fkG*njK^YR-Hy;U5Y~&|MFG{^PeY!>M2`&Inh|Tk3YD5*UT*O)s!T9}JjB?_ttrw}d6x&{R}vX?j&lN=nSO8Oat7UdxF-mJDE))e*bS1pC21 zqEi0*YZ8Y%ZEc(CEcyc@F&csB0O~oCB*QJ1Tn)R{v@BCCgoWhWmi(_+lNA8>DHk^jvTTXi_2h zcj*-`48$m-Fqz~tBteI60NgE*v4Dp&r3J4m?Mn;-D?h11XgO_sZ3X<5Kd|C92RL)T zI^8cGBuh@zK%LCgK5Uz@Sb4P>WLio|>6X2MwyF~|A?g+L95O$O=i)~GK7F6tRzN0h zQDa($^~4%c6%iIw+Wn(W{n@M&-+(LM&fR|4rGHip<9$vD8Ku+iaV0 zRM^}AZP(r#9q@W5s|sn12(EWt1tQ#)^Z*1n|5dk#H(f(oCYUK?S5v#6h~2Vlg08^_*iWSM zHrm#`8wtcVQC|8=qv(jAt!&y2twrJ|q*3T8U@$rf@kH)Pp{ugT1Zq_ig@n3hBQ z=s`hHK{ATMy18j~w|{R{cJVvAEDAY~cdrOBF@mR7l3;f^B7{JRlP0%+pxW7sn_KQb ziwPjryBrYOWf7)K5fv1XtStT)MPUSZlH~fzGWGWYKLvnBwkKGK+a5&G5fb*FJmP zhB6k7J%!iZK9pSGLt^TZ&cn+CEgnY8G1KGdI$@uwh2C&;Sn;|IBeHCspm4uUAHQqp84{w^HkZnt&%kAMI#Pq5DUmz%$D z#CM`)ml(ritm>wYP|PajVlfH^Km>w5$Zd1=m)E1S|FI;2eyn$k_Pp^-)b{hgloep| zeqaW8{q{g_4U|@&H|w~dwv(J^;U$pK6%lRBDVj#xbZs~O%RlD88uE<#04Uu7 zuimjTxsU>vxRD?0Y4Op(^$nQEO8=QvU*ioP5N&9jD4G}qC@$7N7oOSA{OIc0sIf_B z&U2(D{;hrpk>6N8SpP^wh*9)ADQ#GAmMSRg4488NIlsRg#UqA|cJi}$O*+bn!p z^f}i@hk^I#m2@iE7;RJ${SAv%Jmn6(Oj03v+?U$lDgUg3UAcnW-`}!xzoJE5y4D4@ z<~2jSp{4F{*VW*5lS0w8%LOx1kFtYzM3}K*FT070$pAe^6n6DJJ@m+qoGLS$E7vVH zRtKFsEY<9iv8$s3>Zr)3kFs6C{EQB*XF$SwO^(HdVgM@PB%Tmr9dmb`1`&ri5n;tC zy!zBh$dnmU^n!^-SIoBwHTAgTz+0C>s5)*o2ygSBe*cGKHT2G+N-m;O+q_0mgKl>> zuleZcgn?&QabFY2X{+YH1k(7(^M4xA$yi$T-JV8ml-5VYP#62|0n1Lak;U#a-CkK~ z=>-1F#FMU|?-4NFSz&W@$RFt9e~A;fJm}mWKcO%YzJeb_k7u`Q&h=}G5EJYs^TOx1 zWnc)+JXogh2ky@{>Ng`D5ehaZh9%|6*2iWGCzUDYA$k!EC;K|E6}3u7jW0lBvmO*C9FocOjE>ic(y!TU zzl3CAoZ}Vc1SJxjhZ$D6`mb%jNM(gxrNOTC^VctdQTQE0#XjTP3^|AVzZ*ARZ#{^F zQsu}>iVmPM_&L_$ag0Na@1)<(LDzQ6|BJG<3_UDOZF3VBZ6sbQS*%G)xQS51nQ^7^TTGJ3>I zGtd(hq%2}}xI@x3y%F)MpAB=KB_nK*rbW3->VnXg$8Mst7XKJ{YD{@QER~(iE2#-C&cP&2iZ4AnU*w816_dEena9F8vhAqkV4t&IAn`L zoMMo*pMQLWqr0QTH%h~Z3_ElO#Nj1rWMt|CHwGvovI1{rh{IOb0SZQq+v@Tj4cml+ zvkxbFa77P%k1(Gz9M8|)r*iZb9JG^<&og{siK~8eie5h_uD6gt#b!U`%iE-L@*icT zD=+P=mX+vLl-}Nbvq*upUxprdYNc)~K}^e-S4HLy_Jw#egSlx|-!92;+gvP%^auz@ zpb%#f0-wg0(9G=WY7b;kUuk>wK*1x4!mfRf|Hsi|r38d+O$l^xbp zi(o`TxP2dj99jCAMg05&6BQ-S<`;Etj!S(XX;-%c;9Dit#~B>z)yt(^<7x%Ks4At< zqF_E}D}~vDTPBQz0-dKY_Q`fv(-y-dXf=$34m5BzN(85FNN7?sf^JEtl&psCx^LH zAA`>9Af961&{d2QAKh4~nJN58d6bSo?fJ3V;t{-f#YS|h&gG{YRG0k*bkgPP>nOwI z_$P@&K?gmPsarolzUL&}Li~0=(@HdS;q95Q;GE3|b1Dj?uaj_uub?ipl|KLVbgzG2 z;wg&lVa#;G8>WsaCLG>7cSmdy+mBcY-stdzp+aV20Y}*7X<|*wWu@n+{%}{5=5LaR zvGv`i9Hp*jN%S#jHqS7SSPC(hdUFf6$_p;u-J=*9xrC)z#+Y)W{N6S_M~zWo2x4MPvLdBE4PVbNUmUdwr+qLAwQ_(Sqz>J%4vdRHd8;z`eX~E(o z8#Mg{h%NCOpLA@FIBz-3u8~Atw;(c@U2rqVoA^gHya#du4kk+) zyj_>mWj|23Q^*t-n6sO(EKZQ~;0smV5sj&2X*RxG%CDAlApzTK3buXSQGe=@mDg7I zy3h=?Uv61>>%>t<&ZT}{B>&8m&XmkEv9gd$@wQtEoweLX532@06w`^(8b$GSR z>Q)y8x1mpJOh{kdDKm*jn?6WM{p^AL|6~gMk5)ETZt_2W5P2OZ1yzxU#hs1oDiueo z4aa_X_)2h`)5<}{z~o}E**AXNt2?U|&31)xiB_+|(72&1Yhc`xqQHPKJa!JSCTOZ! zVXCSDftjm(9E7>-{*Y|MKc^gGtE)(;8jw6EjjkQwe{2ThGXA@6jD!A(AuT{ z=|RmDrRt_G#WeI(Om0B7#yB%wmkme9B0DmhvT!V3_ zV(r8Lzer|h1rN0DnoQSbzHm-W%k?TiPIQ>N!-|UfsEUEy@cy{>4VD(qD}0P9R{Kyy z-*L|)+e$*u3@6a)__BJjPRrXFcpKonIQ_k5X6_3k8SWRRAEbJO+YH2tDRdYIcX3|= z2ol;~?yDKtq#C;^UVI^jbq@q`%M8%HO!SeRm)>Qyhv!2(BdCAat32lH-5hzL)2|dx z9p6{A!FRXc6U6={yuJ-j%r^1AX+~k(>Rq1{9DNJX^1@t+=^|4<3F`#xrp+lN{>qngbe1Tx>v7;W`M*rvVajWDmV!#-M}3&K28f3bb~ z2d#ZL$HgDz+(DpLa{Esg$0*CY7Yr-I%<0X!%Mg0_@l*e?yT|~{*K$fLn+Cro&*B(t zme9jN?!LxPxKBznO4kz^KVb||yLcuVz!Ty~i=Krw#{I^}a`Eqb&rq(+DAG)s;m^n^ znWAL3(kgT;v#C!f#rq7jG|Hc%hN=x;@eKANVvN-l-DKL&0b^O!Zsilg`~ONmXqq`g z`RgN$FD!~;b@RNi*TpDbSw)YYy+|}|qjD*H*GZv}^p-fRDx)a0lc~c@M47oLzkERk z1HmkvT1=MEQwq*iy!&9f3(~3%d6!JJ)jO3>6V^i5<5h~~@ix^*EWIfjYKoG89PxjB zZ47G(1sRNXzauVqvMr%diD~5fG*tXa2N+rqRfuQ6r17Suo6D9FCu51phj;IGeN(vM zHfuHe*x2RAV^c$D+cN@;uT^iR7M1CAKcZ9ZFTJ{aTV$?Mk(Jd5#s(>q*fiP<7gJrT z4qtGMCA!7oJBBWlmt{o=7gR`(JCh{16xjhC#1b>Op8eBiog-=8lp@91nrun&lZ&{< zy&#R1``Ionx!I4##}}!+-mJV!ga+BZLj_E2ulhySNL8Fu{ZzC_#V>kI9+$4zg)(t$*)qJb1*DK@(JtApfVU&Arb%oGYeb+N-qbZrqb&-D*U8BM+RLFtw)hx*MdRm3i0H4{GLhQ`($EE&1jwaFZE1@ zub%`I>y!N6PrJzxYdAd-%t$Id*L3MC2!l$O%^UMYrH#GH zw4U}zmgYWA4Pwzz8RF0=eJG)J>DBY1D$&H^veAP5c zEYel3>9jjW{v;0_ypVIJPg|{;jw?Eb^;wftkoi+|eiCHaDnOJIni!!ly$Zu=#B$(b znIuiuLGg~CufkqAD9ua-aKaKi`iX?q78Q|%BOldASn3^)1AI{Z#U!LYJ%$E5eOj{| zgo+w6=jmXem_?_Ds?MR#xiX~Gdzo}Xf63!Jyo5pVi*I%$d!_ukqX}CMxFh1;&=F*` zoCDtE-jJSVNPA%R9WEljJ||RnkBZ~~+F+aE1yFZEccb|=fmw{dqN>%pHC;R4JG3PS zC3Q~njhk0yoC=04RgqVTtG!=5*{xA)fl|aqDko6&(&R9!S{G%G+w1Da6I%MuIRN%2 z*BA6nP0&?JQf6sAN|TQ0FL-Uk-E@@~tbD(faQzqr)eS;nnjU{k+?Ka=3)WX$N@uHj z#qtHUkA6U~fe-8}7KfHr$Fde4R7}2e9&!Elb3URom@TW#e*2*a2l=5OaYRKLUH-`3 zva6>GNS{vf^Kdg3cn;MDmk}-ZPg;2CksEPa7_+eTRv0jdSr!cF8_3=g04LDdm8Or~@nZ9c4QSo6hje;!X)DpYIb-IiKi@s}fx(9|{ zN%nZN^?Zc)eif?rAZ};P;H$dl0~-5&IDe~B5v*)^?z`5$PmDWaxLY_1Ped z{Ql;ebD8{9GUL3nw{F%%e1dAph9pZoaStxU|Nf*kf~Mp(^U7f53m4D_Cw{!3hUc7N zBmi~X&nIIzv*+{33gQTvMF2lI>{F?oWEL3>Jb-boqv(iVfjb=0AYj^4rhowve?o0gCR>+7xMZlD)WziqIAev-A%Bkm z-hx3sxxFVhq=KANhAZs7kbhZxetT*Eg)%NPt^+5TAni5aD=`sBz!})V1*M401S5Aa z@52sH5=}B~%*Pxgu1T(Z|5)8Y9@YB3pz^<)55H{5sb<~3hi-IC>?9UP_)og!z?!CK z1A1HhUmitqC7!#~@@KGy4c$)Xvt5gLe$ZGB!qS>Rf4K*WUTUw(V?jnmnKR1}rM zh{%pY|K^Uwpip`&H%ZB2Dv7L8T^xb>44O0eexJbK`*aM5sL|L8AwgvHK`0JXew^ zN>wOk78Hl#RpVQkr>>X0VJS*kabJ=yWof%Y+w;e-$}>v&c0`I6TNBX;%GZeRZos0` zKXw~GSN2T82mIlyVREoEOOVrN9-*glZ_O4TIK)d(AIYA7$=0}(U%;-6qe7T%YPl{f zyyyA%M1Az&5HGkg0*EKaW%u{02-W(swk*}jELHsVrIIE=5M-%9H69T?IIMLFlbv+Trz z7o1v#Hl6xYNaDRNXfG$^fIV*gR0O=r4u&6Dz2-fnIcvS{9ZWLeG0ekg!IJ-=SB(0p z7La=4$m*iF&D4wfw5R=;y9Y7;hNhkgf`?3PwB=k6cA(Jje(Cdi^#vd+Jh87N zf46?O6o>MsLr#O(3Ol$MgS^6o2hJ=bIQVedsvi1Ml83uO7K@|KVuKQXR77bu%FDH> zfeRCTZuQ5tTom*2`#7pl*Yn$zdi(GDGrD9q@f`9spi``I)@B|@y^`cUsvz=B$484l zw3_E8mC zd!XBQSBVnslVLW#9C;#uC|Hp0ssdnD+25yQ_{g)Z{{~`)%MNiD0@}m)D|cTUs#4D~ zY$3Ow)M21(E|BAo2UO_0YbO+*&uJJ#JJI>wJ5bD%7gZ+-cPHB79oDBg&%g{h2 zE)*SPGF41ypN;Bm=Z5_?Bt`W_A*U3jC1)Uao}@;W^-Spf7|T`7syKz)l{)BB7hXOl zoF}~HU&V6#wSq1TM{x?O-+O`3FEYJX!z_wEdla+*Hv^yj8SpspYK^zf<8jY|R@>;6 zA0y7+<(ogLzXQy*Y6C^u5zS!R9~^VfD6K_b_F&jhNlVLl`_{dh_I`?lF0WD4>tkK; ze$M6P;;)?S%ynNPELLYwHpN-yJ)~VoZ{K`MMENPs!XRhb;n_OUO8d=Yw9dB>p*#}} zi;1VTNKp&r>4LeA2FP3(TJq01n+36O4hZ%g!N0EyfRLryF~`!r21!Pk1$Qg%P^3Vy z;O-WRLy$s{FTYu9=5S{IM>)ztvflN)_p|T4ue};xo#NL|qJtAL6Z%d)Jl9I$=B@ms zV%$?nB9 zTuIvn&m}+uaZ_^^I0_7GYb=PZ#Zt9yMI_SZ9abKOQwl#K7I{p!yL*MUWZ zd9vHyN27W8>kYTltMs83dXcCJSMdDjnwF^4Tvq6tTVQ(~YE~?xg9;akPMU6l zMTKuW7ty5(e)bwhy3k_gYgRa&t8BQNIodrLW0TMSJ9_f}3A!N|l&1fKtR#Kdp>9Bb zL&H$4c8_^uMf~mK72c!qT4~IuSlfIIlfj$-nj4^A1`F59w49+HEwLn~nxM!NZb_nX zYM0?tmSlw7se0r9k8LPlQ#Gd{`e7REihnI>L{#UoG9Kbn9dPG5qGH z$zCU<>4V%o>^5#7T$gBoN1{EF@jZ%TZU5AAfhOO92-`Zd=Rr8(X&+}nC{uN0WpVu# z_@|NUk|^o9gB%lmfbkLMPyE58G8cO0_jx!_Vnbm2?t7lqu}m4wC{kC;&!_%riK83B zdpqLmJ@v_8$LG}Ao78C~ts|`VI$v+2(=RDMYkK&I3*Hn}J`n2ug&Yzo4^GU>eIUhL zmtc?2GKnWE=p5IO3Xj1DBo^_9Z7**ge0&QCGpb)H-txp)=pgd)CK+CJVF$2EJCis5 zkrVXA!z{#E^DZb<%qZ8z2>)TU7<91Aj(C8#=px2gw89=geyp_P+Ca!1Ms6SkWIsN^ z*FA0vHnx4Ub~J}?Rk>ikcSX{_Ktv_aA=w^KKGPLljye{D9^5>_wCNe)QD2kcF>#ZG zkBNbJLw3B=vj_@8Xd+DbN5md4B~fRDeQh*!O|$sY>DQ<^z2^H2`G*V)IcBYW_toQ8 zkJ$HF4heOA3ZvrM0(x`~r-?wL12HeK#n~t#EdaS?AqwlD;jy#(u(5j6)?72Nb${=1JGm zeaPzj-6;O)=FgH~JQPMHsxyRPDQc|;rzi_CJlCLtcn&X(ferU~rz5>})kha-1of56 zTmF-O9+Rc5sEYwqm>9C4Bc!629d%GHLL(Bl=6gy$@13xD!})anmU00k$GZ*a}fVC&%y zpYw<>1z0cR^lLS*+gBCB-3o-hAHp4Ru@(bMTVT)zpB zOQWeW8O&->^Ijv6F?5h(4xJqQFmr<4RE2XU2c!dt62oa0;V9sml4*P3{Y6r$XpK|YWqA-VG|LZ+@fqLdJ;_@&8trr zW_8?%Ic$*3|BKApF{sF_RK$74TBHE|^n;bVV;DE(0qAka;r-)kGDiz}nIZ0J{_IE% zCAu7b$*slrIbOg4qRbC@U0h@h`iMWNa>QUkgf#;)HJ2DE&sIcN^Y#y!(sNnDuW7+i z;U}XD<63z?@X^^EB(eb&_HOI07>mSMlN#wd78FVu@f)=HaZ@q7*Lx>OQ`HogBI6X< z6Z_M4^xw$)59^An@yQioX$LX#1PwSY62HjSHf=iHUr{E&mwJ&zeZK=Xi7cE5mY8H^ zg{Ar9@s9L#LLO7`F{5U4QO?PZO5SA>p3Ua3>dJFyE z5>bTkSlRCi1gizuk&#+Ugfj;O9kug&=T7_>`{n0l(#7tXS-24p!u0>Ba+%2-8M2kze4GV>1hkXn{gDbH8E@4lfzIz0|f)`KAWy~w~bIF|3 z&avTZ{!kuK4`URQ?lGvsDrxl2{!s0i(f-U0N$R76oIBGWSBAZ8`!^rFrF1$&Ty$#8 z4m5gIVty{;VOqUioqW5U(Z}Rk7zdFA{9)ToZAL7G1^`Lcq53_cOH~l}=;L$-0H*( z-6g1ufv$5(A9TMUoo|DK52BNhy>xQ{e}n*&9$1@!?lLNWns0$WT7OM0*F9U&SW*m& zrNsTzt4uVZVwg3yas4hqD5`NAP_Y8Hq8WRW#FOqqgM00t2t#|o?m@a8 z!|lD|Piq-~Nd*Y-k;v!I&GEa1o2S;}`}jd{N- zj_uXi*s+TXnaSO&oBuiiDCtf-0VH45HrSG+wQH`$|eUiD2yMRfDcKkLLHe(h9* z4?^z?`~6IhB;1mHy!)%Q4f|4VVmhz(O89gq^wy1ZTEx|oVxIrhQM z1QxQ?_%7{|lIzB3GeN5%lpVF6rXvy>tz|RXNwa3U9X_^XBZ?7a*jG`C_NV`o-`gSc zhN+G9Y_*QlWCYe=qjO^$L{4sLecV-XX1v`a=2-7msNDrT*=VnvA>LE~2eX$a_;+fp z6dRi@dKG^zxfEz@B`%ECcY2!Ga)Xb+?yTO305_#ukH2^hvgY_So65I#=NB#o={H=& zL1wV}4`Y@bBylfU*?{jxaB(^Y=zErm!wK5|+r)H9C+E4SF#V~^p=h=`X5|9O1EU@8@eLHiZ4Hdr zz#F^g)3s3oL?4`coOm2FjkEje=j+@u=(5be9o{@d8;Gyjle`@E=*?%R6YR}jAawAk zD5a6{5QaT1j3bpvsa--8?Ih%4L!g|Vd$BIteVG(f)z8o#=BB^6EM{DO$&ZF|yLBXa z013!e*U8!i-DU*xy}nd5RL|@! z1BcI+09}&wkiv=~*Kn(v*yOeMdLfC^-&)O)&y%0G$WA}7BvdGS1?6^Mk%)--{1^cb zXluBI?eS&VH^@;o#W{cL#aQ%(n@0wP4wov8SLA=$pCnB>23b9Sf6hE_AYFI=Chx>%d(U52^s|7DDeSCBWJ_d;mX$2p8|F<* zPc1!#POydB$N_TX+nCQd|E4MbOTpIQy3O`JllCHv+%FGik6t~v=;}2Bo2_WdEB)lp zk1D-ajDTJyd*sark^nfQE(f7$H>UsV$;QpZX%>UH@N7=GG&bJTA^hS{qfG>}=n2I& zrki1E=_8mvba2WsWSou&)6Xi(?wW7+>YCe>!0IGM;d+jaHOj7LvA#a?q)9vbThTja zSnSE?CTqrXEvQ!Lt;gJM%f>43n*{V6`e`O{6-TP;!r~PlzUrY54u z_q9mUg?M1u-oZ-e{d;f$2elh7hcnviTCykIh-dQa1Vm*C;b_A*%qAzc2mE_m+C{^v z4nM!pK)wjzB67K{Zyt085*$99lW5l#+r{~rh!Ml|q!7x(xw_DYaNu-ft>oj8S;u|T zq;>K^^KQ6LyWOjs@OpLtA)O9)JljXW5>kBgHD%;Vy+*3+3F-DQs@Lu_i zbElG&-`#$vl5H`|{Nj zT3gB!_&r~VejIDUCKxu(6BsghL0|kV#p-kc3fGdcP7IJrR?(!PbKj@sY|a*=xy8AD zavXfwkX(_c=xIR$k%ZFoO*Y487@1od+JWI+@$*jZ;~=ruBz7W5^Jf~`r=!T2IFYWM zM$V#Hk)vk>39XR811}#)p=3J5-N;4!tGK-%i(Ll0v>B1-XKa_W0;7^`UzIT zB(vekdf5PtZ_SQkeeZrZPrOOI7@CRi2(^hzuma;sPo7ep6>J#SZOg6>;V-mOpnu1% z2l!a%?{@TkRbqGOs+%*^oQ%~f=Ac7hGiw4ZDE&!|*1OB?5e)d6e zXrr1r_~trE(z;qcbl1L#l7wqr22%y+@zf%gSVs&U_3nxR@SGP_y!z67y7;g`G`1a< z84-FH*i&JcOQJ=>YK_zyY3L~$V$8NxI!8oT2k-8eot%wg6{;2ZkVXm=Wc|BRSd?%K zl~_0>K1HHgxI7JrGqc)R8|!*J@1)P>Rk3{W+@6xP)y!OLY>qxxv76d(I#EeEwQ_Zl z{aqoBbDPSz{zdhzkfEAV5D%7?-;BtUc1LHzmZsFdAL73-7b3)`6em!^-re?TWkbiG zksuMQ=&l^q^T|;yMtYMU=z3+2B`h~_;avw!tJRG|-^IC+SUujFu=pFE9K9w|NoHex zNrM?pcgLYZd+UF9xL1@c7TmxBskzx?Td|g^T4=gt^F#?Q0`6T+YEU1mNNdv@o&~!{0wl2fuG5KWEO-RWraJ{sFRF`U( z4*c*37;juPas#%yH-xANx$x_%mm}8a4(~%x4?z!@h^&ZtSY00pGqg510=Z za?%={%S>!Es}(vH=rnrSF?EuJaUZ9P9{0!8bs_xUZoM#swexA*>`AVc^kF%WNZZ3;^quZyVgK z4K+@t9n^OYwPB@R1{Mib*h(TrT}Ns{)HRn$) zr<^(b>2dXLjfrhvQ^Wi%sDa>%=>JD|%Kt53<@qCGbuS#U8?H?|q0-8x&y%=}m=Vks zqy198|Dv_-waW7>_ZaF@Mn!h_mkx^s?Wn>O_bM#*x|+y^-40jj-Hb(D3eTW}!u$># zYKC)^)5P9yf_s<=LnJt(#_y_Qj&489g7)<9QoR^TYrNvFwphZxZv)xID*b0y9h4H7 zdpWb87HZB+ExBO#MGo|*KDmsQP zreP_6;tHG~tfy~wfM^R*0aad*Q!!QMd(6lvl~vZjx)jpMHQhY*OVnEoHLSFMR2V95 zi&ZT=;(E$Nb^Y0k&NxYj=!@$1@)qn~?8n(`D>}rzkdC^TEkYAqt;8$YkD?j}u^Iwf z`?^()cBikXMTNUe98a$z<1St@P9(TS*_6ssopK&3SAZfiwZ!KyIFSOGg)u4Jg`Or3 z>{ge1pl8&8RJXHw{T=f{EK#z0=JOlUC9J=^2Nwg2Xp<)j~O_?U@`a{D2WXAZ1@mLSyIj&||}=%94S^x3fwS0J+=s~7BPk%f(y8`PH>Q7r$_%F70x!gbmM-ZB(NT zui4&YX);$oSrwedF2j6;7Ur1C`oGL+08D1rnwPH~cQ2P6u&%JcKk!*N`ET6?J3ej2 zr+l^cf!_XixO%rCOyEvX;G{s7n50Nfc>t&P-%7!gY`1K174cq{*%HV@2IF zb}bW&5bM?9S0Pw?-3t%GtO?6}^APcJ`VtC@VD{+ld*VB)C%x!Lo-H^aT{e>BIV9Rd z7U#_B9lWm#F-JKXO7%Kf7uno{pG)+V&1?i7DT} zzoLd##ryhkx=2`neBM3`&mXH-G=cDp!!S$4PgP6St$AU~~m=^Bhe36m;ZIs^14_Rb(Du3L@P)&y@D}yZN zd5b6E`@@$cK4N-?u`8ZBg#i>MwH&0a!xGZEOG!t6*sG| zWsA7e|E|4*{Nc1$@^sWJrZqG-7z&q|TtY(H_j^IyyTzYId2@y_lf^t^^Om#-c=Ezd z!g>wNhBMNYVk+pB^k*e3mp*oicG+&M?%Y=OQ5s|wYA$*wQC#vvBqu=67Z|O7)bds< zQItQw{?V7&9K&|nx6O&*RJgePSVot&p}5}ia62@nd&6>te_gV~g>jNT{qrRJ11PUx zJ#0(h6$V%Mx7^Qsj1D6B$Z6tf58c!*E)pLCm?`P6zYlcxq<|wMIVGOnAu1p?Y_rr& zhF;?X4uG{oQ;X8(kvU>==VHqeA6;1%zh!+Zz_W-2bbj7ai3PX?Ct%oynizJr#dTyr zITD%WX^H1!bC=QIw^5w@z)^0ed;c-9g95u--YodQu!m&t7x%-zal>1B$)$A#xF=1C z{FlsT@==YioF79t@JMrPmu5xWUyGX9M+{HVi01pM5rtGybnkrOaLUg=y#uOo}68wi4Ph3;vnsLY)Y8-ku;l4JYBIm>G(>qJii;8=U16Ya)Y@q4T30$RQKa5cII z$}r~osL$C7_MRMXQ&2}#ls*uZ^H?a|Vq0lQHk5~)OD%tM<%6glO{p6hiEaK)OL=x` zGB5MHJ=T(>+g6=QP?wx|opkEb!tTglBlvqE=^kOI1TEy)!3)A0810ik@OpP$^B(|; zLN6ous}q9QNxuvx7-$?%PO2S}>m&ko27o-^9B>LqVbp*JKY(a3lmZD+d2bML@bu-v511D9d^v78t188 z#0}b~PdFX+HFP63nY#a|#$!09Wi>gpcI%Q@QJRqeIQ$o<&_!cp29jfJ@BHH;)-iai zhpjWqZ6C%%J#UyJg*hD%zxE)%Y-cL+)hp;I=S^x|rNk`DTKA+wBngeuS|dk+**IG^ z7n=4J;jGS&5ASBaX9jQM;T87xN@kht7_NO!)=C+(C2B7;os`Vs<$j(#HENLXT`_RG z^nEc{#rg3b4RU`%z5r?!Y)$&^(%Eg&UEA6rmX~Huc|x60Mk1R)(|GE?&)QOR5XJGYKqT zm$Dqm+ffQVvc7w__-qmq87p?POfh4Lo2>pl1v{Y`be?-K>GcY_#Gr4b2B}zU<9$g2 zC7$eu<=Cg-LtWtc1CtXIyS&Gv6jP29b^#Qg9j@d`dZW7Wd^J_^zvM1#pQ#i&Ja>wl5f9qN%xnE%7L-&6 z6Zom2cqy0;V|SPwZ_^uUczHBwP0dZeG5RYsMID$V^+p%9W@e08Jc6CKUyXnZrjUuH z1}cg^9x={-a?;;3dMN>|LDzK?grk4xT}qxmL@8}E^8;7L)eStsaysIIPb})0#AHA zs?7jIxhcJ<8E{wZcJLcu;8z+t5~G;fz3S`_g=A%|ApOQ@16}N=sKecWPF}Y8zS7J# zGhw$X|KA|r)!U9AO+XzrZG6WCnN_xc*mgJMG3Lv?i{3V;-Z!;gkvS0gEP{#ACn+(y z@z#@5l{Ic%YDPJmFX9jDI=p1+n!mXuh<7p>)P8Gn!fNgccWU;M8C%O@3(pjT4|q3l z64qMRs*uz+d_*SZZHM-KXP!0)7YwQ{c39Wf6{`KoH1>%PfG zs5e(E{qRF_MNZX5Gc1kruXP-Wr|`Yoz7Vdt_~i17;dxE?G;`hgs%;gC*h=Iz zu<+G9#(FlnH)h4Bqp2U3ek!U`f@C3Jp3UiEjCLkA+kh8&Fu!(i!*KXsN(c_#@Cs!q zl5!Xxxgx&HKR1+(e^7l$IiHK)410f!pJ*W&XsTw&Juds$kzn8wDPU@dHF%M7c~|53 zQ_-{Iq+U|ap06R-wSiMhTadJZFm+MTg{k@!i9_|dJ_`5N_7D}qVuMUDiYayrJ;;ov z^A7bds({xq`Pjy{q(8r|z_|%}%Ei^mV%Il22-Fzb_KOVKY2t}5UYzj{&4PW7#OIQw za|5I;XmTM!B(%J-a1fyP^)=WhSNumAZC$lDclz|WXucZgWpz`}!EN0xdcEpZ z5q_w^YGv8>x8>so8tvD2yXT^U%bi}4mtH}s6<7ydIo~4rQ7^~dE4M8=DkY-M#mHXs zz2Mg!(f0>lRI@6v5fS#t+w-BJ8K28c)kQ`gkSt;O1%;$;EDWJs)0_#;xVYW2<7;B# zY8vutX0t~VhGCrKOMm)uqYt@`Z1UOemqc!F&EUM% zpuk_zfi6k`bH1Ho3i8@Lwsz^q)7kFg!*3!L-gu{PE3WM`mHD7F4d5q07BB-ehH34s z+ozcd%d)FGlV87&lew)`bDZLpwo#7rz*_gY!>MB(o=Ugl&deqYkQpEmYF&`d^MdE* zLd67Hr2fj#>|&R|%=nWJ-Op3lxZ1-MI2wqLJYm*g& z#*OM~?YFSIA?+~g*~fl$S3fMkWvp(x=|;SB*1q_u0C;tXG~>1EOTwqi9!@=tGu?8^ zBvN7jbv)H^XKNt9&E2f2t!6rBF6`_ax7{p(+W7~`>hlkA?clrko9=HYlw+IyB6pit z6pK#2p|I0FCZ%IB(*-V54F^tR^P|Bwh`*CXCO{5TeW}|8OzQFNKJids^0g$Hlwjl= zq?HNxL1GE9CGHt__=!~A$vfD)A0Ap8wU8@tI5rwcB*!yzQN%x&N?mGH3PeD_Mvz{Q z^W=3*UB^8}T36Y$&X{=dsn#LKP75+*!qlP4Q@9;gzP@0sUZ0Lu{tMm5hZ0sB!ruYL z#85r{N8&tUt8$3w7^+`qVOq9)%>~CFDmk2e*K$X;D1bd`OapRvA8|2L$Q;~o>LX#x z5sTvUU>R6pAqs~<+iEs|P$uX!H>)%Y)`Q;^w8t&Pl!r?p#&Y<52gK`I|2u!%C!@Li z-W4A8p$^uQiPqLEaUX{SeGKicRaejs)z8JZJ%g#=Lon>WWYy9N)SUT` zQgwD?zP1K&whtH4RM6LFCUh!zlO&aQmA65^>b65lv)UYTL#Ze;L+ixsmL*$8fFV%Q zKyrm=pZOck^kH9$r`@#E6m=Rg*0@gi!qX@^W?}EY*=1c*=6F=x`DP%}6LR-@2##r( zn&cq06ZLBigf>jKD(STJLPLE8eS1eqUl%F^roqaWMy%V6ayId=%KsQ9YQ!r@d-0={ zgK!F3_J5X?PAO@sta3=U0TGsOPMXFu;F-udArBfAA^SsIM4Oi5aWbpvnQ+_lhFWsK zkU{n2g1N$HCY@M$KB_B!P2L3}))iUJfD;%ms5EmG!@E)QOdfmWw*--Nu0*~{ebCuy zW4wuh!CtXt#P+zXfVPq*qK_zdxP1rAr8kk=U!-BBVQqs=9U_$WP3XP%JRfU1ccuTC z0LqfKA#TK#%{tmHC&3Qm!XqSjTLq!}9Nh&Y7?YB{K1g>LV(yWrt1MV($K5#yas1Tz zYUL)T_ln)vcRZC@bS;ld3<9%)EvR;M&6TaAxX3)OL0*s%0b>7j*7*R1{IJ5$gmj{( ze?ilhWt`Xuwm5&mY`?4j-OYcMzodE@Cn+uZu@b34VKv&k;G+M z!Dt%R=B50vV@L&9{W@41`g}HKk^n7=}AQjl9 zSqV_*m#Q?zgr8pT5P5a5+$f!l5lD_2Eirf71V;-N#}M{jv~T?5VzFI=Fj@*Lbw3%5 zo)!7c=5B;mHQ1>LvOzV!xNV*02rS2-ZXv^|F%QEonc2|6JaBkEJ0C>}oLrIoxNc@M zye9jkv@R<(p0q%L8PZ3nCl(hiJ%T0e!F`Cz>7r~gw)HnY0b*>))i0X85}p=K ztls-;FCBODh4ZDS(}b;v?@wQ!Rf_5gaZ@BoIrkHI-dna^k@25=j3GGG`jC$~!WpVfKB=zxy0`3yr6IbVbD-9G1 zydoh~RmX2IK&^}zce;ExPaV7>kN1!q$XNMlr7oT)emh+F51()u>X&6a8?u2_&yVlE z?3Qj!fzEl-y`|mF20XvhF^@WcWad;E>R+WqG`wO&dNb

OR$yGbV}9S)4Mx*uU;$JLjgRD;$(+gF<V|yWE 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 z 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

CNwFogn;Dy=h)kPcr48s3*W-8~DMm<9Zja3w4G5 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 z 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%0AN~&hQcIF{% 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

C%mV<;`oUtei?O4`$3M;eI5*NWB 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

4MvECxbNFt5 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

{!n%e^7g4{;#_uXE4 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 aA$dbvdrin}2VOA{QNBr4 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�Qi{8~6nA$o4#73JLvRbOU-}EqdAZ0{U}OxQ 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

S<=Aj8Itez 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

@@bLYZzhaP$Yx0+u}OVFUz^T`{TmL#F4!0xFE ziPvRo>irIc!CU(o%ENpvDmLB?yn{tTa>}`q&-HsWB3JFjsir!}zKeCgp@Sa{dI+S~_kEv=pV&$91|39e zng$0AM(IlZ;;@{l9~X4f$&=|rcl6K);j0o<4}NzE4~ZEWAHoz*U52a)U(|4_z4!?f zQ(ZUMyK8KhiQV)KgvWC4} zovx2GRN|#*+71;fj1u)=<49FC?MWCX8PhDc|>t@SZa8;OsI1FCCzr? z?whXpMsfJ>FNqi+JrS3Hc%!~VnOCBr82r8>f2bHbURuf$5tU|x1)~s=-407(zwhPT zyBd`{(!;1bj7}Pc!P+{+~HvFx~$(X1UKA zf!KyRuVSbK(AvCAdfw#F15%`92eOCnk^8>!($c^c`#7cYktCy|5vSrBpkk3;s6c|P z#L&H~#LWdwu(M!KfLQ&V5XLu}+sfFi#HCf?p&YQ|#iGtYG3 z|1e!DvAq1>qqoREBmHeUulAGW%bGxh(Jdpt1b1d_SDp^7gg@yr;W&{H(4IZc^QcVf zepr(QmYq@8DvZbNGX4^Kk(a*x4qcyC5oWroIHRil!TxArxSyv zf9!>5p2e^1sxUOnQm}aM^S_IR2_!Vo(slhB`60-H05a538c>e(5!@kt&RB-=Aqt>a{9|dtH z%?vp^#H3p!rYh!NE(|FhPI;?~r<*4$_<2iw^kWp?8P%%Uz)ivo?H#Y_C4w5eEYGr1 z+3x)hAJvicDwa_eJwjiogV6)QjZ<^#*8RxgIeZUj@KT@%w%Cl_tWc_Ps}6D#2n-zJ zuVz-SG$0r4Tw+NG#0tcZ8cQqnhBuO^UD@$6MU4qqZxi3pkaiUx-=xHHlQ!EG@9acu zUz_&ib}>VX^Q?8)>jFeOz9(8G0o1-I(+!P>3^*gPr--YOBsZgNzwkluIWVoy#eD#= zY`qES|Kg=4?<=6D(S6;d{rBo~P44h&gj0uycLnO~vWrsz@XqDmP7HGLLVqnF-R^Kw zcLJv{;pp0th3LjXk;3$WN*^dm9o9LV)?d(^bxv%;rEhjdY`QJerw71=l5(P7kxk_# z8yRsk*P82R@+-uGuY>?ZEE0G z1+>cmi%SakUJ)ArbL?EatJl69?UOZEkR^}a79L)Kq|55Oj4RDf`!6P`&# zRqm*##mZHY(xw(z?7(d#`=;prRw zGVipe(S6`fy<=|zVX|Y!+g?r8`lG+dHa=N6!GohxPVjOWsU{Cm9q*!K7;Xl4f0xtA zJ0-Ts-+%k&S?!)>Wm&r>^o+M&W@*+F5AR

bQm{d{D7mVzU|2v)(XVn-orcBNrQ+ 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 OM3pG3jB?;7$eD;qEdzP3C4xZ+mAh1M%sZdI&^ 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%0AqohwF&Xp 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 Z(K{)B3T1)5SPM?`V0BG&o}IZ8_Fs`j8Y=(* literal 0 HcmV?d00001 diff --git a/docs/assets/dilated_neighborhood_attn_2d_vis_light.png b/docs/assets/dilated_neighborhood_attn_2d_vis_light.png new file mode 100644 index 0000000000000000000000000000000000000000..36ceb5d293e3af32b241d2623f76397eb1de9abe GIT binary patch literal 2228650 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%0D!<4U(ViF(axheaSbgctKc6mM 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.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%0D@gFFM&zvr$U-^0Zqw*rg@lDF|gTydZke8 zlkO*Q({@gKYM%F1j#p#A8QXz5e%AAYXjNZHcTpRBtS~NJV4Yu;Pfd26haIEVe88Dd zprx#Fc+g@VOVlxe?HWV!NQI4}{VK;~l~LR^@cRRn)F$}?QiAh|Nk*l5MYW{8E+l0> zS=o5}xRTEPqG2S)w;U(d?Dt|M!}n83iCVGqrDTs*M%x^n2(Fodpd#U?G`6Q++r zDoyE7^r56z$}+Q}3qPY8Ci)$02ouEMS`NRB_B>%mt$?%OLum{ke*gq9vn z;Ux+r2#kIQ0`+a5zphVrNZrOyAV39g(w>G4`poKMc*{kT6BF-^9!;!a)!4iXjGKmq@F!=Im6Ul|g-gMnH2Y&~h2ZiL zFPDe2?OK|6#WLIv1w@Xl2@N8&j|)WmI$>9G8sYK>LEhR7R3Y25c9X-7A@`eKOZxwq zK^c6BrFGX{@u`}h!T~5 z9phSAsS^CZZQs^(E7FDvyQFH3u90gU+*X?J6C^z`YNGn>ZIzS zM3UR^Q95*wgUSX6Fa8>5j=h!#WVgN6@bgO1VDZJk zRjVw*A1o}gpiEya=Pzfxxz+LS;RqFk$*%fo=WfM*e+gjjG+}4+?S$GQ8gUP&?BD-G zDTFzps?uX4$nTun3v^DLT|#@}zja%_`lvyd6cHF1DYS`lSMlXKGBUHz-@VbLopGvF z$d2ftXPa@eTdK-oGvlESZ*vB=vL!+MmfKk~gs#zhoc^u-@b*tun!5kpH>stPm^>jK zI8fZL9Mzn3K$Waa)y?23WMNcz^#07a@l}UL`r{S>GG!gq<-TH+I*}EHGnd7fP+TT~ zt(`8ys8dT>^2JlbmjQS|rFw5|Lz=eSL1-`0vCrGAOvQ6nlGH>98Mqj#z4&+|F3Ii& zTIdV?MOtbjGcBEr4N0YmVpJ28zHaI@`lGXfwb^)6wozr(UwF=`_dIT}3j1mGvF{~u zM-IUJn^pWO{mcBXtiXTpi*J!9f34EJF9JsUS~8&(4Tgz-*=lZe=gR_Zh?7~9iVO0g z%Aa|@SK9L$Da&d~bQnnG1}_NI*6hbAS}gm+WbRNs8rgZn4SFaa=TWSR)*DPNR~-%? zKSe0%;5iq=!vECm8&jdD!{~LmI?~jfneKfP?{3{VvV5F7oGB{_5;fU7XI)STh^C^d zjlV?oQ^mhx24)FGAVfNcgmmZFD}wLd4Q1D+e^9_D@aUSf2IUe;=vkkm9eOmzG)+2g z_zo6Tg|a5}IM53!RFmC(9u*p`Bw4`!Rsjvg5D3B@V0W?jAnkj8ZG5!SV3Y+qWA1oT z*%t-x``4^5@YbGrLwLKIE?Ppr?Cgbuggj+C-}BNnFLJ09s+_$lv*buMOX&OQ&$G}* zNqwW9shh;xb6|kxZ0Su2fqv0U-Avaeaez;$bbu2Y&~i+@<@;jUYpHnz;V)RSZmC)!gd%46HqLvK`Xnhn*QW*4Z$k0^e3a8LZJ~KGtq&z!xg8I zbQM86{i3LgC65-y?Wa^rQh83h4amBzCPm)@vEu2+ScG(E#f4p`=D$dgxYcp+>)+w6 zvRbKht$6@zevoNH)9BDOv;s{7EU&e*7-0E6Ol|r7H&7{2{XnCV6au$P8 zOmLbR+2|XrG{Gz3?|gDBhL{zo0C1{d*eSaeC<%FdJ6z(NJ1`)A{84w@GkU-3j1hy#C~}nUUn>gRI#ds8aS0>_b*%9qmav7z>33Z@3eMonZ8pV3g~Ux_P?hxO zb#LziAUuf%b(+4>YJ7@>Y@w24R;U$Ngsf8!Z?5JyLHaGsf+k#^X`~RyT+Z!nO(4>? zh^}Wk55jjen0C~1u+Mz@YDcM~SpxvyHo(VkomcL5ul@e|g-4jbBv?a1%b9yEM`WXc z#z>UK-o?WFfi?WMitmE=!6h~k{aQmF-KHix>8NpDWo#bs4DwhFNa})*7Ar}W0YZ5d z>$K!1)j=CNP0#OiUAGOhK#iJIMpjc8DQ6Hc{G|krQYhh}8o}rHs)4Y zq8E6x7~lPi%m$RJku^uK*tJ$n={AigiyKrzf`fW&2x?bs`2qrS`!ZL|4}u_)7+ z6>RCf8A8Pk{M5U@o&y5`6bS}IJFZzg$FuPSa;FJ@m<}Gkl?Xm%cv<EO6C! z(SXJhr!o-nc%jkqF%TO2VuLI(7fpgGin_kC5(gp6PPeJOh$u z<9t%fWIO)Y#N~wN9p{L+rs?$LvJn@QcPSz{0?Y3oY_4!i0Fl2w_^D{-a>7)bTqY)6 zG9t`|GL{XnyLm3x?;kF`(I@=18nPqSjax zAsJ|`e!s(>JKN-QUDq`KE4C~do>VBzF0aV^68A3;h1}A~8jgqsfM;4%-YEG^3nlfy z70MN3eFs5e8BzTtO6SWr+0+Yog^WUXK{r;hTZ zbAmE&_~0qIesXp{8O43>c}~rVs3k%&Gk}2x1 z+&TXdOv^d-Qlwb|5leBn%9Q*d!|quw z&TJ_WiD|#MSOR42#a5rI%7IuCoOIhwgy~gRjDRi0jD5DN{3<;TgGIbH*bRXGs?lO~ z$2$-2FMl=4+=wCPY%QjhKG0nYodSSJPZupV$XV8^15ne>EbAIFs;{C`?Y&Sa{;YRp z|0lrpAV&ffucvO{9VRuCx8>vpd9IRWAk7%bV)tx%1c719%tn3c9n>K3xfTycDQ5)u z`T_S<0N>Qr;drBmk>U!mY!UHFosKNU>_PXMGz$gY zv~4&^_mdU!2rsL7%2sK|uDem2e9T9Z7y^vStOg_6SV-f&PZIs|n{9ENLuvgeiYgft zXg3O)_TqnyQ%Bg;*#foZSFNR%DBgv|hSFWTgDT-B3w>?!s&tc$zz6~L#6&WOJAX9E zsh1}Xd+|@C)A<>PkB0hQ3yT*VXl;mp`lBh8%Pj9H z#c!F-d?Q6z=@3rae(F^^+ z#I4wvye^0pj`YSjZ0c=q0-xWw&@mUc`qCZ;^NqF?R|2&Sok%>i;%LFA_B8>bE91Z^pWOm0-uXfG-Y9!Z5w| z!;^-tUyLQpD5+qsNWYW6B#c78BP3|@3rMs4DTYk+?W$JcUy+wh=vY4CFB(aof z{zy@SW_gBVFj*9 z%E`rFAga!%JDqVFKz%JlK54vzH(`N;ELedhq~G2HS>Fb(>9Speb@1m z_X9oQpme+KX(|6#pe9u zcE)XFDLl$5kJINP=Lv$lI(Fv(Pe zKn1TCf#-c)EvWY~a~09BZW3^sigegr?`R^Ug&Bb2f%s!>Rhf<{nsq~E)%(m{Ud7<~ ztVJhQ|7}dq>)|Kxq9RfJVN~zUAq1*xTEUT-%y3Hj_1ydM9yR(ano-h#Hwu+d7n|T?C)P;wTOKV<_6BTLN?< zC6x3D+$wY8q$_W3|M8a-Oi20l6ahT*)f|d=@;^2V?x`KunbkN{4Eu9+wBk@{K5nA| zPe`xx)?T|Q8z^*>w?)kt`fQz%D1UNj_CMQxcl@JGzMC$xgh%5^>htt5;i2b3Q}h#4 zr?Q6@g#we7&adB0+p#pIbp=mZyEZd4^P-gmG zqy>Oq5*F*|Uyii$#~~N*Ct8DlSy@DrVINB)+iRHSkv-x4V3(>Y0UE7fcAKqv8CqT& z&_DkPf9$bCF}NLjmM2x4*C-8*R=HEI+}W6om`PM?F|rw~J~}t~O@pg!mOR9-QUi+oNbx(gtocjK^oZR);u2VzkOjWRi}E zYL*)sh9{TfI+1^Idhj4gzCpee4Llb98Fg)LV+@me(R?I>u+9^p4EdV$O}{bcLy{OB z?}u|c`hh67XeGET$~_~7PYUA@`8zW$YtF>6CQjhC&&$|XMZvr-z{w_<>kD1sW%T=z z#{{AN{#sKIU|fXGn5KJi%!I=7O--|TR)Hf>zQ8K$)eeeHmt}f8@oSu{skkp|&S(~A zMGZ|~DbS$k$9!6EwAQ5Y;Fw(LDV7lelSS)xBd?KMPg))?J@;`tvHlx!$842y2Xtg} z%g&AK@RdyG=Vkz+5gq^Mg%@u56pr)0$>FRf>+tnhn>=I2q5t8_Q^-<;0FOveHaw>! zAZI)k#mb~7;}233Q}E%Nx=#>GLRoK!eKZa%&A=NpgnzcXHGd12{0g%lvOr()$5D{? z(sA14u%{8IVwek^`@_psE&8ZP&hJ5eK<-G7uQ@ZvZ=+7uXCiXoAUPTQlsMmlsO~s( z8nnv$9bejCt1kKH-o4E@=`vk=DFpVKF-((5g&63xOO$Jrp5=e+3zsp@nsBf2w^jp4 z5QTm%`z>u7gxzNs;O&CkRl_F1vJ3{R46isVSsOJ+Hz?U9^x(GQJ&y)IKWe1;oJ&gX zCNa5BE|lTpZTt=TkgumQa{(s2n^bSHPH2$B-XsMABx-GNtC(2_KIq$niU)xeM3L496!J>465t(8XG=qVNJcm=pfv^q!AG4&xUIquyJc!%ukwZ}$fnI0LH= zauF~Qe#yfM4+xEj7zr#}{rKmlfCvXRJonBhvgwbZP93%E^CdM-t)-NHS-JhD0n2cz z05>emR5R_+kR_OCyTfXt=KT1TgZt*|hQZ?M&%g<)L-(}qkH@9FcIZQDU>B@|5BOt5lwNHM7BnxwCXApSvndG4DL`&F`L~L z=oR?LU%bJb;0qj_?N#Cm0<8&;$~&iS2r3by`b2Jv{_UVLOpvp3GqUaOZ-_Bnnaz{S z{B`}L%UH5Uy~C-6Zpi`vf<0*zJZOp)M@E=%D+BG)P`qn$BZj01cC@L@d@!sBTbheM z^%vE>ZMI+#-Iar_%C*dX7@J4oWOLM8vf$_?=pl2!2|cam@uZ6(3ly zLb4jNJ=NjU={LjS&o5fUts^TxV^n_K!S4r3Ew;Vjv}wp8w)77dZnZf-%nmW*&)ILG z)ZFLgm%kUM4j+Q_qYY5p9kEM3Xq@5RE8dUIsH zLpcb<2i24Go8J-EI=5#vZ_)59)NKrkN^g?!1S1aDT+7~nfbI7LgB*`TblnlLAgct+ zse_>Etxqo&2u<4)X0J5Q>f39s0ui4)`rMt)gkPHf^f-lIpWM~k%+=ey@=xeHnelJW zz38kkh^#w;QJUO++5c6DR3?!udDy^v7tXAsLqZoP9RJwny93vy3ZwcwS;<%SBb&-+ zUO366gknvbEo{>jJ6|=gT3e9=nf-JyN5?;_zY9o6FN-LsBFSSHKZRN{edQ;!4Y)2UupyV! zqR@Dr-@jFzY<66>cZ6|a=i5zTxIbt18M$CaKVM|1KWheNh5?YKaA78#+G zuQWSW^T@Kzj$0vz*K?C7ixi;cF%^@%#j>Q-la`H-fVLo$Uro_Dp5vUIWqKcsgP~V` z(W6m8P$pHLNJgKiE#3CS|FOeFWCavE=Niyh(Uj`Z$#A{!Ue24*j zr_Z_8AzAOjQ&q4#T2#n<>rKZmy}+{Tojr?QM-94O(Aek%V)U2lL6@hW6ioe&FYuDA zaUc~RcyEy8S8LTc-UeXbbnv?1Ll$IEg~zKh#peD6V0s|C!?yquj5s@jElOP_3#stR z`5gPf?uI?H>7f)}@M*@PK@kO(=rr_^Ij6FTM=vNy4H^HvivsOPM)6LUuHH0F_epS1 z3*}kN@n{h3Lkys_Z!BSgOf5r4-Gz2Ckp`U)yeErSrc+OqrgC436MNOymM|!11yJ4{ z;{e6gl)h1LW-Oi}`cd;OO$-Bs+d?d8>n)BqBmPt4aXW?}K4+RpqGF5hXC&N1@{X;F zW+Bz*8z8>!ax@oB==~_K+x2y$_#rY^$zE&WGJ_aVg|3doXMd&m857!NJndn_H+QQS zG1#hx_3=v}E(JF3%D31vMv=CLBDJ)X0)B~UkNrFL|MESP0ei?5o*S{n<41?tqKv6} zf{A9lHJj8KaL}T(#I+P+?n6>jINw@`9>RD^l!aD&Iv_Kev(>`gjWyyP<1#1ki2_8^ z0Gp<^^}ko8&dk+6`}Yky^9?JOorbf_JQbFQiQeGA-Le|;aKH*dDS z8Nn`9ZVdm`>Su8D`A=v!YRRRh$*1;%o%OTyhT(+RNk8Fv64Di@Ve}(O+ zIi_B)zp?Atq|ay3WWJ?XvV~H;>Vrqq00dIGx@~lpKyoOv*gf%lVUkpF-BByqpXU1llD<(3Ys@w5BneO&UcHkg%>sL2wL9}J$q@K=_l z+KE*Xb}26g?S=zw8acTRY#>hC0RwN>IT`N~fQcqMtzNQQ|LDmn29F8tDlfgpiZkG6 z(-X!?o+!O4C9lNHXAz)k<%%kCA*uo09JCK(Ua_OYxD86NAJVjggqSmmP(u_8CnOpJ zjU>}h!Y(x8ypD-4#UvWB&QQrJ%a89qIoLjSU0TKeX>vDv$~uD}(@nlAOedAe8HFXV zmp*k{0mJ}ll>AedQi}rKM&I&@;E6L0qs5yPexuUwkTjTbvHUwmEI%F{aVF<|P+M0( z&(Y%Av`T7+Dt&Fhgp9)m*qbjDJPKHu`kC#kw6YUcHW?>Pe3$pVAqM@p7R`UAAAvO? zvJ@?m``UFfaw$;Ttn%e#`B#Fc{?7jFGmh*You6=GXPY4U96g{4z9Oia}Nw1YDe}uKYO9EAiK0Zi#Ih z*K!l%lUyJud+gn^wLQj=L7P)gTZ6!hX*lqS{Ogl{Ij6A&rwMn8zl@UFdAJ_D|Wt0 zl3}HH+fGg0+>U#1Tt4styUDe=SV$?h@t1Ui(4{wz4AdcGb%_DzEFvmtg-2P(-d%`(RHiD(I8w-V~S>V*0_l}JgY8Ae} zHQQ((tFdK(2eZYwM{tZXs%zEP)MQ6UHIN+I3Tsux$_lWb9+(t{J@%x_I z++Qe6OgvI)|ApV8!OXYG0E!novi+|uQeQ!76p*V2kp_K_CjTT5?FB#&Q1VA{mq@XI z6_r**41DBc=V<=CO!jOtse(zK-k?5a0Ms?T6||ami-;G@4IT^avK7pzIh?h4?Xw`e zJ3&+-%b%@gK<&MkGCx)J6@?%6Qsr|i97g$Q$lQQIoKSbUuT6=F%%@7^i1ColKiNM9 zjIGItTT8jJ1wSHPj%}N{Pj}9l4U1=o8Iv_nBYMaanERO|@ITzc`J*(lYZcag{~t2$ zY#o_mblLxcZ)ac0%ZEPkWF5BPB~q8uEv-id=^OZY6zbzC6b$kF^9O|}10Rbaw zpREgS1zh=)io5w6pZ32*zspWZ^$y`4V%sUamaUOwF7Y>JM7fB0=Iao-ID$dAYg6Ft zx_6c=h?9FhZ{l?7k7ES_$)sHufU~qK9h)i2a;XlFxcMVdB(hm?uj4Z~t9d$s#w5AX zdGDz4x|$k4c6T~syXlfR6{D+>oG2n>(#pAb#z-i7*uKn?0K~ZvxY~$)w~~ncby6>o zHhi<`#5hOPQiA&7XKLKw7YKak@gr}qa4i)ZswTs>%TW@JYKN;yiwU@hzsD$;TJ%eQ z5BN`3hl^wnZ}-8?G_6Xw0{HEXR{8u~AHA2!G)pI=L0(D*QGS>oK^{ki0beqm|DdD8DrtP_wa6|gxP9xPwk&X%o zQ9EJ|HJGs^rMd~GN|DPhWGxx=cHn*s;(v3!E>4<{f8LU_Bn9i%-Q4wqSAv{o+AG6_ zufKr4h|IH#;=j+`7YI}Oi+khI$tVI57HV800EBYQEC|CX&L?bVlm6zDFkSD5mi_iE zg$#M&s|56ry05j0Px%{>MtFGZQug3fw7=xu$M5U_K%29UkK`E3iURrMp6xn8>s;l| z9;ZDC@Wq@*xO!-x?2JY3cvmTY2opFbXGZ#0TU34a!ZZ^deB;g@ z9lR=TuX${K+_uQ7lGi7Qu75UcR) zz;th>o2-i_WxeiSU0vr_(ZKhp&JJo5$xV9SFBD>v@9OWtDey)p0;BC8T#dwHf}bI} zY{aK=4VZf$*=hk3$Zzj{IG99M0M^rr`9H6$B9qKZUo?^W!+8FOSI?4JR2rVK*5bREzQr-3dRn;?t zXIS`i$!U;EWX}7^2l7okw>$YU zuhWRNxFF-%+riv}z=>n+VQKvZU_N^StE?K!N`=*gmWMd7JsnrdfA}H5-&Aq-5{!M~ zNYeK!aP`c=$nVJ4@R#XbR1<7j2XG&FnZ=#X*!={!2?+GpyeeaX0Ez(%=YPbt6oz;W zBiLr`TyohVHVOJ$(@AL!RNYT%(#5&mcmF}#;WVAh-IpX%+;+wuN`j`>ht;akoY_x% zMBU>psfWwR^f zb1Y2FrdWzT)h^=DTYoi*n;S!NUDk<{X|ZCf&>WU2i_-cW+QKK$%Y|#8b>N3D`(j`n z%3ND%vM8#~{0RIFzF@BvLDsjzbo6yNhl z^8Mc2TXK$-p(6X^AmysjEoKZrX3Y)*LF@I8Bla1i*WEOlmRcz7d3m*OvM3x3HAV8; z@84ACe!#k;o8)R)D`9k6xn~T2cv<7^2gG8h_w4>8rkl!S65b$af@3tf9H^thW|c|a zi?&Er_IpAV53zW0*{dUN6L_fdxcaWthDG00={i-(_!mC>*O=c5MmwoedL6pzj3EJh z#(SE*JN2%qp!n96%5BehM5rVNGZS-FD24JIscE;M-f~ z8K{*{r8|ky=1DYOx-9~Eh{GM7&y;T-W3sDR8DM#L&sC-9LqC-Lgb-lUbKnt3>3crx-J)BIQm2V{1dyw6q zEpPhqVJfEYpY9AqOZMp}L_dz)K&p?bm?vhu-(@9`f>kn$!|ivfIHy!N<2hNrJm1cx zzvPoSqliB4ssSh9M)HTxK=1LDBv9);VRkS1dVx${ZQmEux5wgzI(Aw~)mgz+pD|p0 z^)Tp!dcJDBZ$9Jw6XNa9Ba#TTXc%>yP2y0Wm{x@?#mzE(N3SOQkuf9 z9E--TGtu3tFymYyCVTjr!;jv(>~zu-&yTOUoVy}zNn7(rOzeV&ah zXmkA`(}1yI?LlR*LW%(x|A%?vF*C1$M1KWsi&uY=f6wIx%L?V0}El&fM9&*0qCWcQtW#h=L zBz>U1z2Q!K9om{^OSkocB3LXJXeZWeXOkxx({jpNfVO9jHz$xQFIqDP@#Kwkt}6W>rVdX`xoBN-+pYOf!Dql0zXyc zNfB9nY&amr^b1$dda-Ws_MQKGYmS%Gqb@K0$axZKgzD=PCV*nn9Sd|qK{^3c56mj- zt6YRMvcrKkjcaom0PXa1oDzgWoy^v?>;5n2@()ae;p87fKjH-}M3!y8P`~MZMR;lp zQ{df2IO{7sTo`}wpr(oa{I1gz@PRPrs3K~MDN)$9w>A1T^NElgA0<_stLfu?2T!G5 zlC_1-#iY%I{XWW89$82{-D0#YT+bSCvrazUf3SF<*d?UAM}6w zVFeApDLnXV>!!}@ORJD$6JO0f+K;Y%=)H4|ZdulE_t)`XLtnjaqQEq0Zp$~1UI-on z2s^IO{XWD{^3PDm&Uj5o;CN0-N9Bcx``3mGR^c)cM@XZv0bM z3cX4A6@5tz;s$1+zyRC9-oh(ko~?NTkVn^I4A_%gs--ZYXZy z!D+BF!Dt$p{m?r9 zoO65wGt^K2QZ~0pSC9Z`4@q;(vDe-BISD+JKZrp*SMuL~cVBWOa1h(k6>X`rxG!X# z*`{Ze(9DX?q4%{K+w7xsniirzbdYc*dn~?Nr74Z|J_Cnuzvm0*a+O>3(AJ!9lfe&- z(-7nRJcBE_nOMkQNmm1zbCIZ7hX_it(_iiwJ^slgT5GuXOn%;=Ub z+)k+k(`rMJrgoH7egR2KNvqqSrcVsd=XZZ_G+j71Imr*`_Ry1G!n@b|ICBC_Yk08z z8A50CKHPum$n%UUU4R9XZC;u>032;J+NQtnD3Pp2jn* z=5V$?Oa3`x0H<&zp}SXLX|97!Lzf;*?3XZ4fIWi)!i!LB`~4weLFUNUNxr74#*Pen zdgSMGbr`GC9;k`nP!bkU*mc*tQRQ2>$yX@-JA;MDv~Eq-VY8|R%&g5!xq2j5$*eL8 zQgqe7>eNzlu>5U7W>O}H8R}O4C?r*T2Xra2qUr zAcaU);a6$EjSGMS@BFK8yUyF8^Ox5P$X!JKWT4^bv7%>RdNFxZ{*RWpAmi=t)vI44 zG=i!UJ~nn!L$!^OUk~K5`AHecw{%>&&)COe>qA6(Nw?>_c+ttG+wv1Wx+G;A>3jpU zp|IXL2R`Ew*0woSRXqNKK0pO3Av9g)gG+Cg`Nwz=SepyoWD0g~^5I0we~8v(R;arI zkBP|#PO`cmbdr$m(TjmKx!rl{vvUHI%rz>R%vu^sEz$rC7E8C0#z-9MRpF)W7CN(_ zwOsJNp=(RYm02KyOUmPPtvyaezl>^Ck4ySJ^5VH2O2EF#H~J1bH7cYtf*x;iJjTbI zxx?Sqg$g9FvJ>AVT zq5v6<4x`F-Q9{XIvlXk14atlgc0xl&)4Vu@_gLc_T}97xz2T8zgiSwFy~lHWw+r0Er!3k zJsi^z{+Jb~HQmXJpqt6)SiYrP2JD8AX%mV)w~#mO`_cr?R#RM$6dTw^H}2IUr3VO_0PKi@mzRk-Me1dtnoyO&C<|1m)vX*Fs((i0AEv!bA+B% zE%#+vRy6*uY1zfhUzCe3s$OJeo76{&fJ)YvFIPwOR-f9aUEyB=@dWG{KUqu*ypL=S z%s6rhNByCed_<@)FGINV<~=*ih)ZAW;0x|=;F;yNm^^plu!xo+1LeZo0^d)2(5}f> zRU#-&9a3c!7sKjtCPF1(wr|3}g~t5++xa5nK^$$; zKX+z>D?ZBSN7(_Ga98CQdf4X9&U?op3xY-6!u3?) zs8d#>swVu>@`pR${H3lkS~E13=b5gm>qMuY=c)Pps%<1Mi{6A=&-k)*AW}*AGBCXF`t{I5y0M1nQHG4MnGNOl&MuQ!&9)UJRGO zuF+U^xz^5)w)z2$t0!4!B)lXbpNw&rQ5Kn=?OH%$#X$TNTNcftMO~+S;4+J6<+(3w z&Ijg7yuqJ1TQ`>NK4NL?lij3+AzvsO-g8~w#G&pYZz;A(a~1d|e3?(Hrj15Iy{srC z+`&1wcE{B!hN%Kv1P-Ilj~$U!{+IrZXaZE@efuCfUcuxxV$ga){1QG`vw8=XLYvsH z4wn13ultKuQt>&qGOTJqgD8O*QB4q=XPx51SHE9;5=Vd#oXw$Jb7AHc2_RXYebUGW z74cDunUn6{`zp(`D((Zd7VI|B`gxDN+vosq#j~hywK9$IrZ&?qbBp!{xl!Bs-NbNZ zagrgulWe}8Sr2HK-l-kTCC=)BQj2tr^~Cf36zipqUO2X+Ai^+2s>7=Dk6U0lscoW0HFGA_@46kzV_ExMt^`Q?tS*S%^NNzMr^{mq!uf2oY%>!)s(#tn-BaN zkDXK+-$+vNRfTD&(Y;>ANCB6_VbKGK_;3>Jgl1QP(C02i^cae7jhyJ zFSNJn*Q$8@#FyOsiY(&FCAogpn~)Cp(vSkD?-VwrO1bV3gwX8|`N`4wf6j=GZcHnw z#pN>R%;GYg)DQoD++}^EsTZ26=H>?N-DcC06seH=gwgkX-E$K5A%DyHw&He$s!!n~ z4dd6SQ&AUjx3i7^j#Ob5DeFGLeg?<)t2*nfGY1`hdY)VLQ<9wtALn>j`3$r>pncct zJwtEkhf06LImJ60jCH7u?&AvriIzBaySBr>)GKRYW=@MC)84rHtF70BbW}E~Pf{+b z49t-1D0-_%Oeb#JnM6eymX?DlcawLCQc4Q_x_@rRyu83%mr{3zZyMc;Q?3gZ<5J`{ zV~NUP=c|RT;QTaXuD64PmEoviB{2I%xDxk%W7TLAh5#-QmEM$glGo-xX%cDtysfhz z6GSHe<}nBZ#zJnq zV?^wn$P$NVrG$v_q2=c(oYiV^qq1jOUH`^~Am};ZtHTkeSny3#soSx$SOrz^ZATX`6o7IOc}bUv(PB>+?9 z8*T5;ApK4$;HR{wCrpK_^!7D{%5j-5`ijp>z>F)oe*6T_c&?jxWW-!!aLN0|IXr?& zaqabKjn^6=YFiHmIKfqz>)A`pFOo^|_r7;9fsRu%J^BIL4`sqJ(Hjy^jP_(bNA{y; z(Y(Kx;GNll3XAiZOixbMs0>?Ou+CJ;cX5Ld@!WPZlR6F}CZqOUmU{2<2Vm^q3-X7Q z=;&!_U8ZhUi(Fy%D(ximk=KzkSVn1~PI_OYp>ON+mj*r2wzZL~5cJ_+CN63nazhT% z?)~DQK#TI3$v|zP?s0!it|1gJ&(WmP2sva*NI8(i~FmOjo6j zzmaYqxSJ%pJ#LXDxA##?+^=hr98vhdd%PT^hJN%i<=QZBEK=xGt(-}mOzL;H@8>jO zeCfv@{jq?M1?hbpsZ=&+oe6g&OT$Ol{w{7OK!EaQIjN5{7rT$I@esLa{~8*hrl{(7 zEHe8Tv_IZeALS9ba?+0uu=d*msKeDxI4TxL05UI<@%LE;B!=}qwPLi8zV)93-Vj&r zB!YV)w3q0)3%-t)dgrGh{l6c_@;mF2NcZU~t=Jfrom0lwU$N0CeI-bqW zD=fJJwTZ^XiY4c7I)Y0?2Xv0^PKFES{+dfA_-dXYV}F|WBZuPxjMQl&CH_gZ zkr#Wt47K)V2t@>6(Nw#bQQ=fw7`t~HhQ$VY!gfV8|>G9PQd z0j%A7dkjaho}RAvto8?Bz%YO%zYVYUZntQxexj8Eq#1vVcjLmjXTsV>vNcz%vC8C5 zW`zU=UFs96QDXME&V?e*&bC$Q5AJ$mW45Umy#ZZ2P5`x-v9=;@($&b9OB{VYe;ZUb z#mNgYZ$;U|S#O?t6rRbkY)tW;YuM<$_ab38DhohH$!tXVGWtck7vv^8#N0Tpu#goq z#y#%vt6iM%Z7if&nLhtvk;}byUbk9uIym>WGQJph(BZ{CB=!F)VsBw?VFvG}kn^6d zhd*$H2jq(CA>LUZ9?%S6#1uyCz7mKK zx~15wzysTsBaOA@WUS^Ig*zCUjl3mRvk=GinS;xFkI6a1iq@XfK=2%PiQ zJ4fqPO{FS;!D_B)yv^xhor^@(Kj;>@hi4L7^TV8E+;IB^J7{OYEl=@^#L?Al2F^WI zwwmzueE4}8p3miv=)7xqr|)(rM+_UF2+uK;n1yk{et{s-;&-L@t1Gm&vGMw_9`ih4 zA!SObAGjj60&phduO{we$%&qydHrUlvIIAF_cK3c_X)gHarFroc8q~Q;Sv*LiV&~7 z^kDI%32k@`gSq(QFnti3w?fzNHjcnHTmlaSnE=yOd|@?ysz|l1eC5B%i{i`#^t=~9Vb)C z>g7oa#sC~eUBd8M8R)XKeh#6>Qu{@J#&^18yPV0w4$G8D?pmD_n{#n=vdka~#e=Rj z^mm6U==x&=(fT`DO3wB5ptkVq)bu3Jk+Wk`O-m@)_f6c0ato(YHkpd4$BQb_H<7A{ zwgGP>ymiHx4+(Rui85%dye1v);)D(ez4YvZr8}?aJjmV;KQJ1xcy`9p@Ccmyr|^%x zBAo?FTK;-HDX;%Pt)ul=82nFDAJNgVT;F?(?C(btmwd`Z6R*E1e=SB;Oj&%L^jXa#ir>P(IT(JSMEOV=w zXpG+EFr)|M??Nn(eeQ5C-=Ta0avAPLPMQ=e6~# z=g$_V1}pecJP86~kH$f}X#J6)?-%&A)Sb=j(Rrt5T|L=so2(jH*;o#lB=VW93W+12 z-=tgYz1`sL;t$_jwMTL(^n$AeZBwEdF_Pi3a-Hk^*wF+_^m^qttcol#FRhK{(zD7FTwt|lQOGpbjX2g}=sxIbvFdn%4UW`ot8kpFOn(?Ej7}Jz-a0K5)K026 zYa^t_eo8r)O4jB}ySKXCyaIr#uZDj7)2{dt`Ku{%?~Ujy_P6eTXem1iQp~KX^*c#E zB9!<~H_5n8^ff2VV6HQ}^RfRK*n1D!I)+k#btxctF<8Uhwu^7398 zy~^b8$10p_F{dGRvG$-BHAb&=-C%p~hJ4L{)2G$c_cH=TZiob<6Mte7G~2zYK&P@X zo4&)Pfv_1UB>l2Zs40W)onFzII$o>cdJm30R&_S}gbTq~=t%a#IN_e&+7pX4i!g?m zO+O>O+crW+R{D0KU1Ra4R~nsRsTy#@XtMXwY-yA|gI_rNi$mJ~y3Mms$XgSJ~% z07NJQop_e+Acpc353#e(Dn5ln%6JDoc}-e?O^5#>)@dw0_=a@h`)B6uE{;F1uOlZZ zt`hzGT4_GL>L#8;urajMxV6PED^k90#Lp^INy;w>l3m|hu6={YDPnB(m9uzMs&H47 zKYLw}0lRb@&NbwxH5_DjuqNIn)Q#jMTz=A1xL@^0;{bb>@LFg=gVmyb_1QJS@oh;H z%<<2Thz-?Jg$idA~({ElUu96E2&(#Q}=lRa+`H7&(;H( zUNz-#`*M{x`SmqxsLb(VD~|A@RH*rWfr)HcNMMEOG-+8{D5tJjkdA7ugQF>}=zND1 zU256EV*fOFgW=jzF1{#ESV(xtryGM5m9A{i0a*(Y4z4Pu^_3grYZN(sWkbJd_ubE) zk@zBM(;2lhZ4$`bZy)=zJtVzZ4E2 zH&W=2Iu90`umEJ|LpnNi1Bwj(T^4v5A#_boc2?aaSHYYUTD7|tf~7vfN>NmH=1>nP zTrH~QmS%Gj4etRsAL$)}12+rvBua0yp%P5G&I*lxJ=MWq%N<#d zEEK?!00y~nlvwQQ{oTs2UH||9^czPCAzEwBQm-ekFcf#d^YjMGcAs4jPIkHo{_!6y zuw0jD2E7ftugBGF$bixx?2jDShE;f?#ZcxFd+xO@ZzvZ)x@2*wEi|p_woE4+u3o8P z9+%?65f&TWu=ws*Wvq7h+by*6}NFj zXT}Y}7LTOsGQ>{;c%esolFJY89$*3eQeYf50Qu~uH9N`75_fVs07OT=UA%+lZtXV1 zrwhJJ{G$eIZhc?Yd3fjzhXMH1_+Hc zA`!U4;eXf@`=94P*vJlN5@-Uln|>APL@&jzNlw?=IL)vdJ`WH!}PP*{~1zCVoG0 zE~bxP=GZ?&$8F2Asfzm?M76YSM<|9aiuTzbnX$M0n-K0VQ9w3{(gpKude8Dos&}wo z6H&?=^?e;|UJ$fHN9jZ?e}@uDjA+R4%NYI32DKPt1s)(I#Xl>$gn}Ga6sMa{yH^(d zg|=>tMt*l=AJ2HmEktC%$1~A<6z`ASYm`3%ZboDl2zCM%0q@)oOi0?&@UN@s4$l76 zYqinqM>8jG0KH}4yiecz@L&_)MJ(c4`23#tu`m5A;76Bin|kBH&`D<&+;Vz!lO!S< z;~rHYd@YX2#t3!R2X&CFoOFXv}v1#74ec*s!Ib>aGc($%Gqx8rJ z;U(%RRBd!FoVA^;y&bwPCX0FL=*KH1j)9Y}f!#J#I2pSwC)Go<&5ljY&Fbgfc zMhQP>1N}D=8S^;o=QgOV_*$i7TYOq1AovKHHa(}mcoz)yEq4}2RI$+45<9ZTM>KZW9PPeI8f-k7g5W&|J0ctbCd*)F~Ve(bJqfn#xEC z0o5LdWRAeHuE1SXVy8B5)v^;(Q_@(U`!l1kv#Z$VaKcogQ3bZcn-G#dj5KSYc1?v295O;-rMRuxb z*UVAJ!@`uc@_zkRtG1*L+8s+UUb|5P+NExMu#=|E0Gr)AyA;a)jUjP|5=VQH+YR2d zg*1LKQbPsaxo+7+FbzVc(hLfDz8kRrLt{RNLsU`?ywpAz2=jGp&G%Nxp})HgMhldr zP=$}Q{U*w&W`EUcD{?8M$p3hi?jBAx8;$l*m(_+uMt3hx1ki`reg%L$t1$a(h{dX- z{0jQ+nf}B23Hx-nBTq@)-?akW`dkcecjw#F7flmQxa;h`lv;ti?V!DuN~S(=T6Eqt z@<&3dHJS0%^@F#Q8k@<8eD{W7cNQO=*sg z%(B3zc?V5A!bS{1--5kbhGxDyk#smH2NR?X;~HUv2ooL_ZgK<+wDmZP>fp=X*HJb)X zoPltwa!l|57XEJBjKl9W+teSw5X-Z?6MrQau3hPIY2MUNvyttwuX?W;dV{p9x)B|-@n{igt8NHy=(EEOw`#jd1 z$+m-&>Nz!R@y*J~pIG4&!?vueXEZUbTq&!Om6xxp8Y=#db^Arp#ig}avikS6fjBIjUF+VjTf`8Om2?%!$+or{Qt z&hwNx+4>XXU>Oo=PwPqfcorKQycDzJXu{5aYUwFL!9 zoH&X)imeb!L%Li|t_GW`VdHvGWHK8q<+)>i((Quo_sD9{ z9MLzRK{^S;49RNL36270lUVRY2T%-PrpL<^U6wLcNt6j3$oNj5^5NL72{&?jhBD!F zkkq0wUNUPGr^ZTLt>N{tyaq$AGp3sg`Sn-!cDYg!yt$6L*6!o*c}vDlFE2|hL3LbI zv9)x@YS1XnNSA|vhf)5}gh)vI6klqN*h-VvbTfHgvx*NzxM%h0T9W3%==|y=MdoaO zAl3~mP_UQwyq6Wz*Xk^>9rIKuJH_klc}tU2lxW7LOud@-XUDzi60X;`V2$nS0O@y= zbhU{cQsLm&FZ3YlJI1(3mT^~{6s^vqHI5{YiW{f8Et={E3vY1-t@Pa#=GxEZuN;4A z69CA8@4ZQu(0(l-l+%#cho@gp7Kvt35M(D*Lgv_xOU61^6x)cXASwH2(}Od0ZOv*s`C{$3X;sfzidH(Ftv{&RMJ z2X@#~=#}|QKfmxZwfOApA}LSRdT;%M9M;u$1x&jE=FXzmf8AEon!XUs`aJtoB5^Q{ zgC_oO3S(O^u);sA5XPg@7}e1VP1s2iOe8;QB~Y_(snns?1`0*#z6HbC@Gy>zxa zgpM@D#dvY;ZrdaIKndlE1yPc8r?4QjoN4gE1Pz$=&OW03neN61AB4~aHS;m@%s+Tv z>ISXVEWBHXpd|*7fAWJIjEs$a|8g>pzC&I0r@C9^$ZZEjt}g>BENZ_etl_+<9)gG& z^}7BWW1~Z3GMx>u*5zLL8W^wUhyoZ$-DS7Eeh3Tfkvj#BoFk1i(BGIy8%Ut)UM z|KAmKUQzPlwV6`HBQ97>(Iw`ADO!lC@2vuf26AThf(vN5O?zYITp!6RItow?CU;5> ze7TWm)$n>TE%HM|r*M8wjINrD9~$EOLXsBk5@66@z~&8a75vK6;kBcQ9$njCOqCk-pH=DeDQ6VD z&)}0F5{)Kte8wRnv7lEpPMH@joxAneJKynodr%EI&LZ2RN=>|*7~r))@Oo{|$m zjyVQZx^Oda93VwTvc9)-7&nzjJ|JzV@722nzuLQAxV7>MH)be*N)|sx2jx0r73b^# zRwGZAVaHa1E_DT%o#!=R%J`!nTRwWDpIysqjg6@R$KAuclR`rh=3455zP~y*d@**~ zHRVN0L;WI*Kap8#56M`ymlwF$2zKP(&gbSXk?xoU;FDa5=ji977@v{h_>j*99$)Y~ ziCTuYYdK;8i+_ZZ8-GChyZT!!mKo`-^216$`T1%J`hgPeAJ#bJE3MY~qJ$K&t{zVQ zaGgJpjagK7_N*hP6MuhFJtvjfT5MdbmN^ZZyaWAMNiBGH?bn6|`DmW|OOc6z*hIcI zvcwc>qwDUHH0{zAGo4bZTc>=})%fAD>)&6ga(Xepw!n6dgChMakK!h79TB=ra%8Wt2%H z2^!gW^}>#S>&28L_x(fdmViKx?PI?eyh70*Kw`XUOOUW#?@8Mj2PhDA;>H#yz|$@A zHpfx=OzU2YPCW2ivJF~tRj?3OOBV8jjTKWH4pzSmV{0({ME$P^jAnGym9MlSCmdP6 z8$!M|Hge4|32w(^jMnxpb{NYUBmRgWH9c1n(dFZtBqEw>an~&S`Rc zo~!*(ln$S{6X@RYY*_t2U? zR*_L_E^7$PTg?snF_up8XKlV6f~Q$0V%7 zPX$sB>V?kGok!w8xn-$$COKU;<*gmDn|VlkcKfl2aDEXb3Q8Qzo0R8*4jIb`BQsM1Q z#fr^!#f-g1Ke>#+agDp^nXUnFxl=BH}L z4PtuIlTj!CD?=CcmoV?f`1=vr$qoBr_iF5tMa!Yf9Y3fh{iny+!AaNbJkp2tlT*9a zTT5M18K-l-o%#Ocgjfjb%pZg(vRO8R2~@@A`-U(uKf(G{x_+BzBU#SeMEG*YK^gW) zf1eq=Sk`}+<%h_yp0T8agV4fAw?5RdXR7siMuVc*S|wz#5SISy+wC<}9)a{1KLE@`PD2H2;U1P{rnltCm{n zWV$mu`py0dc<|MKDN?=XHT|9eWB1W$e^sdtUQc@<9__ZO=jCZBlaF~J4d8LvzRX6{ zGBytS&Q|rMU~Pm~NO&HL~Zg6n`iODm6y`4Ddo* z=UCP77y4r@6M0L|tdkGTK|1Y=mU6SgUVg)Y{Mq9ThR?$iVt)esbK-d`t^k7yo{DU zWJ~VDR39VzPrXD!iN>_j`ELo%M|7~074#Ut&eMZuZkkri`>Zf3z3EbzPQDFKJ)uDc zn5{-xKg8zal5n}f;)xiMIAIdW^f7+_3Ho@b!r~Y7uxr2Gp1TsssZhttmF+p1^`_oR zTbFizvLKa3nC{5?IL`X4u%CsyJe4_n2xsf%X_3QdGRs;X%~22!WKPhzh~B+K;Ojwx zj29L28}pBaZJMWS4Mxm@A4td_hMPxiINS5kEim#nXL31rMbJs|hrb0U z5_3g%8i+trX#!4BU%6*>%~Xts>3ZFsukz8lNts&w*9j}NoVbF$Y|NH7zR_3n64X0- zBYky!U#e`XVuei%MX6)XzUc1;@f`Yld-7`uD$(8W5lyTmy^yA9v1u$96)3D80M3t) zB_R@`aw@b<0>1TL5VC$}nio{yLnw|f7VZvYisMz|D;x!mRUkiCq!)OY)0 z0pa(0rfhM7BL0X8GAuPZ(44vhLVZckWG*PCj3>M51?*Gyv&k<_pZQmZbpLXf`t$)k zF?*Nv$9hS}(3x7``~myGBSmnfE4W(D4D@!L^U-2 z=y>BPs&Cjf(zR5On90&5xCLw=V0X)um%jJWNu_qV&I&>^V%j|iPK29>wLsr zkkyqwhwXQxtD8v%vW1_dnPe3DN|JF(#l&zn+b(8%zE!b0KCvhXxcI*gMzc~5A8WTH zWTeC^AF1s3D_)_rTb~Zbaxz@xeX_$3cxj~<8TofqC<8JnR)iRMsNLtDFHySdq`n~y zi0LfX^ht=@&h9{g(Pi`+fhNe?jZj;>DtLD7#?Z{{ZVX|{9_rgS=6%L@toP5#8$!$@ zEl4?g$Xik9?&I4WkKc%OQ&AnX>z{wbeyLSEg(SU?iFLIu$K5ZPRC+eu%(Khw+q&%2 zcgs()JKefBW7T1YG0W-KH**SFc_1yKs(mUTK=nEnkugS zz2(4KGwsV3*4-kD#M6fWD_`p-TDcMv( zM{9q0C}Z=z-U3oFg-eYrWiVwN5C?wm9KnNZ(9>s}c&7T{T#{YFE6-O|NeLfw#Iyt~ z;B2Cq*hNZ5j?OiK*JbLF>^4SGY^eCKUxM~|22svov#yT|>de>P3x}c{D+VQajlTis z)zFEj?&Wy1&8MF59Y?XTQvM6$e2W1VpHhj4D0)RY=RUyE`zSU)N2ZHg`;@fIqkEl? zZKN-b+R%;}haM@+7rX@tmtwY3M5yB+F^g>I!ds2qk85MF`}&L^`oub&B|@Y~urd3S zYjx@n%=8eP(asB6T((lCmJRwZ*A!d+$ouBq^4Pm$fd;V{q~5NmE9t_gcS;?+u5qZ-ys z%X@Mtviy{{^5YLWaoPiJN{rnB>q9j^6>3;dF)!C*?h;;=|LeIn2Z-=xM|VXL{rM=t zRXVKK?cDN>!G)}7=h1UC0ZfCKiXHD+*=Z4Et6yKlIJDDyDfjOL@CAtcC4-^nBvfe< zoLJ3AswhoaM5_8?_iklIh6^Q@!OAapuP|jk)B9$X5>uD**t%D;sa)js;a3Icf+c~L zLt3Xp%@duE`pZO(eRhuBudkOytLUx=$~xU&Qw)rbfX~Gm4dwN&QR7#~ifhH*9H7px ztz&c`+_vR|EKSF_*;nesQ=~8RKsk=7#6cW>6j;Yb8E}t{0PD|O7I@zFA%@EC1 z*5_@_L2lwJ^SCR&4Pd^8YjB21Kg6LPEqP$vDFEwmD+By^3dkt&-bL}CyJ>9=~5uiu@(swmH{fN+`A>l+<(L=f3E zZ=YVTgwJma!jp47h`Y4&-er{M-Tn10D465T8%R$*Y-u)N_rG_CW})wdHi>`7OTonK zH%+q-hwDl^x2VTW=WKphEoh?f=K2*HfvYyTOUbw?FTT5*6=$fW7L9aIAv9VbKtc&n z*F&!r$OGXirV!|~y=$;yANXA;VAM0O;199UtG(!>7~p(9%wEVO@ISsl-%ZDHGs-_} zG2usv;)d;wpdFE*Ye#sO#w;(}M}W_rg%WnawpPChK9&6F-nKfi2BcR?G4R}G(GnQR zB49AT|1cC8`NKqvc)2~{Quhf{#&UJzS}^mF?mJDqlbFIo+>FrODZ^P7|WS{lfeSPBx{HiZEuU<8zcy{X-wI z*!D(8P(y=l;NZV(^n8AA>i8VJPXM@rD*Y9=7x|rO&sRfq{II@d;YXR_%6n}Z93AH< zr@XbpLwb7z3ZK;yeHbs;8j;CV0kI$AOiudE(4ZPDe-4j7xcz%c|J}kLU&&N%bNkCVB`=rv{Dn-qU*-w11;){hS>U6q%E7*Go$aU<*_k zJ;Z?PE3kAhhqjPrXRK%s1U^2uTEu7tH$!zqZdt}}rEhWBQv%K3e57@DT$7h$);)(X zUD8<0oT#ZwM7gZs9Q9efy+A8VV@c$1Z$@gBs!%7D1@G<1P8cZcit|vjZ%_2<(VaF9 z{wV|E(xtAaczzr_xkjF#VyYmqk$XE>Stg=`IDt{zoY7Zv^|Ut#+LJL4g!>EH6m&Lq z0MDrLPn7lrwyS?H~T&;qBHP!zf+SUNo=<8NqQ+ z==&lYC34-IeGm!UD;(_k^e;;Sm*j-`q3?IBs;K~8sG+?0zBLE^? z3PAL-dh|%)qv)&`vp}kC-I_Jvxg>q6!{*s*RlY$qmaRN}^ zWM8L{8-Y=p56qv_vH?2#_4Ayyk0+y?S251BfE!ohNoc7qAFTSggcNaBD@@jPb3n~{ zS~*a)wBC3((ujU;GJ`Ky(GO9r)FZl%_?{sLSr{1~XCD!eY;STo3JEl^%<{XL`=qOqawcg(gsi zIc05$oNhBHL^cJl3y0Z?+LV{F7gB4)pxR6d;ziUXS<*=UzNq8)RZVjA$)80p=Qiz2 z<~P_dQZMaziIBYTh`WFLuSqB$%H!y?dzJkB>Z28Fdm@@f;gdRkay<&oAuu_)IwF;m zcDjb8XyX?`au44+aID!8H?td(yn8{Z!Z?34nx^3KgOufe#kBu_u1v`rqyHe2K21_O zn+Lo+xSPJ*$==NwGcRo0r(~mY^`+d+cJkN^!vAF$Tfmtx>vf?o+{nI#&(EXGL!weTsB+n9t=W%#ct5SXS$i>H*I6%bNI+M@ zOy`;vnI?z?*gaFd%{R{IZvcDKURKTK>o~v9`~hF6)%h%2MnXdAN9BZEqP8q2=n1(7*Eq9D%JeAD z_52ui&e^cw-ze4U!ORjIm8*?Oq1&lHPwrm_GE_BoP0X!JO@g#VyUIjfu2P(OW6tJ% z_?b@3m2j0=e0Z6U5D`Z?ZLUa43Trr0g=R%XGDk!hf4vwx2-NkG@pG&8x)llSTp)R0`QuaVziee2 zG|;@>0^Su+mpsIq_^_-oXv}U%ca;B@@$Yf2{bHQ@e!ReQtRiU6g|@vgl22C6C);Jy zIsirM1Ma`B&|tdN^dIEy35XO7b#I;L(^mYmPU);w1gLU5#K;W8`HZP2;od=DcN(Ble%x@mRA!%;stHP?*A;!br)o2kpF2A(~&!G-zXRc!E<-g>}7cBGy9Z#p%FH(Y`tbr?5);YZVcZrCU`_Uiq!`tahR6*6swUwj}a?-ubgq zbW>GN{~#C{?}w!U&2;ZSf4NkBv~>Ke!KRI8W{vB}aVn7P3|536S5T(5RIdr^qx6<5v_RImMIssFR9)S}i~4|TZ#!vFi^ zhOyO7L79RcM&XAVSm97>ugiQ-GU%oVGlA)1u8H}J%Ab9|O)GA;`RCwtbbl^lIo{rA ztLJooNsqpDSF@66%t{KCIaqC#d#DR*Ym+)R9JEu)gi&olwN-UkCwGiNQGW za^O$>bII~cRo1?Z8(x)#xoWlA#p1aTlE*WSjaW{ylm1^wtR*T9affLpe zQw^Ei{vJe6RZJdlGry$FaJAd?zG*1CV16KfggZ|i$dJG8Br2FWS+~jv|8JFnffl9~{OOl!V-QSWo%K~Upk~y+_EwP*Lg7IH3S(qs@t8mDt%<#z1GLG^ z7D!a?T57?4YONL%CPe8>f{s|Ov7hZTt<^LUP5t@lb!vy37>rZBTwM53C7UXxiB?Th zeQ`054y9l5;&unU{<*^s1tO^dahI+hWpG1Bdq{(M{00c~==|r3^GG1gETJM*2@u*t zvJXx1gsrimZN^30Ad2hRMXJOsF5;=y976u*n6Uy!MrFCok#T2dnoW&+15sl(G%l=7 z>p!|T{Re$be!m}j*gbNu3G)}RHO5i5QB_s}rG?|F3;GoP*5Q9do0E_Wov-uhh0<_4 z?ABp=eaSJs52+3O8cOq_NpSO__yP5#tz`H)3O9w6$jt7tFRrI;K9YDuAY6g?BaXdj z4M4V}lEDfanv5}wOYV63R;}3>PXwEglNqcomwBK}i<4MYQ-Y*#o}m)bM6xB9r$+0qY-8uY z!wNF$6YyFh`S42K{UBZE$R` zqf|Sg$OQ%}kvrDPoD}MOoZfxdJoUe-!wKH~=w9VzLp5Xq5^Si}HbsuQEn*&D2f zm3bBsG9KTFzEFAC1EmzzRywkG1vf^~V5r&X5^3SL(W_8m+kA^kW3e~o%V&oJTVK~; zcpl&4zqxi~1LRFPx3iQ!@ zk|VN?Zxid@t7d0b|I^p_GgDT_E5(7brk+I!hW$+F*p8xtz=G>eAu4_NkNcC@%w%_j zz{l>@7cAeGYTF`jgco{FL;)1Pq6Mi&|JpF7GfaqDS>=-rPK&!!ZxNRKX`8U8er)Jk zt-zbSEvdCDT!wk=&N%_})TCF>k)FotJ`$v!iaooq+GVxcgPh_9@ocZM2^@ zUlJ_LKVjZuJv@rkIDoS6JU4tUU>f?cEzW0?D{kX?_=TAz$EG{mnIme}Tvk>iC6Dk9 z6ugqdB1|vaEhn=s2zfX?KZ2e=s-rzW#J$j|X+fur4``m+-F4%gJbE}9(|E^{dJr`m zWPp}IT{b?3puhTml)Xh%TmKvFU7%QTch|PKySG@8LR;Kjg1b}P-Q69EYoJJ>6xZNV zDDDsf34u4iwcg1c-T$4OQO+PMS?4^@{_g$Rr@s9kT0n;;>S*6N|r{ zKaEe9zRoPoAgWwo_W>8n{TFd=)Do%mDg0^Y66h-K(~f(K!B?h~xdOFwsw#8J67O)jC_ zzgE7&gVl5SSZ8ynPDsAI&G8>Yk@ZKT$;oNyA6RqHQ>KxGA5dGgG5MgWzN36G=JXXi z);g>@Mi<*Def|F=iw4ZS{a;2`#AoPyV@gh+C1VqC433rmFi0 zm8wsXR3xcd`oyokHan>##S&*L|0*@ zF6`TZWM8t;166Yg3s0?kF&$R1xGLLoC}!{12XgJm%!v@=Mi7S_FkzN(B%KhRm;FOp zp`Hu#e6%OLT22VAm2WP>_1!_uAX{2QOH7pGIY>nwW|C#qTYfgd9Te>Q2x6`(zaDmd z43=c+Gj4x^)apJh9H+1u-n)=5Cz-@}{1Z_jOC=BIf3}X9mO^tk)^~Jm-#1}obZ2;H zJTQ~bD@jp@oBhgt)8I2UjK2t;9vw|xNI!`@`)4YWW*xg%=}rPm4~^l*uoQrfaZ3_T zrE3D3;kx>TZN!7bdJh(E%xUYqJTKwMyQ@&Gyf-1hhJ)T*|$JMf69Vq z`QHDrAP=z%6p7%V*K;WivntTZCp0n|{<7}`r1BW*|G`hk*0Gk;JlfX5U#mPHy<@jI zx>1(~YucI&g!sqb} zC!bg;{3%8C)E#Uf&1dZrgE>RI6K9mpKQ>G3u$T?DJo+B{;8b6te%3>AV-{Vp35!DH zPA;F3)?V*Y6wG>J^N^F%HUABLIS%od=uC{Ot;2GG&ie4m$_dNphqiX-u z*EW{at)k>fHjAcZ{**0O3j2Y&QtYV8V}*ijNrCqCi^q~mh&eR%RqPK1OpiQA+)XE; z-aJcEL|_O`O4+!LkiUxGCVAXeYJzqUx_qgsyk64(^Aj0yZN<%(4Z_8Xq@$DuKSYiOV+T^6Na7ug)>}2iPXltc#@=udfq87rAYm zN5y1L>}~^b`1x4nF(=rZ$LZw0RE&Lcp|KmU8%2l?IKe0KBjzzN6N!X>XTLgAiI2ww zk^)W#PHAwwZ}q~X9~SE+$AmX6*d6oz9XAcC#XfJF&4A7sal_!}f(5P?Fj+#DYz#hBzY?z^dZal}Fbc=7#_q#MZoZd!| zfkg$wOA~DLgHb-py>Fl54|gXdP%a^(!a#jk29bbXeigwn;Zh53AAaA?V@`pj&1?z7 z<@gwM@rOv@#~x;5vdh2P-PQaV=G_!{Jvf|ay6Ih)wRq*mo7HCI=l#v5hw*pG(S0kvH&(^O29+`Pc zUtVoI$zhQLcf&(=x4I(BR(k^p0+IdHPqA`#{2WHdr88TUK3QdJexse1gq#3aI67&v z)dTs$k>rVZIWI4x_@b$YIg0G4G@xQlv{H+j*bwR2D_h8g0~Iy(3VuesOe+6tRC#?t zcrwFyu4mCPt4AqRWkey%F7dGZi#9xWJ=)~s~BB+7Q2DpMw6H&0n zXa|wwhI*1Jb_}e{dIsHw2QLIT3)18*g{PVw8Jt^89N}-HFDI%{r~^@<3WYN|Yp zYb*n%A$J?1-k)B^oKOHJF3qLm%m^Q zDaevF>oQeQ408%aTAKWvwp^(mSxAsI;6E$i$tM^#Es%C1MTHRKui;o^TC62h4>ynF z`);V3W&guA>(9*I*=&~rIoUDK$1_n7KU0tAN_)tG5(tL+6MlS1G82xdFpJ(@9l=CT z?DO*L8GSpp1{%da^!14hSVfbda_HwTZ?G`_-5doPZC71c@|X8U5N$Ib#7|G*;)0wz z1kZ^Dz{A&oNf&dqjbMRgF>+i1W-Vt6rXyy?(XL(b*O9J&9}c0vDdg4mS%&;}uDY83 zO$s=Zd4GX`Hm1_P?_v|?um74U#hm!oWX4V8ejH$pwLI1i!EKZB z_pCo|rt6NU=qK_-JVv>5*`9PAYzGhpRV^OE<9)MQ50SfpKJO#d!mjxX=Z)LE2Qv{w zN-~I0*B7g<b$0LPJk&_9_xOp|cZ-p1 zQ(ECwHnyK`aaDsgnlp3VF9(|$dT402wZqp6HNej{Hu@Lm4O<8YLt@Nc0$lpd@aJF6 z3ZI#&sFt~?+)a@EZXJuE^{bk_G47O*%MBa;GYe+@CTt?H;eH2&-mRQ6ijExE+d78U z@7@uA&pzZP4qbK2ikpjMOg|NxPEELET@F;jxL;K~f5309RKF6sf@S`5-^vRjGpnD$nSzvmLZ3VT zHe}O;bxKyr33n*F5=(JcH5>MAjC^XdBYNSoB7O=A@=<`$95EItv(OcNQK(XRS5uz) zzg_mxjo+0njB#w${N|Ies}1g^b5emsvC$kDGK>eLhh@(x!n-9PAok+-SHuOUq7+p2 z8b{Z)Y%JW8Fobh&pY5cfb7KI&#UL5M#nUX>hnWN|y_5Q&;70w^@VjGk{&72z&+bAU zYt%%x>c?V8wrI%I&4;_ILx|J)!}%99^86*DqF>&gTKByvza+A*Lug&~`&TFZP`N*& z-&OJ&f4*a9D5yCgblf2+N>xYV7S1nBOwF+9zE3J1Pw*xMGGqVyQ&VOeIEFngIk)C8 zZI!=UCUNN0a^S%WOwm~g*biGeHC293OX}c$LPKpV$rOkiag6EN>IR_LT7Wlv;l}aP zA$wLUWy|N`mhU9oBiKtq$?7sEN=rq?v+}WBaFD99iQmIiS0TSuNW}r#Rk_3S#kXEm zeGEQc9oc^GY76`flrhKmkGvw!igr_~72a z#J<0e36;;l)&==ivGW*oOHZHjzul@nnxGOL?A=jc+J)s(x!B)+Lb-C~&qYp>Evide zTIkg}BWZ3^jvWer_xL+_F~y_+vLhwda~9bD%y5{W_W~|`C*Sh>Shmnrwnu_Ka%H%L zKA!nhpYsn2;`q6S`DuqaO`qQTs^Y&_Ph4s}zTRU>M@NLL9o=dI?=EV~l2T}`CAyE) z4t*%E*Tkw7JmXo`#{}m*#vhlZnsAc(DMu-kk=fwdi>*Neo2R1Zk^R`*Ei3FipgK+J z0!srcx-X>==l4b-w8MFuUntXb^#QZe)Th}UQ4D0Me?yv8X#_&ZRxX3~0BM=iKI?gB z!qtlLHI#k&d%vZUJ!#8mSEcDnXtw*x!ZD%Gcn66#UOTU}`DC&$Xx0?N#Y{!x(ieGribQHi9Taz=EZIUSz7hLZgv(bm_^{-)0 zRo;hAXc#R~BENOs(d0jDt-#KTkf1*DIr6*{EvU4Pr9JdSN6(@pr0Em0<6gS+6)%Q* zNL6fa2fB=v!>c+o;%{$mRi1jD^R;rFq`nX;ypFeAxTZ}qSo0Ptoa1f5D_tn))i0Wn z^r!JG`^zT+m0!ZlvZl9n>1SX@`=>wYSWBt|c+5GebE>xxLbjUsQ`deJuS4<4AQg3# z-q5VPi41;mISHG-aWycw-xeMu7xGE3tnYsO_F^o3*PQ(lz!rV{-cp2keBnk zvK>aV{F&x%gI{Ic?^>JN--`YbpGCpflt^LFkDYDnw;JKaS6%KIC3BmEcBcqAiO**& z?RDI#l$)Nf$Fc7A6*q??%PyF%9bcZA(r%O7>qKY+)kQ7bq)sGv_`O6lc{ zLi|7w_wzCcfU-55U2kU8y(sF-H-D2Kzj(ydjA$y0Y(K_Xn3k-tu}c8?1rWj2h||(xh^ijOZKufYR6giYDIv zwJ)812F9_(?%->MTY0_)<8V(zNXcbQ(dg&FcTTru5Oi~`&1;I--xn~eo2#oaI=jGB zpY;*Ksn*il0P>QFrBhS-yC6W}2pZB9-T<;cqjbDGN7ce*Y}`G|CsgeDRy;+JCn*Tu z@6TtD1Zc(4V5r`=4}tM%W+Uw za)!;1y7*S^=|9JuS`)t8gnpvYg12z!bdv7Pk`hqtNe#OzsheLQQGMXZ5VrfivOFs& zvwU=nhf~lys`%p(OBF`n?H3|;WO_E+;n=yDnXm47E?p$P4>o=L^I0h5oIk3-Yxlc6 zRb(MEYH#GUf$8#=xMsl@l&|GWZMX76&`+i>%}pPe8;-ZZA{*BPtFMmx4DD%XEH;hN zQENM`-U__dIGy{Ow5E{V7>A{imzRVZ4wdik6EKRaK!fQC-?exlGCJMt76v zY;^mXq^1Ri4i}+A*OdwLmGF;c-F=ktxS`}@Lz+R)W(NPc>0dKylb!9KVBEz`9v#B%3wp-_!&yUgJ`O2z}lJZ@4!o<;`!l?91?5q`($Aq(X;W z_f6OstC+s3RFUI>xEy`Kogs`zc<26kY1&K2`Qo-jniP?+XWGxteOY15y?e$BH5Dp_ zg(tdafY5nE=p{@9&o#;MVzymr_nPL%Eaa7NFof*Wn)CC$0Yc#wABYOvi{8^L0->1QIY0f9cAgK| zy;aHR@%ao>&2a$2kCNE+PA=h+Q!`C32kTBGh#V~yV7&bciscmrG`+XV<|O>?5d-$y zXTW@Gsy-z7+qd#e&8NVW`FdCRTFXAUAX4d>i(jlSvZ0eEbP)!3=*c@QmUkom(r-2B zICb8?JLwfU$Ituy=AYuH>u{4lNvSKr(v}eP<=LtYcTul*NX_i3OiS0;sw0s-Z(jiFqxPdLA2D+kR#Bj#qdMyyX%vL)?MKw<^(f1?Nk`$@^Sn2t zc@B3AK5mUQt?bbRxp|+^MiN^DW*&`IU-lK$wF(!}E0|i1d+v;tcdarjkqYe8>gO{S zI_}(Xt9iFP>5#wiRdI&tPBM1jW$X$v_>EKH|I5An_F~)}0W)}|{HCbo;_U83+46;z zjuZDv)S~w3iunC><|&skUa;R^<yRnHf}BBC7U3HYM~d#2L|K&cTzR=V&j z=Tmp%up-u*|FrLa&(>%oDG@^+EIAQCXkw;>eYN8TU3+a=A@4)Dz|WydX-m`qi7d#PI<*)`L#<3n`UAFGZ)Sq+E`4e z&@t8UHMK9=+$2NI($29l`diMAzOQfJ0UMOlbHxhhx4UaRQjjFjdyn>}zH#VH5e}xV z;D%E^7qHyrzczZ6WHdB+%Y%gizpkg%tuwWhGTDeV59d*B(7Lw-7@`_^0U zQb@*-w1~tU@pRBBpoW|`T=ACNpPSwbquSD&ww7$y+o^`DuNffuTo|n4NeAp#NmVyb z?Xn#ZS)}T6hsY8Y3m;C*7|uG_*xTS<289T@oeN^CS6sMWYMF}91J^ou87#@miVkIyt)Yx?EEq*amn=z z#2i7emK&OEWWlSEYH>7}zkmlzU+iFHiw(q^(IM?PbclCTPKD65rc{k<86j}f`ylcz7K#(k~+ z@l8~vU1e_N2Yb5t`@*2Pa`+v;et+-LLTk!0=xeg0Iv$U-=q;@zsA=G-7NP5HX*n-- zZUe*2Ya#BfI4vP%X}0{hrvAz7vQ0bMvj>LW7nFCFeN}-S8Of!ul7h<0l>jYo(uI)D zGlqOB+<`6jW(J-bTJI7*Hf+O+?>8g3KILXs{(PRHu#aWvYcGL79fFNd&nl__c>}kI zxmA5p2OxiXi6#BSlT zO}Qp={$r2I{*m4@6&?=^nKj{g19g+zHQF@?@`PR7-o{ zhSwC45~#um2=snV4B!$Dj+flG&*hxt?eQ<2NATk{!!(NHd#LEWl1Ia@2UZcl*)=M_ zV(9%+8Byw+E^FqL=u=W}RkCp8S@R~tK`6;)|7CKSBP+1{@Qs~uo&njU_xd`$d}*)? z+}ouZEKXya$2Pszi_#mO{&P-&DxNs;HPl*cS*Y88V%{v3%%id1iW$!?&l%h{0|=|- z^JYJ&V#|%j>prOGpqeOy%{0SV0jn=>^%;EP45_w)LX{U3U)Z7Hn`PIU`Le zMz#w3#@GoWlT`7yDNdy|c(P-xC=q7}-Xiy9su91$V_;h$;|fm_RP_8 z9dGX)a(mn!55GT-U+WmUN*B;|uU2_NNJI9`ZuzJ`2k-Nns1ZX%2kTKOU^*Cj?Lucs zJeIls+K6k|&xTjgxTM-WzLUXrE~=WJAO!lPml-8{R@;2@OSeHOH57kt zw+Q#YGt=fvA&#Abm)ceE zgAEj+a`qG9i+{2@70dU(&0uL~spwupW3|m1o1Uz@1I%{vWYgH8zg`x5mS@8KPtj8M z_q!YSJg^=|2MJJryeu!M?+WX#+7}cd zVLcsmNW5r}$}axH_tQS{N=$q-zPQ7?ivi&hDpq>-ROFyYL08~`qgYx%#4|zKY!W=5 z(O4|us~=2vvv5s)FK5d;pw_}#;Pq#!ySd36+qi7YcLP8r`BUcFJ#>o;z>0GHf}^ip z7sN81DQ=(sgCjF}2D2@ZgUkw;@K=ADJTa271J}}_P0VJJh}2yF?ZnIef6;#7pmT&J z>SjF4Bk(yb82X<9emZ?Z5Bwb$aQodJ$M+~7Qm*0m{D)RQnikgh?rnYR(&a=3 zFOd|NzIUCwQ-HczpA%saMQP{LC1_hz|1p?_F6sZKVFH8RhrW6h@=94j_RIe{ZvOvz zCRg1UA&90c(_K9%GO@R&0xiT3BD#*1J~ z8=aQ*{Qb!>8J-CrNaFbb!82e3zUFP%eUwS6i*bh*&{9R-5aZ`FYO~$(>AI6HEbjT8 zEX}*$-Yt+_VHA^L7&Yi_$Niee*XakfbgzEC-sJ|X;ScT95c1nqADhrW%tB7x4OF9{kXQ$at9nSP zHe39zx-(09;ES&0N2e`qji7l9zA=6J@#7X~IIIyKnEv8r4IEi6!2vqn&Kt zj2fsEQG817XdJK+jQaZum{LN!POp2{vEw)%RtBGR8b)5&<( zlO-no?}%X~ndrpduIBmP@GZ`Whn_^*>Q>Rd=*UbT59FCs(KY%KHcDXnpAG-Wv=4jA zgs3yET;f+~o;PBlowSm9N8_s8w76j#z8kL!zm&aYm#fs98#8~oq^K5jqCLIy`$#pz zqd5B8@nF9h&0G<8o*c-bogPKIC^%-+A!|-AF?jSr9P|?e3h!O>kIQOFy6p3^+b0@2nUeQa&mpo1nv*syARdr zAGFO-8O#NgUie>i(1s!NWE%hpNUm`?64_zUThDBA-|KwMpXQ$)!4m;g& zYa{-=7SH7m=Ms%{J%c})TUB#k`GykWPW1f$DcBKcNNXjnD?-}21Flx46+4sKxzu;x z`rav>Ubn-XkM=YbHO_0d`k#+AR{P`>(@}4t@8j!3L$L}D4D`rl6hm^;hj0D8{K()| zM~3y_k4Zs(8|phT;<6N(jhlpsdQ23oTXm)WPomF8`Ir)L9*DMZ3ZtyH*>TS3Y{PF9 zV3F@R2K*(BtbNMeCb1tY>C{_F)6LMM7BI)`ihp}LH|uBJ+0lM3%>8bv4(A=E|5b}- zffSY9I=4DULYcSh0+)~=chzr$+}WV-Re_uHfuj?K2aGodC2Q0~E6k#fTz;6`hIFDw z4VI0*%9X`;I09KSfEwKAJKRG4=6|P);O8deCGhVlemEfVv9z-c#oEO(hK3hgl5k1v z3WFvI{WsHi@YO5tgD7fvipS5naAq_h=#{&rcx%G6r=?Bpesw)cPpB;V?DF1&3jlf2 zKYN04vS2h%OkYpA9$$+yLGA^7-kI^*3k~Mj>98=LpC1>TMECOjK7#IrprYVRvd3aR zxm45HUL5!^jsRm>5<$C}2dD0=#0L~-)4Vw2TlUt5>QSf1UPw_vuTm<}0YAT_@JHGT z;}Z(dgf8Fd9%epUEX{adp5+MO(VipDx(IlrZX+(wso7Fqj(r-apeZFHFb4{4CS1u1 zT$=46s99Z|SRmD&se|I!-ZE;1Sesc{bhM??a9_GLUIZR}$vg}4vGW*x{}x`-p*mx z-s5Ybd)+6c)Zt9>7o*V7^bQG>U!@2J@ICLq3~wY=^{D9C$e=)0n17(JNUzoUE8~}Q z(gUQ8A{UG`vQ2f3Q}|MJMKDf+Ne-qcyX+hOL(*k80Y zbNRzb%!4Y<6%S^?xM)Yi#V0&<7-OFY?$_?}SnM+RqtYSr8_j~ErQF{0GI~cNvXe^sJc>RF+( z%iZ?foNw&EN|$=7dB3PeABl0?MO`;7qDc40)O`SwxmMfPhEr?wJxI{KIu7Cf;@W$j zcvTLx_;hOU4e(~iC$iW!)2s_U@&~X=n;&NqELdDu6)`|&l{q&}&K|x`H^l)OXBfAO z>4>IT#Hyj9Cff+p*KEoOtV@_*wveuHNGx_y1GniS>e@aUF&$e6nb8Tmv zgepgiyCzDRDXj-6u(G9OPxX_;TXq01z}03`=gzq_G3IF@X;*j5v-t~rX=ER|2(EHm zPl6)m7O7?Hy$WaHgs#Hu6{M9v0aVh4oi2&_r5rGN@t9~sVEGqg>ORpe3-il*aY{mi0Fe6yRR?}#^%a9U*pmN%mgBA88q54FdVD5zT@SyMQ zXaJDV?{7A^&9Rr?x)fJN4#v&LC4s0n7C8L!U(0Yq)T~O?Tug95y+Sm%axIQD++w4m z$NJ1>YXauB(3bm!?njlt8_N5EF}AhNqTbqDd(kiA$D@L(>Jk?Y26RKq^qcSW8LDm= zreS#@P9z5j(4Q4tm54|LQ^9+_Bi_{Q8V9D6&q<9L{*ZGyVGh#C-pb>m!d!u@#xsNq z-u87toRlNPy7_`5i%~1rGq0n2x3+>3H%2DX1Zfu4gy8$K5)OJUaKB}3OyOcSpfI8&p4hbhAy zoIm0V3Tk7Q%y`Pnj6M3I%#!g%>wmjE{Z#$n0TrnrmdqsAvfpS8dyoEF9+_Z1y^iY* z!!e7;?}NA7D{+s190C#1{u*8FNFLXa#1<3&k5~3~K5F*rAbzf9t(J_jY*j?yH-h|L*1u2@?szt0Q-LD+Sfzdu^ z5Ba+ux74&4{ImL`afTn$VgjU@8!A|(8fSL&xDUrnjs8V8_`MJJsTOQD2~)^SCYcR4 z6kCWom}5&p71s9$+>P+w?{_ss5^6V6v>q}eqQ`V-2Kr=morc?JmAFG9eRN*Kf;t}~ zUdsI5Jj@7|{FE=)A1r=?wpd^;5+?@Ru>RR)5hxmVKu5&7@Rg4Se_tQcf)Zp^m0bIZ zJaW;Lh`?ff=``QfKIw$q9{D0YmRwnNXgpz46 zeQio>=m5_Hdn%0UI7f=As@O3V?`}MRGDmNf@fy9iwC6|m$|@lKT5K%CDriOHtbOL* z9exN)C=v<%=q+DVa(j5(hyHTm#twsCq#43CW#UPlTuk17dLL7+qp_&QSnyeRW4>Pb zpi{g@YPLqg+t&8MX_dAUw_CFwT{-wIF6nfgqi}IMyNk>imczgL(B*XeDMY^O73Un? ziQqja;q(`4)%CG^7|I6vIR*Zh{nZyM#~XcXbRuA5_93-#p_Tdxsbn>Pa;WZ&X@!#1 zu5Rs;QcMd97Eev|oK3s$*7%C4A5+SCC389FYQjM}m@}89ivrHuUrR^0pP=Ho z5Ycf=)|yY1?u$6%xMGo~cOh1KBMhIvW4QTM27(}T=YAl(Cz&5kf)*ATVf~NOK`|aM~Tx#2Jv^9z0k)5^VI|ZY3eMr+lm2of5 zQ8gM^W!ERL5{>M9`2?OgQi}OH=AZOAX4#=*83_^AXsZGM zosr*s_=18P9>%GnAmjf>H9n!ILnEM}>fHAq!r<0@7k}SvbI;*<66Swm2WiNIu7@#! zV`+xkn0ID;{QX$*phmkhMqYglTEpLHx38eWse z)^BG1#CL@_oS7qaI!U$|sh^S8P|wRHZor;ri40npQ#@g`!yB@-D_o;DVJQ_yo5*t< z(w~7eW>S|Pg3d%fP22_lAWIHw+dW6Zk-E{m?jE&Zkr7F6Z*R4=e;*Mi;JC7!_HCZ^ znoS%#a1rt~iRlTg$~Z&ykOh6@!Q_f^@Uac(c!32haAFzxr=+nr>^|>%>cdkcO)FIw zyFAQjE%ZXqzEB^q;jr&RxaS_}X+*SNqCNYFD|<_Uedl}kcj-Qgt%-sC#D+#l4p;1N zh0*CMm70fvvP_&1W9_H|cW82_%XwZZ;IIP`eD_xLJOw0UqqAMn zkD?ek2jpJo>xf@bPY<*5Oc2+B9%z6dUz3n5OO)H4N_n4SGxfC-JCm)~?Io*o-OMN@ zW64g`+`d`|-=LbN-m&s2R+7MH&kEe>${!WE#qY|Qn?l4))i~sTP4YAn%?2vj?Jo9t z{K#>iBq3V6{$a898%nZ50u}?w;EK}A(lHv>F1iNMIV6P<6iRovdl+j2e+y!R@J6ja zAV6?7LcNF>5)3cnLY|Pd_ky~u^H*Q`0y>>igSDp?*%!mquS%ouWQhA*A6s;6#&A7% zY6?$o2>O}8=Vm6SN3Xx+mfPkEc(w(*%NL289Ql=FQvM`|$-wuB^2XHQ0Dp%G2jN7$ zlTOr=>fo!D4!WakUUn(!GK)oJy~Z5SObYq^r4{}+E|YIPv^6G;)S{GRp71PoW+50>k<%m1UmgX);jodsW1(4d_h;l|W+J28|2LUa?F- zFXT6S`}NNA9cI0P27Z7-2Y)s6wWw174FtT{;Y%EfVbPK#DSv^K{LV7^CNTlARQNyM z84g{S$kLigSo4Af8-_z;H^eU|2(`q#6 z+kMAr3E2>|=){EFB?4P}hLEVmZQ2fTkqC2t1q7r}624LFgq4iFTlgI%na}fclv6H8 zpcqW-FTr8Zg|;)e!*MuvlZ{@v+~eLi9_)B;YksL+tkcH{-bu6THs+g%Ff~ydnV-BJ z)U>u@z>*h4OTi!-8Y;Y31j?#5yW@&p?>~>K3 zRsjx&8uweznH{LrrmAU!t21xdytf&r^(nevN)Hz*_~gWjb7sGBX~FyAbOSu(K64bP zoK#p7R3qPXeOW30gW#r6&im{O&|(g2y>F6AHc!{4ABO0 z<+Z)FXBf3TE|wQsP-tQ1gO+<#%Mm2JP1Wqy_}ChKY04wDKAmeJ+rxA_9Z;+>Gka)& zJ2y@k+bzZLYu@DW*Gd@I2H8h}@UF4QCd?of$?9V#UDe$ulk%S^)eD?&ojflKuDIsa z=|aB;`s$3SW4WvBD{%T?zWy=(>dx-WU7`GxtwKi~vWWqqQ0Bm?k*hBoYQ_=SCbk{m zpUhd8Z2YPx(@3?^F-FUNlKo|f^*BRUSi|Ptw~GE-dvl_Z>Gt+nYw1N9dnS7d2V5&17D1Sx9iVgCB@=06*3mi35W=*>j^A^v~9ce|pzp1}~y zwB)!fAX;LsnTy%xu6MGLZVAj2GEm|ZxHKi_9qqL`3uG?V^Au_}K{G$eL!di~w!7@K zwjLt>%6?91%(4l>HWWnTET zTyPw1IhB#g+UKfplj0{`h0Lbq$Knz!ekXn~s8l5rizKfqMi9 zc3k$XdeDN!RUP&*-dRJ#VDDu3jQsA83g)ro^uiI#(;Ho@I|)Os1|9tz81111Z&670 zV1T2^BKf3VrV1RW$Y`#S9o$rI2-`fdv%X#L-Zk5lBF&e2;VL}unm;KzM6Ct)eJ^^V zekN=fWvO9Hd!vI315~K^f&0vK|KfkdXwz98P_Hxu9@iGZ5jo39~;68a@+?^QcGrEd{ zD5`4-;+}#;KUL$cw({=@UXr#B_@Oc(yY56$v+_x;cnIs=#wL1nYl2v{_mh|#5-qbL zz{%?x^AAQ$K#j%$AwkT}rbu3G)IBw=Xz#4=-NU$QR#DXaEDCEPbF9i9#UEZ0s+rNR z!eV=K=rc!d$brBsOa`v&Xn4v9(}{za7eQ(AVnO!B-FI%d_S0y4=A*10tNW>|0BwRR zXAFi9u4KU6p}KlKm z9{V8tgxtncBC3s@AcccPG-aQ}4|>$TS95>P3f11EXq{Xq-tr~#S#%B!F$bp7IO|D7 z(VG8rjO+l-l$G^IN8cqa@%!)l#Jk>g>{x9GEY>Of70JX1ER7$VzLhD_J86f|Chy<% zAQ%<2r*O<}w_F+As9cbwPt&>a*QO?GvJM;xe+|Wssa4={JM=+Da_rAftnN5I4${Ob z0Ya0W`2{f*<@I@o$lqh$QY-v+>Z2!L{amo&NGb}*@cCEArJLWqI~_*M`v$NiyCcqI|oPolTMIO`Em zks>7X%HAm~`iCd#*Yr4i1D65p6{%o;U9`P&k2lkP1Jv}7)nnLgzKRZ^@hYGBXR!Gl90&b>kUJMs;S zq)0&w25o9eJ*3Y^2C0pQ1Io|J}|fx^md&izhp~HG9(PdOh@%d&)YOq32b2dw2YXe1Zft(0xjwouGLZ6-Ny28q zPErhxw_ZdyU>(0vs0lcaKb0Uys&HmD$ZlC6L;3suaH&++kF4tyv-OTcsbr4(9^!c> zB{KV1wK+nWp+)kob z0tCsCuD0@xag>dW21O;9_JcH#(d-55n3SkCU#(iXYabp>8KW1~c8W`iUz`*O-4q9| z$YJwvyCyNwkCn`Uhw%+(JKFLdU_&Pvy~Q;B@Wy3>hMJ6&)Q60gB3r#m+!|B9$SEAH zzop>`hDW-b*qFMc?@5|5?494P=V zAb5DQti{4@E}XVztvPBV4yoyFXe(%{gmZ^V69Us>l;LU5pJ2(GL~U8060)DH)6_6)m6vLlq*mlj{wUhuxJK7mi2n zG)~Y^go|SC7e z$xbBhXUXvud`ubDSoTW1^fziHZ2@?TE!UC(1repWo#Y1?dSYG&nKj{><;89n=q zdMp7ikjs-b*lzzCRJgHPQhexnl@QvpHPZ+H8LO!hi_5dnPgHu8i?=#$7pLrekiZtdS_RMgDKgxgM1|sjA3d)s_5{9Eb9&YhvA(xwzO|uG*=_sIn zd+2D{lsZ^R{8psnW@0$D2!yHhKb=)c*8q@J8l!*z!%}Idka&qlEP&6I7o6l`ddCAv zahpJ`R-^MKtI2-P{U-nR`fB$!FttM!l4H^oj%L-QnxjE7pR{6NswPN|E`Mg$ndU=a zWV?VTXH0c{o(M}RTdLNZx72XaFtx8JOU;;T*S0-LUQ2CEHrPwDSt_};16^n1T_EZ{ zMn`L*A-VY_8;BWO{2Rn7txJ`>L(VoWLDd(}T28RWOLGYH~=MV&T^03FZiKG*!SLp`QP`B{WZ$MeLQj7xn9!PuE-#VAD@&m+O%rj zj6M{ljU~A(WGr(BO6-eWnG?q_+Y!rA(ina4;9h8qB-s-&e8t=MI<|0S{jqRW8@P3$aam$228U~);<>bPsCEVnIOK`h+`e5 z=HPPZaTtU|FHqD{;WvuEI6s{nD^UGIx?;rb(hZfMXd19d<)7n;zz?ATr=nCj?67Bq9C2GzqOdbCbFT*J&Ng2}kepHYiyi3q zPHHGFDA5|1KIGyX)QczL2j-59wnIiR2g?+DkA2^Xyvu@pqBF0e~0Ci8;& z-(wc^&1_%XJ9Asq%N88gY}vs-Lp&!cd#Vr`{Ij>6$6si!oV(9e?WwQaOOg^J1>Z5S zsnOyKLo8uLk&Nwobpo6r>^4Bg$z^(W})p|EaeG#&mRF!x+3HVkwhiV%d zpU&O1WiREXxhVQW0qFOl93Vg|2` zd6YKPFLjU#wkq-Ikip`Fc(gg(Sx!+N@fS^DwYm)c{?9Jp}mOSC??nX|L!b$&vGLApXhf*NFxL>Gmb65{c} zpKZYd1BQ2v1njac+jf0fU!-_?Ru-H(qc)xP)K1%vt1|=wVRVLcr&Q)L8Mvn}Kea%&SbqEfFMz>8}P`$IzU7(du1I{LDuG7Q+DC2kC2bRI^r-Uh?yS@p|l7eEPGl-qN26b%7T3{(tTa4jvTVVg*9PXHk4 zamx2E2atDZBK~(l_|uCis@Z){;^Rnb>SM1komHuh>biX6c9*NUCqkkhYfIZ?@vIT` zaT{~~xGNKyUUM0rY)i7EXxdydGy|E3g&3V}qBB)wS7Q;*5WNHamoqc2 zrZ5@Hru5a9PK8<&FJ_xI=iFB9?bMv}PP>IpdhvSWFVyGfTWXv(dFInzQzXMp9B*Hd z6}dL!cdz`6yY5zb2C2v*hN8)IS(wgxV}h=pfnl!vUON>2B*_e9wu*I zC_1Q%*>;Zz&50;FUOu%mbDGxyA*+rls=ZL7eZkp(F*EhN)@cbD?xts_YOD9SC_I%^ zo#*vS*>#4Eaib@iB2$jH-uO7-MK0uT%jE*_8}rW!>@FO3mLj#nTR!5CkCUbs0Lp_RNL!Hd4I_}yLqk!B~(a9cr1ntI6BmOD{gjmtW`wI-CIPC?Ir>MwQ&2Y zc=P(K%{l+_ZF(c??h9NHb#Yj*P&%JJq}3(nt=)HLjGF9TEsH1(3ZrJsZT>LL~e9# zclRNe<&%=?idJEG zn2gkb05;%zf$xXexMoiRF=gKtT(!da99wW4CS7Z-7_6EkjFxfR)NAT2Di;O;SO_DI zlc@o?{i+Zig7O2*;S3d3Ul{EwY^w8~cQbX0|F8<&j1vSy_*pDPwyBvmX8+38Db2ZD z6P%f!TMwEjk%uvP(&)W?+)^UyIc>5#@gMQYp(2e`Fi7aXdT;ucFv;}sdK(ooh2}#9 z?Ie);|KYU%et-0qec(cnC6hhyzR1ZFz9x5@edDnl{>r`rS@(o|`hucIotSo^3XY%l zX#Z)a9JB|iUAlW$I>ZXz48S-eNECv0HufVZ#7D4>+3&cH(fR0 z!LK9PWI7LmKb;?3DY;0@f@&PM2minY;B!NWjJE1x0Uz8LnneeagTEy`4R{5Oey%%= zeRjykUrj-}O~(>nP>a+5w`8xQH9^pWvWg~rR%S1AReyI+@|qCA)1aZ{2Ns|1|CNU7 z83v2eQ{|d)gfz#9(N8SEXPV~ugx#pHSeKO)+}V{_@WhRkQU}o-j?q+RC3DhQdw2CT zp1T<9axceGU!QmUt$pnEIrd5^Cz!n>Vm(l~t)DCTp3m1LqINoG?uy6GEB0x|olor# zP@RICS~~`9^W9$!CsO%~PxyI{Xl0)2u>9?UWmkKNe=|wBp#F1wD3w&8Og0>y(+dBp zzMN}__*fc$ip(QYR;OOWV@AobflpOL8J^ABR3Xt)KDqQh=3K%Wx4>ud0SAGnp|`*| zAT3D3@PkcxV$DV+5C*?`$?>-=Ly|BFbL{X)Uha=FaX#29wx7wZ2ST*1on)fPEFPj7 ze-!=uP|EM0+>T2J=|-xN#`!r@&%8}}b)l%@Z;t{}qP%lN2oo!?QLM1NCTgRr!lZK{ z$xqzt_tKB~MZoH&7I!K&(DP^b^*Aby-{BJ6RiR5HEQBoMX|XV3ddsx6?0rWe<#BmJePJhpfQK-f#nUuhxQ zB6?Rw%g=CrG6JxAfnKBwcC60--edf{U40?n4YnyeLX^h<6ja|45e%-Na(GNy2pk)O ziO7rrma&eb@&m8Xb7q`ONY68;ey?Q@G1|T)Xu?iNNF+!ZNqm`oUR{-=@tWUNnmDZ3 zdLh|F%dhV1;@oB2B9|X;r-^BDiI}2cWTbJ)M*}jburBmo=R3MZxK1A6U5)gt>{v=r zaGzM1O(nZ24D`j@S}Ta0lGu;Dz<;)qNQx?@f73QpECBkGo!twKrBGM_s5IW32GS)^CuPuX1!t`CoI7e^`&vozfnhN>9To_UL#?AS@{pdK)=i zTethZOltMCJU(x(W_(_F5mwSzQPr|D9AIw^%{Uz=k@Jtow5_CV=0C>WJ)()tum&7o z=MH*E{G{F`GJ&1DZueEDenYXR|mIA=F<-Qro`$-@y&v-V(B-v5@%PQT)C4Cfb;MG(In4TieD@LzQAx>6Vfu zzVSUm(1~_EEKdgAp7g2}-&QRT?;5vZ_)^S4kD69CC{y*P`7oBr%Gc`v5_2bvzqD2O z%&acKaazJUGOJgwVxi5UeamaION>77nm`G$W`iTlfNZ+{7&nx$sH}!(__RF2^fg>QJ@;Z}K*fL;{j2Q|_?{-l zAup{Cup<>2L{|6=s+!sfr)*~bIZrx?`C`l|mN^>KenN}iCw2nmTAACxUiO-q6mlH2OQx4;*3n{!=C z)Za~d@nH-wJ0KXwgy{YQ{W>OYVg0+yzKC?gkEFrc10)^ zIK=WX3DgtTL+edG`%PGDoHlJ5FHw86ER`sv3k&Ah(%QGrOU_9`nIsF5KeC&*c8w%g z+~cL*8A(+bhV0&nGA|YoD$0p#zSM|6D@F-#AXifa2I59%#dLMvUEIrf0xhFKa)0Sz zmssW5`sSi96iaiPhT8T?RO0i{M}6D;USz4a#$SK)8}-sFgy2+Hy3U&A5(4=1hFvL~ zFYWL#YJF%qcvJrGcRRnt_2M$wug|ZeL9bfV+bkp&{CZm(u7QA-(nWw{Eaf_x4UVJ2 zVIO@{!1(bZ`!DwFHoN8a!kfXvNLb>;5X(zoKHn%QaW|E0Y>)xI{?OdqwmrIylKP^O*EE^c%cc`F zoetqP$f;&@*E?@cVpeoBrR%J8h{wObIbUw)m(&XqpfDoVGxkEv%c5#*eE1uL>e<3i z{|anAxky6;FLS(~o-o7Y@P(4|I-V;H^+E(vXGkoL$VkBd;$gSPE7zTBV{ch|;}@lO zDEL`?DXxEum0^P?$e8|!3N5wy-4M^(a$5BNx$^w}_~&H$Efe(}=trr+bV7@hpE}KY zsXrs>rr^OI{qlP>EQbTjn*)o)kx}Kc$CLNmC3?}RL^-||f~}X16(s@uf9{1>Q}(-3 ztaePAq7-Y&kU{G?&COAvcxMyV5TG> zulZ|Y=+CtbGfXTZ(6A2>Wd>L?RlAi)XdOe6He-kP#_4%|>~>mdE_nl3tSD_j_(6I9PwKFb|g78aiOS}8L= z5pR0)Dd@=FhgT1dYhh0c+C&CRK(ACKg@kJJ>&-XKqrMJ;D$k9JRANQ3aracEnu3Tc zxK3RB5%!rDf4(^WIa%Te?M>!b3M3Cb=^FqXZ04}COs~VM@a_|WE;#=q?RU*!7d+6n z)|nuSG*ISJZH@Pv4M%cxis`Zbp}es^I96(7PYc}dsA1br8jo#CmoCWJ#pg&!!;=Hb zA8;D?u$8ID zD=;=<@~KPZE?SypZTNm#<3<)&0ypeYFMzh3VODGS-edfv z7iaA`f~Y(`+ZU76*pDpd4N@57zN$6^1$fT5&_4DY=4$t8Ol^yhQo?bp*C=Hrs@{F~ zZy0+su+a5Lem6F#q+(Hfj*5iqbG&s2Ze-krSe6WRV;wQz0TTs9mqA6LwE~`ENN~5wmEggTI?QEDH|Ky1t6O3(hF;msG5>uU-y=|>s*Qny zb|U}TSxv@xT{nSRwuqRfcNgWY4nd|$_dVif`8k)42JuR0jhx7;L}|9%xfWS0|FqCn zj~yyPQH@Y0HrXuoo01BpPqKZ*RCRiamm-K&#-^-zNk4&OQs#DO!OllfZKDy<1s7~J zode~B(Io%X8v8s7Y#VJF(OUhHvS=}m)26;^qmLjrDpnKo1Edk{?8Zh4-?9|gBROqK z9|tZc+@7d{b)I3rvlF^*7mWH8ff?1p#c3DPX8I9k#TSlPq3LOyQO#MscPzh}W1Ub6 zs&(549+{I7U*Q|G0Q`O6t9t1K1TmjiW&@l-IEtU}jAT&-8ij9^JFBUyaun;cLw>Yk zXt0h(bLa7jqJ1pBb9ULjbj(Mwo9G3@AJ#RvzI{&y z%ThQcj+KTL)o0%$v23QC2SCjcVu>?4b15}*-qg8zvnLBl5*6wILOyxO@{791&p@)7 z?QR?JmS1gH7iZ#^!yu~fh0N7_atvwU`49!i>Y+}0$L!B5yB(ZN?2h~C|KgZA??OCPe4h;)mZfbf_Q z!G82pA;BkBq2+V#GPBdoc}}_r8XA*LZ?N76NgaaIwZ2nseQjuBN14eC4*YW?R|_tA zBAYBWxdOzFsSkln;T*g!)r{=_KFK55IT-;i_~2e@@NHH5*@Y7aSSMC`deVqG zD(FMpQnad;pOOFpssX2eX(xOQW1=>w{BmTzh)9njzArx(dz`OQ#&#CJ2VltQRP$w_ zh_5J+MhqC+b94!#Jl_froY4*l+)I=>p!*_st0vW^NYU7tT^Q4upQ6v8L_|sOKz@>j z3n&SnEpL{U0xL$`*cHXQ%j#p|p#QXAcA}}MEWlWVa*ca(#`ZtIAGj1<&Usjm%s%|B zI4Sge^8iwjI{I;J;X-vx_D74!U<~^^lD%^Jo(oFKLLFC5ArT%sF7L&Mw%-BDi35ks zj&HF}*qxvD6!uJslYS>Xkbck6=`T@u+EtKk@F!Z>-Hfj%Em-NhB9<&QX(G4f32jP8 zYy|{t)o>esu;W7LK;vAew~EpcWP2&=w1)~*F@`d#5QzF0-fZ=X8Z;niVB6Rh zHv)_L*6*1^@%*e5CjH%1CO?F5(FXrol>8dh#6&r~#COvQED+EMtUEY-@o)9{=lYlk z$Vt*Ud1pH=mA}QF{G?dszzvS#PT2=ij*M~c#+O!7ltTIKxrP~S{y2UMmvnzOP`3ww z%a+s{eC(`9+=A-7UJ$Rllte&-lu_d*GziI!x|T$@zc7qT-ah>cL6HS-_E8`~OQ7|U zM9(a0PDUESdy9OF#TVp}0B^J4JI=R6deRLs2V2`s!+f!YAn!I$nkd-G(>;RbqzU7- zjSX=PhR5p?J~m5PPk>FruQYET?AcFUgE#U>M<4zK8xTN4t=u9dVx*eoc|%jfr?ck= z1$;iX^?J>C(t!d@6>q#}VezV#he=Fn_O!y3_Qrca6y(cl)9m8rcT#$2SjB0#^633Y zMJoPmA2$kgoCN92OJ9cWzgJ#9aboBEb0~GaPvxLUVp9Co?&ftyVKWI%k_($ zdZXEc1h1nLiC5k63&#d7{g@anD(6lpF);ZbU7uwgy0B&Ox!S8pG z!FF~z&E{tkVJ^#x?PWD+WJj=4@%d8Cb$8sd;88ln`YjM?!svweWr*@;2ucVK{Zx9# z&X}3&mZ&J-k3AZtmL|6em8wGs{t9C2H@e>2;I1c~E)Lv##WtmsNG1cxI+0jy2rYh> z7=6=Yrv4}pOgM|1!>$?A+#y;#V)^WY->GVYNMA*1q2GIHq^QnZ)(o?d%Wh! z2P}Yh6G2*q&;8SaFs_>hX^`lGv9D2%D*Dc;dE6{NK|yZVjAOtaE6M1v7UJpzWGX2TPM<= z^4*e=;Jh+=7S_8Jcq#5NP1;`y?}X67XL)=c4@td@uNwOPc{zoq6lK^T z+G;6@=9D^jyV!_)sBS+I;gYekaB9K@B2IVu7%d;NINMgY+0Cd0a$CN$063{I6Nl>OP$T{HVaohh7a>Q;TkGY;%POi0Lu7Ki7kYFY4wx-P&Y{L$`a zhWBi3<&>*K$$YDyA}6FWT$Bhv|k|7ot& zFCNc-=?^~YKg_krrOzF`bbYCAlyS2vDuEdo6tT;iFU_UaD z{(UGD-`H;p?unEaU!VsqVowM#&?|gbRJFx=Dgwb5;G)KLbVr0$5p(o8@3sP|^qR0~ zOV&e6M=Hil%<=niE1eaS70txKe^QZw)Ag6)6{1~7oAa=!9=$FyXn1E@lpaxXw3TUn zIWH3_kHeb zE1qT#4-3n0Ih4wX?5q4nqgH5=Yf_X6n3yq69I$y{6<<3NSw{ak2m}qP@W$!RdNm)< zb$fhlu<_U6)+XqR0?>V`!ht9>$5RfO}=*mJ~OWP0~>85&5;D3suc zZ#!tEmigZy`cSTA_*Sz?1{0wX?6(N{Jw2>l9~=2>F_gpo6C0C(Z9bG*&BG7fj|Q-E zQ?BM=t^#j18u)-m^O+b(=Ar831Y6xa5jGiQ65)N@OYa@cGV zlwmRtsrN`Mxoo<86n>KW=`NAX^k(AxM5n;`;9ls#0Mng4uR5me8f+Y&s>st-Qd)<8 zIW+23mQ#KXDS>VtWi73gswfcwArzp4lEl1QrMN%ZFO(BTKN<&<@I0dVG#)=+Ns*K) zrbt-G49JyirtQwZ&b8s8&Fqsi4!-e#yo2UqA>B*bga6uQk7YttfXWJVE74JVw?40K zJ~^H+sI3oXma$eujfcvXX5n-*cVxx z4-Kd6`UgUNRaaR#2|;5Ag||+qT$o2KqCcq6<7zEy84jG0AQ;LnnIqau(yz9NZJS#? znaI)>_=cy9vDHq=6D&l@pu3*rIWH{;fnax0JNS5;si6LRXdIsAoY{J-l#6@xTcx-c z?7+z8ZP~Tt-y}cj^M>!*v)Waj40g?3>_oN9a6@uQf~T}OS_2~^A=tDVpU{8Si7vOLwP_No}-Brba&V>dI6(_0KK7-+ZFxKv? zm0)mI=}I2A$bOo=IxEKxI!Yu{7K2|5_Z^5c<3nF~qGA{dJmR`$6*U zQEGjEbm<_S=3TUM|5lj^IO}#)IB-(0wdP65pa)z3qXZw3(BOt%xA6&62q! zuKGjA##T*p87fL2cX_24_ffWOaCOH(UvBT@1eFYW8&mag`vw+a+%MW4pX7p(_}D!F z88~wa>_~jw-CtpGg{hNvymD&tr&;4Yr{gnG51z%get#tdSpmr4$d9YD&W$hiG)^sR zMp{U%^`r#HF~}^!U6!Tk{^vj9uJqk35S6^T@y-=5Zp(`{c^ylWl!f#dkw+>Rd#gI0 z;74_2MBms+$6~R5eZVcfCz#~EHZ+iLP)rPSvEoSV3|&(_MkH#g^z*K?Y-VLW`K|fY z9a{&3`?9%+^6#@qyKDQ-2BUzNPQPmlls+i^`Q2w7UKOMb1z3`wVgC)}U1l`WZI_ZV zOczXGCDt@F-&Rv9M-R90Aa2B?;y*1jO_wg&Pv&wy@6BTcj9Oc)OJ?wNRb?D! z`atQ@(?uK!S5vb}b{$r0Y`@X@Jzw_{TlB5!Ed!mcf$cC>o5?*1k5Q!xPTdnPT6Txm z?~(Oo4*S>;V)fDNn_hy{$`%Zm5w-)I>nb5?oK)iSJIaiB)4s@+J>y@jPcvt=DQ?VJ^)D^V>M`}%*l>?dw%q3$D!yVi+RUw``xhI!ZTiHu|;?1Q+uRw zf3@INH-a;Kv9@7^bXgd5G(O)+d{rly-;U`fm>_MW5X3t|Gge7i(m$nnGu&4$lC_ai z;UeH%$i@+u&Z(`f~Q_!ZUl{2 z5@W3PclWiz=Y-pNY9xY__XG%&*l~7Na|r8&)Od#x&hdTmNQBv^6PQI3=JD#qRQ*c- z^*yQ^=I>8#e-k-5Ku*W!^1E9`(|;(-)W5Bj|2&5Yh!fx}PhV$4a!Fo?ZZamkLX-WT zx_PQv8d?%3Yp^p?6q)oV4J=52UNQ0$w&mE4Ved}s;NWj+M&R)r;MMzylwJO<`X*DO zS4U*xA8G5@9g$v>l~NJddqUyJfd7)VaeM#j&RBln2b`S*@qy6_#w4bCr>60iFrul? z_{4@UVNBx3nG=f6{117D4e@GcqrHt!K3m-NzU_{R%SNELR4&m$!MxL_+IrTqQstb< z7a|)mF?sy9ulRkbEhUq?s}v-GrrU#CoydVw>Q)N|la@?w@{p8BO&2{!eqKHUn}tSEm#^ht!A0eT#i&pxGChr22#@LU0HH<~pdq zs}HNV>Lo4qs-Ozh&_W}+q#E2-|F`!$%*OoelV6a672(F_wQ{kIV1Gr1(C#>Z_3Fd* zi$jzDegT7ZSnCH#?b*5oY-K6(lcS?QYpc<$eYse^=i-Pg8+eP^UO@;R)%5An;}TEd zwg-F6xJVkP&tFgPb3!1o_#NatpTU_5RPgd`GWv2}wz#A{4CXNvfDRXU2ylf7cWiZU zi|o$k7n*wP0ZM`4ckH?@_Ty?)1amlH6mzm1-eNSx&k&=)2@l}p?A!C~$o7a=X7p86 z>R@FRajB!98D&>5oAa3wk%+xcT^GFsTQMK<*YU9?ZX43L;%HkK<_~EOb6)0o=U44m z!r@!5=9LW=Y$h2xL~*p^bt6PX&c+JL+j+&~Uuve5YabK3qQj@L33Lih#3iH$TYGxr zm${GB7#K*sueQ~IWL~0ll8scOAfEG%*GZUi^)2y%!P{Gpzft_j|MdHbtX-Tw>EsmI z;Mas}VF>tHc>WF6Yr69IG1-zLJJi0ADU@lHTKN*_?&k<@Jihv!rTtCjr+10XXPNu> zT`Z-9B>v^*rxOHI{Ji1jH5p~_^1#DVqAqyyFe{~&%_4~^-%zAS+2(f2m7556L-=Tl zFx&cRCp8uu%+DjTM6Yl2+Adw+46 zu-3)QR@k^q(-&fPjYW7899Y`?+1(J05L$7q-LlecsMM_>R{?H$TH7fRU$q9eTNP??@2?rlu6PUyMf92#7l~pL6V`v0n{>rQOB-OKIxH@LKaA9TAOjQ5LIR?#kKVNz;a2 z^e!37?S%zza-z+VkjNh+EBiK#r`jT(+Gk=7_|!nCVzfd-z&=XL1#{5A;JlvWGb*U7 z9<+;twkLjR>G=%gj9zEq8UULC@5cTMW5Sohx&5Y>le${ zRUzp%=Kz^h_LQvWe^jIdszUdgGW8oKzbYXo*0DdDw2Y3w>U%frpeLs3raZQrKq3gS zY0>>YaJ<&a_zOH{p4qB4^zZ;+cRwNZoA`K@$$yLuA#XIL>J^dCV=cUJdprw$^ad82 zWU-6Mlgb`1O;_87&Iw}|o0Y7O_AZ8c@HUZD_KN38rcm_ED{aUcj?6{(tZdL@B>g5a zmxz+W9seXW={il%fU<0{GpKC{VbPmmcn`Cj#KbLL)Q{>p7Un<8OUWHZ+f7pAb<@P{ z=*7KDkU741chE9fh&~d3nlvQq_l;ljLUuMPYJ6U30lrSez zc$V6D;a+=M-2YEIN{4R*&ef5B z9~yrW+#iOjgDI-Y8-0_%g*Yt-M00KzFN&#F1aC?eQhrZkVR{GnjFCeEGlh|j_y?xC za$9)C3tDQe3bx3W%q?tB9OGg}Hx~_p3m?(#wVhX(?)VT5cyD(`@8ur!tG|zv`3Z-M zyWO#G!aD2&}Q>XKBY+3oIdv(=l!x+WE5=N?qUU#s;O}55JRc>X_N$oy@4XoT@57 zJ}Lz%{B`(Z&+{q?v^EZFxoKIbY&Pp58PjbVEJbw!S+)hUR9}}yv6v}2d6LvC?*F~L zLZBZHG=J#+k~_<~by+fSkf1a#7r?zajSFUwQdhNm&*0Q_K2hiQWF|@1h*tSm@mog# zv|b4{Ty|ZD+x!=@n$BOIMm_+xUbVo#jDd4Zl_`=(nmiSaequoMGUB8#veXnR2~;Y^ zMX2T~I!)+Cc6b|dGVC9-?12w_k<*q^e4YU zB`VW1jQ~!E0u^^(VN`q3X7TKNUVmJ4fkgMWE?(LV;t7!k1iKrMJ?Lq$3A%iGY1ziS zQYmj1(q*|9g>9wL6qT1tjvethoJ>8oLq6aFl1m+&xTj^Q+X7yZ=xXtB43Gqg9ye|r z$}{^h(}^w3OA5-5LH{lm;l!DNhCfa*)OtAFBZ0M^DV1e*W!42NbZgYt>E8}T$*R;H zz3;kfFfJT53AAHfh-`iGgY*l!7Xw;$qRZ%R+S1NE-Altp#sYc|a$I^)uXD*eX6B95 zB&YsK(zKAPGTr~8*A2ao=}}RtP>J4Uuura+=+SLZ{tK5IvR zzq4C`wprcaLn7`>Kz=C3QpTw_wv%N6wp1Fku-g&sNpLqw3jOkg{tD|13z?|M_~gm% z+1BMpsFFOs7^V{e0d#4t6zVxWNwNojtT9F4v&M7G4vf*fe`^PWmD{!tmK0ZOa zbLW8`hN=1bWftL62kM~H8fCA4;0y`WJ0~w57K_>Ss8Vp3iy9x7GlI5D#mUX%Lfg!O zvZU{}F<)3u zM}9|z!w7O}5JIAKTv5>#=^6&*7cIPOgN-Ca&q@xrzhUUEs6+CV<#CD*d}T{F2PR5;2tCL!MVVq8=>GNI4}DHK z=p29oX_^r0+MM}u5+_R!+7P@4(Eb$)Vr*=H#br(3Xd{eI4^l`7RKHBwb^%iSr zC!XCwEJ4XjU-+BeYExhK&cEG^@8JfMpA9cIA{)en#LODcOg_2VC9?bjoq7cDS=`2Z zI!VtqzgS7kAM$Chffo%UPTruyu$A5wYyba&OFDlsxZlhl?WStUy##ge@UfPy$m!sz zZ`Y69@Uyj- zL#TKLW_!444>nnI*Yw$J|9az~`K25=tle+LL&J;v*I$6MR}BRbLUAp79X`e*o^bh7 znGY$i7*w>ivad$`DCP2MQ9G)IMTBP~KVwQ!q0?16TQu%`6l+7Af|R1c<$KB%iO%?q zHlB)24DN6SMal_#(TEXT4}#0gIR`za$c!S@OZ|88zDXLQ$oj|y4eK%l9O$c5Mr4&yDP_G}n0(PE{ z8X796t_GvV!m2G!?YVb~Pp=8>=3+!oxX%;KPj1ov#K%M#McBxzW}`<@U;Sg8kH(A| zxkxM`wIlh-@X7K%5^B!GkP>~3X;SPTXRukLagekn#`_SmAboVgHz>TjIt4Ct5&6X~ zZ=z`M)%Orpnk}82cMu=Rc5fU)9-Tm+RFVJpZrLK1=8CEtZ_xr{)@3Ls{my+1LtH>9 z?UxqO4_CXxdA9V%H)}aSFPA(b>IOOBGBs^YhE>T9sF@2|-JjlZ=4sojEb=jjjC87` zh_Vow9=}4`HeL;cp7> zj^xkPt0}891nL-N*+WSgzR%Zd%#-Q>1lA8CLZa7kzbRA=8`^jTWXv)VFN^I zjRb(7WihbNYOr|nQr?_j^lFJl(i-Q{2UdK=O_3mBzi|8{1(j>f#}!jwZIrN>@pM+O z3<^H~JE$9oTKQ}t^BOW+3ZB*q!2eA9!+P#6^G^-x^Nv9zb&2#!Kt8VECi)~jIQ^vD zHEd+-=VQ#fit^ohtl23ovu2rXl0#x&yWa7PbG}I)1#*BE`Kq1?y?=u0G0poxgB#YB z1NsT{eZzre{p3Pr^rTh@wTsj?3lGgzd9@;2lZT$;I3`)pRY*C7nWWoBVwGLn?`xy4 z=siKTmsHW7yge5-j4C0_cpt(|Xv|DDJ3Hd42R8zMU%@1e`;c=OE_;^B;%@AHkNG64 z*B;@nuk-^)u>zZC(Fd9z{K;%@*S>*(tg@2Rzm1(eqds%g(hz-HrB)!DG@de_7V!Sf ze(xGGxc*$kjI`Zl_@-JUz%R<{OLrAwb7o$WC!LngrGk!xDNA-FRL!h!C|6Kg-1~eZ z#%>$6RUtXlW@gi@Z?A5n1x0pqyFX(L-x)6qosOhT+M^zyMR2xu#Tg< zvW_zI;sv-9Zd$2iU(3X<^nXxjerJE64Sxm9u%vTzd`8mll$XE%C*7o_yRNF?4BWRA z!+m!6bG;WYrTkU49cZ{>$p1P+eg6(xpXEj*t1BO$;g7yP-@?|Lv+&yh^-_@{e*-rA zV{k5hN*Nh8Wazp_`JH(}9rCfHL^kDM3v>_naegNbzmd%|oWs;AXQCf$a}Y5(9z9-L zv1yvm$qvr45Ox2z%!8BC_z_%=g;#GFwoqQoiNp8S$!(@e-2n0@*XEdqPj8hL zrRO;e)wEC~lHg?F+xu`_XBrYh!i?9T{)I&Y1q$#aeiR=7bS}&X0Nbbc;tD9DTgB(Y16?4qVL~lr;uEbQ=9jKllY+5r5_p>!fwM~0}v7i+A* zf_0wiPiu!T?>!MI3)6mQ!!v(a8+}b838we~*H5*;A`9(QkIuOVf>FppD+|tw_Y_TN zu8P3NZmXx%SyMX+#vHx(s0Vst;YMh4maZ!4%QrXP^>5k*1vPVOoSX|g=E8AKe}x5E zP`N*GHK#6-075Q>+BwRZ56W69>z1Nw8ZP4j;Q$uVzA7?K9M7{q`R#O7i%vw*I#H!zr0lB11*ReGih6+6BJ-iD)}! zR>BHARpd|*q&{XF&wF`x?BZ|-ZT!5JpI`qQ^!y_1LG)EjZhJo#x8aNSrgC;Ci^$hB zbNEWCjA&g!#g~I5sV8mC8UuG}?eIdX=3Ix$rE92Jprf!R zg+;y@+|vXG_)dtE3&_#lUO1BxvC~Z*l!3IG-p&f%un|aavWJdi4@XmDQ&RT|j;>}| z1gM|`5ZJ>3)^!R`)L$G?MCEn#(%It1QsFb`Oe5>hfa=WWos@af{{;G?3xE8L zA6g5Nixk5+Mg6(=UMNL(k+nd9@~F37GDsFxq~2owFbRKbJ9Ej+3;q!<086GI_DU0O zh&Tu zb6G3v*V^z5Yqenk9yS>(>boDvvV|{5)0uk%A&WU=laQCc=Qj?EM+Xt6)7rDN;l%18 zaqY1i`*s0woGNUjwwQvX4KcDW+&6enj4-L?69O{OS0O;nf5P?k;qCD%PiIU0*N^oB z?f3!fhvm<#nkkw_12kT(a{@JnyVyf2DV_J;eEc32BA%l?2iKVOth*k}Q(&1M&FDwX z{Tjo|K`?uiYU(Uj0;kXKEcaMORen7P__(ZA+tnE7iF)573&SF8zzO4~M?aMl^g(Hp1H{_baVu2v(&!JYU!deR5aC z6($q1lu)#M{|HvIx{`_@pY>%%fv$SiJ!n(|fcgYQ zN50k3*qM1yxZMP+D%P_p6?}_SmFC7Ps=(UaDMQg_4HYPy}Dnb0PH_R z>iT|{ym{oB#e3Q9j`6TTM{@(QXIt6+x*y^-SC!^|*Hpgp(ch{RU%!VsTO^en;O!H{*$hL}?)r<5;wG}VRnW%%X{WTMal zIG64*Wj;IV=TGo)u3p(7%Qsd71_M3$fmhdl)w^wN0<$OD3pk#{J)tNR=D%mN(z1^s ztfXf_&)`cV?D7One@F{WTsfBJSK=(hEqX+0)SHf99(=*=J>)4>S6F6@oUI>T;FJki zQd*8eUL=YJaE`4~4PMS_grm3`EV4YkB)1?q-6ocV`MHaMxu_rIfP0LB9{S&cV?I4O@mDy z$omLg>{p9}FEAUAHXxYnRdR)?mRI=#Tb{N;6*Nbkmaykt347drt>k&|j@r3(i8$m< zOtID<{xomd-kEH5aqk@@@OgvsR>74R_?Mz*F|@=GDnK;D=SLRuEo5fS^N_^M5Nd%=Rx3rkl=o5qg_ znjbO`SIs$W|6l|P1LPdUw*w-%$GJo|@m1=b@N#&WaYiq08GXa*gD`;fGtg3+dLrGg zntDIVV7tSCA!0BOAqY%A$k(s|w0qsI3JJP3{kMX$Kwlr#p!Qr~Qb}$Gh71#b_4Q|a z$(7dP@I$N5d)XDmo{C=Cj16Z@-&IZ1qP8HL{^DE0L$?L;2kcnTPJqpx!&%IQy&oFD`8(0;%!4T!J z4Qncq9B%Qh+gYdTTo~hd^XrQS4h2TyXLYlR{d0zCR#>=xJZHE?NyT0{xnqZ*m=x+x z?$%xfRs?iAN8u$;R@{=<9`oLN#)8W5l}f%Lg({pC`pwAG=cqYtTAv(iQcJSO3&K2t zNVhh8nw&eM|4~8P@K~4_v#XcxA;EUd7!>9qZb2~5I1yN1LcKub3~iCW$JNC~E0z># zXAhb&&yrvzGt*vhM~H}3jWezA&mQA}_gntOVmVb?4(|bNPU>ITp}02`79T_}6MVuS z(liD>I4lgAB05*N%Cnz(O9&ya-o#26Nx4V_1xzv-4_tcSCXd>pQIL4vzlC&3w)-+g zAEO6?V8sXfS{el&z@ zs+Dy%nI8q5Xx8_!i|EchGC>G-w-SkS?{O9LYi7nDNx721OyLsxU)A~v{EkIk*f;Ms zbCy$pPcJS-KGVc@8iWesA(++mdsMFZX$yxx!PoV^Teed`?XxD% z^eKk|J~{D7lCMoniV(HtEQufog*O}4@M8aiHSY1l3#XKW8>cd#m197?-^$X$!%@YR z2LR05nwg*(`PS{`1_U8cM``Q^UWeX^$}crTHm|vzbY$wkV?lkva&tlU-gT?aJ{z!P zoMm;_Lfa;eto!hTZ+3BC%CmpDehieTKX?7E=7Yw za0nC#P#lW8L-FG7R@~iPf|Edk?A+hrdG?F_Hj|l5CX;oowSMP$99%X-WlF`~wUKqE zi@TtWeM+-4JsDkhnG_OYQAy@Ey3d;3Gorrb!O45R4bu*MCBpS-^Tv9PsC_(Wx=)6_ zT7)^=6t2Nm7wVfyRLt^4Op*MomskU*hjrMD&GF#;ooTuZ3XKqRYpf$ST0f#n;JJTv zppoV#m1J4VIzuIa!1VJ2+_>dqkZ{3pSN*bh>^{eD?t5PNj!P=WzppUVc>9U=G%@y0 zu|!_Q7PNaB)F+j?IBWIZdreRbp4F7y(-2bwQ>f9QnGOWu}>%RRa$x z-h8dPM@DFn)KpXnT^d*Zx3fGu??`d-Ono@pd&HTghQzA-aK@>}zfSZiL1ck_C(QNS-Dnqxk@yt@j|~Mm=oNaLcNMu9szwVrAf#!I4Jte{#&LScCgBsVcSD| z^cY(f61g!8T7Ly|=dP7>BhXLr!70r(HP;%_hUg{+i^tgd99dCMI>~WA{5(@l9RmF|%!R9bX`#U7?Lw9~KLSu< z*ic=D&+UM>n~?jbN)s*WdIqyWG}EsQ(bZZ9r*S-!4zm?j-5LFtUAMJLu^$@1TWi@c zMcRbC0|C)^VbhDusQNawPFzanQPvCRiMcbJ*T}6hojPI?V^l8iak;UMccDfXbo6Un ziGt@eMF4!i@sy34PE+Kq>@{MwCs#>{X(zm}cR`s>Bi(3)#aj9dyHQ7NO5cRr zc!P0E-Ts+xV1)!&l3>o-R5Vq|O^;n$*l8)SLUwt~H6UT}jo+~Joz3BEg<_OWYh>%S z50s#y{N=VQ-48Cu4Xx8(^S$_FTz z*b6zg)k=5f=%Ru4xc&Q_&svL66V!3vuFvqxUv1^OG!s>!xw;Z89O%63QDcMZOjsM9 z8+C9n%{w5CR4bY}Z~qs>6XHEi5jfALYDO1YeRVU}JX35H#`1xR@FE;OwTiacDj)h* zDqZ%VdtV4{T+JJchb?&kg?9T3je*7i+0Q=*kQRG|?vt4RtOcRRuD-{Qwm9jR@3#Zy z*t@0566)Vrum6i^I?Morlg%LiT0C|VeQEz6QIZsGBKjUHuvf@7C5Hd2T@YLRC|#&X z1hGC3=s7jh$q(SQ?&(C|DxLqB^XtLqqVm$KX0nY2!-iQp0mz(_spfwzf84Z(%Ue&@ zylKg15Sl>#?S#yku4OID-w1u4bW55X7n5H^@h*_RKX^jv*GF3Bx(VNcZ==3>VLcMr zL-aTia2C$BSZpmULJGE8I+eCxAYkm>T&(uD-|tlNUi@bxHy{4&fkpG>vL?O3OU|um zra1hX>yghqTRsDBTOv=QKf=J3He4INvL(fPDYZk^1Y`(I2SIRjUY{II=4G6(wxCW1 zoM(;orKVbXT@wvyX>1_5?2z22ugClxjr2(leuVGgCSD^>56PN>A)ag3AjKONSY>*n z%PmG(E?Ic-4?y^a0o4s8Vf70vNyZvXPTC4lFG}#$4FxoR9~E)OUufKTFI;~5Vdqegl;ZJ9UgyBop4|N zlV|NOp;cgx2rHPxujm={O=1D`aSP#9yw|Y02$ z2AiMEU(t2DG}2&Q?rhd!;+eihtdVQaWvXW{m|&#^Zy9E28)7|vP`LZ;0kHk{lRJ3U z`{@tFq)bthqnW=Su(6@L27j@WPU#83FURhkUBuwR^P?48P>_=E?34UR;0g}-vvz!2 zXMok8NP+bjVU!e*4}}Z}Fuo=dG7qly!ISK+#s$%stC3?dPn9tLz;v4A?73t~Em~Tg zMfl(M7ppJ(Gy+fyV!j6%{`0tS2P+d(1s#6e#dKLV8F8GIk$-o=QuAfqzNt=?sdWU? zpL}21{5p*czHfKr+EkI_Lx=7w(xL#><(d?lo!92SzIj0!L2P5_cAq%wxz$rj7~0B# z<{^x66=dt|@>R{|!@0pJ-x#>3J#Rf*w=;kbiup9&)0(}eUzJh3LuNk|3qagkO1miHaR32sg z4RLZyrxEk;xbSE+?`57BRWj|^S*0ybeQqRe_?erpZcRQutit46!8Y&_Uw$!MS%q$h z$enhAO^$uW+qwE;INO^3lPK5Z*A%pjSfb+UTU6ftg3Pg_!qmxO-HI}N+WxCO1thD# z+SY_eMbslzR2}Rn#yHG#BQQF#XIMYXYdCZ9MnAb8zvCVXuOp1KKLkKJ!$+H@k-X|D zYQ|Mw%L%53l)r>7?LX4w4Hubq04Wdnv%4lh@ z7HBXrO4^+YxmAP3IhmyEW?Z5t_3A5k+qG2B|5>S1Lnudepfl*lhd=Td{fp(HxKus8 zQS3rDD=Ws&Y3meQuzgXvRI`p&WT5TH5i8Jq&V>JSsOwlmu>Gj%CWMIw->uWS+l$f6 z(;Koi)v2`Tm==Z56lDCeu7K43zKHaO?v47;Ouodkw}#8#TvML#Ld=ZC?4=YABk^{C z;B&z83s=j5SQnw!CUic`*m41d#0TP$thGhCe&?f8mQr&Tcg8lmtA6 z#A>21P~(q(@qWZ3 z1S!6vuV# zfyJ04)DgqH+-;$lI6B$*^=m@J)LdIesso||aDEO=x5+S{5DvnIChH{D5RC-$HR&Gz zPiR|SxDY9M2xZp4Or56v(f1#1jm@e;efT*w@FCU{A6((pzFPpsTO4RU z%TC)t?$XNt;G|pLI30V=Cr~C)G>DMwWX_?^<{vFZeXa=-;sb3N9mnHVLJg;gcXk2Pa?7q8f)i^}0|$9pG_}-1NnV9*)GdNamSY*#WZ#M6#aw3Y;EnzJo^WW` zA{BTR+xZSwd=c@vi7~g7*Bn9~qT%}|d|m86pQnAg$JK{{RyHVZa{ah*hrf!#lg_=r za_YobYnhWmdMvP-*Vg{guFD_Q)5G1OqY|5b9;I7(J1CQGO7DfUCQf~9AR!7p*;rH( zk!%3cK)TX3n{?^hNPXo{ZQamfNlHvuYwF2Y7(N~8oLkLic~Grp%@+A%pJmmw!EvWF z?2KZ)9P7!QBIQ8wTwE(pkkDmZx8$9!Kg*xjS7+$Q%!Jbok> zd#VYC=i*MbwgwNHpL#A^iZE_;aXyz<0#E`bZ@`a%+9mJV>kW{n^c+yC-gH*CYBOQb z<92=g=tw>I)<<-_Ar*1SyRb1?>+xWyg501>Tpr=pd-NPp?hDb%= z*}<`laMXq_^US`Y)AQVDS_fJT2FXCuMKGo2O#$*z-sk7z{|-2zwC`3#{$st( z*;t>1od$+=!QK#;29{5j#7U9ffcKX;jenQJzjE{@TBjIh|=HBFA z_Eq7ont#2!4i+aZfb6~|tYo<`>bl;)pdP2=?Pf!$&>lJR$Ck>8{Z^Y(b?&qb+I^ce z!Fw*&L)BjXEv6v`J!%W4b&W4U?z%A(3WkasF_b5a;X^UeIlkU#X7{8!2VXpwBJ=e$WliXD0Q`0{@jhpj{sIm2KNk(i3}BBx+WFEKz`kEozfbLzOCA zRnT{y)ceH>Ac4}3^%}#QQldAFA$d2N+x^4b-=Y+7Lz-UIskGo{w98edhU+QX=ZSqIu*G%!dVWei;Pm=`j1D2$w5At6dnP&dzU~D(KZK_1`g<6~a-&_xH#o#3MS(Y8 z-6YR*etIAB){70ir`29Un%^|&jZqO!nyVcK=y(Uyd580NsfwFTAu_7zOxmiB4#Q0UhXW!G3xmBqoh^;Jxg~VO( z_sP$oP{zPByzKMaTekD=om)}gXG9#UbwN&?#pH9o@`(wa);6uH)o7&RJR1YI-S|C0 zszH|;TuvifhnIUVc$RND(o*8@RQ@fD%Kry<_&Z2Rt6XB;Nzj%I2zsP_{o5287n7Jb z8CAb3PNUBTU0DC>2tAATSBhsp7^)yB!3=HimA>vjLEQsb`D=1w-e@}r$_!hVjOSOf zJ}N1&pdZEm_%2T`1CGQq9j^KPieK0TThjSdTjuLw?Fruh`;vNRPzG8aj*zZyKVGC&e7U@gdLK~Cwx|U zQKDOQVhwDTI>WUnk0py`-C*HhV^=Ic7hw_E(T2AmJN56{nt!@p>ebk^wwHNlr^4AP zsjHnFc$Xn3z^u+defQ?H<3=edtyz7xL2uiOd&=39aUL;NBtKg<4nOZ?&kkJ;W@|iCgBWN;VKOB9%O6!w6te~l@=Mo5F)aR|x5o>rIMlmZe42gW zN@3;Lmqi=O@2J^}Fdei^g;gxY`q<~}H`wTl?yB+MyPnEOCl?5ra0Ny-4%vglnZ`Uk zYKyb=RoO%(r~NYdtf9rE;^KsZ=Bb*+fAQ0<*s#P}#sA=XOVVwi#ReGs+j(tt7sNlO z6QolSN%kcU4@oq;!t~XVje%Hkk_zJ@z&YN;py`@e<$>iDMfH+uq#?ZNDc=I51A_vNr=S9Rh=_%~s1?;KN%a5zzCL35BYw@bf6E3FR+dqbS;VXO=KU_ug@ka#PoI7_qp!$mw?6nSyzc!!EFGZi@rpV7DHzp60c*fp zzWJltK1GTYr-=X?`3UEm*n@#;2Xv7y@AG))ssXkQJqRJr3^3&U?Zdl# zPu3bG_bI~c$oiM*IS{|0-bcR#w+~O@Hq?@>^x5*yyuWM!%=xt(Z)RBm*klY+3cM+%+C9TuRHP+p(-t)6&R6lxs3 zR)~5l=#+3`mORCT-i#n`n|5G$_IvSYtbd@FW%$PaB7M4Rg>6=&rSv3`d~@+8DF&|L2VKl$YC$U_^#MY z_fUFU+iFzs1WRU|dEWc`wURfu=Ip+8N6tpmW@e0(J=R%5!oCF4${hLjm$qufBV0=L zs1s=8U>FOloW^<$unpPy?ubPdd7CzaOfJZ(&Z1-b;`#m_o85Ng&96y>NIlGB;ay6x zy`S)B@5=s*!@|LUuv<^HP43@aYJ9+Wz)L;SWfq|L4TdNC+~3%&S1}$LVw#y;6f!F6 zvPWWGp8xCA$ISYaQkE^q;b#%h5L6Tj{AQXLX#eyOctpq3z_TZt32quJ%0Q}loz=50 zbKSVqxTVC(S&lm0-whLJEXRi==5lPuPnu0IO%I0?eKb3AX)6c3OEUmfjQKjhv;2Z(CIsVM2J; zY^VPo$v>;xf3JdL+1eP6?#(46M=AAK+sV*Xgu)e^xzuJ==%G!oiA(0Hzi@j)rry2P zkV|$arPNbU*pFuK@%-~_x#|_Iq(;;o%D<@sV4?~$vVh10KZyk?85~E##SRtkiPlwv zn+ggz?krGnwIC7QK|xx1J8AjyYdW2F7_Q$;B-;0!PD$*6T1L^#LrQ9`^5o6Ah?Nqv zL%Ewk(IJ)_>fIDnVwUB<)TZ?sNBSw6K0%hn;_++9?z!5yO>`)uB)Jakd1zhgm$}WX z4zDy5Q?V5T-%qURp9kDXCpx(5n1ty}o=Q|G+pvwGXP)qug|}F}ks$LTd8>xTD)i8* zbzH2+7c*wZ*{t2G;}IY+I;gYzA2^+0j;4I(zcoJnWf*_uHN!{4mlm5OH=}qa;gYfT z0I6ytOTXAC^1!D*xfvkOLwvTRyXvlMA>pZLKI|0HV<~ut<9xZ5-%l7-PGt;{N7fQp z-~YvnfEOwXvR?`YCgrj43%%sC^b9K!$aeVTnss6Y(?T?8%<<;7juzInd3Vl)u!xEg zUTz-*Yyd&-F!4?#K8kAaoHU&^T~yTWtP=cOih)j05_1-9p;gUk ze(8MGGM zw$|pa*R6;n{Aw)@4zWN+@h_-O1WAd=DE4S4Ti zH|`ZhxfaPFS|*g9Mx66%I^|aUOfYMuMj&Gh(%AMd;M@32 z0|7aijrY`$o%hLhQgIxp+ICXxw_KYN((UGk?o;(}F14FSAEgH0+pk(9p`eBOcYmIh z{OI!8im?>KBe z_FIRq()b%2foy)?&tRm&=?bp4aMGfZ9?uc6!@}o?=A`@GxaI5u(}Z~yF{j^p`q5vE zg;-m&bC0IRqo%-__Z)#8EwMJ~S%PsChriB>=B=8m?Txz53`SLGXEvIQyCmkR^{T`v zeAw&_X2A5)pK-eKF&%fZ{H5R06*$li#ut=k^f(xqaMxn@kYXF)p9%|pSn+qR3T?o^ zr^vc-eQ56za~G)gE7jAoIPQEf}dumQj^4VidtaZD`w~Hn!9~Lw} zJO9)_E@ttH1ZROc;hwMMr<7yaPL+?Mf-Q@PV!?AfNALF0Mhw9G6hVZG$~C@7Gty9Q znVf*GanIIjxCzX*05UTedD9lc1cb^BX_^MD-7U-57NmqE=UobGqH{H`Nsd)#+)}bP2T4ROPkWhRB<@!uO+w@xVWe*|!?I-)%;tc2fQ&udjf-$Ea_?v_=UO ztt=}hh_c-IS(#YG&#EGckU0lAQ@Hiv(_t3-sjd4|7eD*&aI>2DKh;)Qx5~!UP5DdT zsBrflP8LD4%?#4p8SCC%4fqWXr9$Rk{Jr%#qm!F!@%dtT{wkYl!M15d9p%Ex9!Xua zk-y4(9d6aOK!7#Y|7oKjmAs=u?A2DV&o9Vle0^RIPP>{7!m+>a!s{dJh%>I75n1ws z@kR?PlYR>vxOP91C*_&IX9-L(NWs`G~PCl1jtlPnMDa=jFg{G4sY1rk)!Gk*RdB+P+Re>V8GZMinF>+X0Kpd7gjhh zZ(__dMU0x(4X__Q^KjDMDw-XAfJ1Gg;eDLO!7Wj0;4|T>i&x8;trNCmSamb1ud@Q& z_UkC32;^mi1uUk4_kcmx0Go}>gOkAxxZL!I#8skY6JZ*$G-D+T6U^3nvlCv=@AT7Y z83OzN=^W7z6iN4VXzI_iEp`F+_WOZN^XvnuL&W0|Z|6Z-Gg$+R{bCk4E1(ZQHTsmP znLf~%I?}8k(VeU`hJMsM?G2007Ec451PmwI~g5^r@Sggnih zB#CXHJ748AD|4wrisj{(e>)fLz>O?}BorLt6B81cU;^jOe@W68pU5zc6&Yp!8Ju`Z zT=d!9QSFZHiW*(p6D6b<&*UdIxEu#BT>Nfurh%U*Pf+`VHAx)}yuQX$2x2sE_Lcek zO=Mxp>L~OOlbm(Q$^i`#idOBFuJ^bRbpi|tac2W_BPJu>uphCqCSn(xlAdgl(ZmRN z{^>@G{vDEX!?qyLrqZUh6J^)d`H(Q_5NQ&h@41=1E_9QWGI68u7`JoJFEZJ57U6F^ z(=`Tp&7PE?H7rTUu<@>eEBkb5%a6jh5|%G`#&EFx^Wo*W@mE#G5Pr)ZzL1&KPp1#m z`(b?q&og)TNoR@v9o+B7a{wqLj@aY%oqGE>dT6Pxu%zyl0dn}OZaYm@YYTAN&b}*w ze7(9}ti4<%O7^*X5tS8ros-ko&4~mp50Euq*tnXmTI%i{+*As9%yxRnIN37J-WZIVDw?iF?%H_{MSx6`AZMW9cEhO(No zO|0ekj|B+kD0az5rN{rl(5CA)1se@|-l4e;TA$7Iebc>#%w2M|9{CSRxAy-mNbb9h zXIR2AihdB^-av>3EmZ64-W1^t8<#4?v()4w!V`+5muFh|%ptb}?)`Ac>#bP&(H8?E zp-O3&4!sY;-}IP>e5@&U%4U9gNUV?+Aw6@mt2)6G`?p`(E!=ZY2ITFl680$VbNnQL zOEBgdF3h9Kkju80+n<=xUmnGK&$)}OutA~e$KB7Hn?!}PK7wfs@SHO4Ov;mR>sEso zRH&JeO302DFyL|tDA@XiQ{mdpyT}HEqbfIm(x>-QJ!q|~V;)T~@OLC-A4PoTagLCU z_?CE`qPhG@1%9x)W8`1Fisb3JTyLuE%p(a`td^cf^EoTWwu<#35*4o#E1R# z$K8(Er`F|I%D>OtouE&k@!kmOUpSiWe|5^8$DePSz0ykxf`PV;*`whZ)jYnu-K-z} zPSx))%63XqS*MS04S$o#j?IvFk*zhA+(t0lpJYZHH+KdsyzMM*-?lwJQm9h-5KEpz zdTb4p&;IcHyEq`Jz#wM*B$2hY;k@ z3|EFu=0E<=v5HK(d!LH*{^e?|sT1VR^DD73cPL(SJ`j7-#@Z|G0?z}|%-Ctv@yB(W zrzA;Zk&wzRBN(;z81X+VJO`|KA?Gm>pu9&`P-!s3t1&($`rD<(n**`Zkh{F~zwYb@ zv3;Jx`Me1nzhEFvSDTOjNZVQ_E+c+yP-ZL(z8Ds~sWx8o_?}6@L^SXV%dJ&rA<;s{ z)8$HM;K@&;;w1&;n-GP21y!qOX2ZX}h&8)E=C)FEg8noUouItz^Rw^Xl(*pUdQ>}{ zdz6OeqPj}Fjyyi`@KIeq+m!`wiGc>hJd1LBRHgocp{Lr~8V-A9iUHyiskM)t;g^%_ zr4FPW4m&I5PVDM1H1SnW=IEV14x{ql(X$Pgn*3?Mfc7#3(E{Eivik_1a`@KU^_7LM z4ckXdldhG2q+rQGEzqx4YF?YP9KV$T<|galrb4PPE-3SnZOas!h9x`SKI8UubuwG# zJ6(Pi)wB+s*AIOW_s=%Ehs$h}$%n}qyf{`+Yfdf!ZIhTOsXTvqn&0CY9|j+zwTd{3 z_w8H5ANecmB^0pWBR@qc;n1K0p@OFxP77R6dl2Z;^87@3u6e2S{1ZRza(jZnjC*rH zy#u8AZ(mwQ->WlR9@peeh`X$$=A@>4`BD)>yy2Slve=gY>l@{EY&t+}vdu}win-Rd z0(Df9gzICA{QB6m9+R$T5ML(ilTsZSiru~ zmDo@gG*InyctlYNG(3Oz26~2cL@nfdR*5CSl|1=6^<=d}4d@FatqV8HugIcdwFwaPw+&cog9>?wBwJdQG5ZaheGE8RuEe$4JGY?crB zwv?bKUPE8G;*-;X6}}7E6o7^A+Ke^4RN1_b_xVLDFiBS}yG*L~`JJp{F`Z=A@xg1d zvpPi*@gd2O2-REo2lX!z3fQML;a!{Mx4Em$m~Jo9d1Q@`&5TmUEDzBd9FovaQDy$~ zG@;r@#|s;y;HDtvq7zfp~{TB+Y=#>>QxXb2;ss?_2Phz8dWK_tfF3WxXClPg0R#g?Hs&1W;nK8_M?O^>$CC@z!f+j7_P;O-N`U+&*OJ>hNu$;N&1GLWL8@CFmo z86l$!pN?965kiw6q|!a%6>W2oslMra!=PVUSwiPV+jAc8)k%wM+Q8RIzPC|?1@SRT ze}XjWgA_g)PT!=RO6v`6JWf3OSd~mfQp#eb4-KjF z4zk^4!IpK(bcd6y+yjLaVFr(`D4h zxbwxj`@`ZYAIBRzSqTZMMaR)d9KK1P8E9|0{@okEU?*qaRis)S)NGK7nZ}p4${)Yy z`-`_e-&O#-1S1@Kf8keN8oT)n6k`YOI{p3a9dxb7Ln$J}=dhn0!U>}AEZdxBmTO|+(yEpM=s(w3*d>c+=s zbNsG}gn6MU+{t*)LqW7^RkY+g?Z0FMBjTHWTkXiL|3Z1BU4(*jf4RVMkslZ&7M;#y z*(E~LNA&<)Zq?3?+Q@DZmCR%(KiYpKgvtJ1lg6I!ts?Oge{A#UHFZ}mypQZxzF-P! znVPctE_VITrYEwxjVoL9wN(hsq(zf54kAOmu>yeeb?f7z^`8yAjB4q@2%TL<__2wD zob-KYF-D<%kkrMF4|!u*+M<|x_Wj4@S6rj!zi>h_j;R;jS?{?z)D+;-Un{Bm~4C2aloNhMHY|Sp@ z)lEwE4G<-+nQ56J1prYN+0sfMP-m~)2)S{yB=wIm(Ku;myK{b zKhw*7Mx*Hz4RNoZ!7#h`HRjjw!zXiYcvnaD`z}yIch7nMbq5^|Jni9HuZ;WpxkYG1X6p^%D1mXu_7(2qMW6h_>fn=)MLP6q z{z8B4rL4l(>-I9E#1NSO0w#a39`paR&(;(Tb2{9`;}xY!I-sxrA8W_`B)5W;)FsRt z7esR3kR*9nXM414lh_*UKP0c)q~dW9y?^u+2T-7vWskg+J5KH_f-X8NA4sk*+-{Gd z(FXL7R81*>kZU_5dZB8_)n_E{p=s{=0Fjr14e2wHDJ`v-(}*4ThgZ;l_tZ)p*A)If z2y2ecJD}t81~a6%c5mn79<8}$n0x`6uclLzTSJ`C3ToLe6NseU4eB<2LIwJJe#!uYt3IjI8-U2H5dDD85%TK<3Jb{1L3@vPfAp#p!9NjV1v6v1C597$L37H#ytN9E; zAk!|xXdkgesb}I|@aAO3QliU?CUpR??XU8j=$M^i`7D%;Bj3<&ryk6<%&J5ud^6m1@YE7qwOE|E^iw7$ zC4#RDf=UbFZMT|E{?=I^JbA#4{AK*>L4t<@Sfb|M;mGX_UemFhOHlXkTaL0111%_v z>n~zCEcT<9$HYR&)k;~)E8hN*o7bU%R2@T$fAEe(8r`k3kU%QgyJ0H1$!L0;PT$49 zCsLZcR?K6-ujb$%D-v5d98&ZWQVCTLo#3Tl4R7BZOf|^+y5wjL6M~T~lbLv6Mo8rm zxg|#C4IhtueXj z94`xpk8q*I*_9$A;!(?pk2_b1YTkN(*`hn8@8BYmQMx8NWyPyISXrnzccY?=K6Xt zIG6ctBlVY%A?=dt{cTle(L`!lw8)`3{`lko-~5ypV{aQP;ea^oiLzr*M}&su>8aQm z;Jz?%5R6~vLvYXzcdd$Acpf;iv6n~q{IyitY@^7q#wWi1r8z)4H&e?>Frc|v{=tbh z7ghBsHas0E_S`U~)sr6zSut`_-!=9!nNT|G&Ts)$oFpS3HYR2Y*n;y*L)hCn#m}Ek zmTU2*{m=InI<5puJ#ODS{OXOdB(5jHa2TVW+bC)fd&Z`5+v4pHeRyKIw?1d_^8<~) z|2AcK;-Cw$Cuxfza^8=B(Pa8G-s`tIM>(*CjABoe@U@~1X%Y4eg|^2Cok%Qe$I)ir zbViVu>=M44lP!*sop#d|5`K;}=y-_q-FF4gQLCNYoQYCfE6Tox6or*fX8pJ&d7KgF zK0g0jPFw9g9T@zk!aWP&J3SQ|lOB7^=zp%*DfR33)_$Aqq}%eYy8 ze8yKoxivpWU4mkIsN2Cvg5&VJ{0*e?f)O$Tthg)<+mWqVySg91G0uWOT19y2uP>aw z5ao+(k9e>Xfy{*bx4N-nq+q(!X-!*)RJoS)z2IgOa#FU+8ds5CJ0jCKK;5uvo6mt4 zXB!ELgA3p=A~wil_71TAg^;D2NnfEL*)BY62OkI_6ZU#YS*lzxBD?v{BV~_g%mt8; zp9Wu&zjlJQMyc09TZ37!z6vX$1#_jCcUiVd102To{%n4&3-&Nt&yiLGK?GBA! z?wZ7)Dlqcf`6Iv2g(FLg%!x@t2k5)7dCNs4P^igy&+agxnrZbLp;oyo<}yd{94#g~ zClsfvstnZsV=O)Y`blzCoWk5eQ262N9w1z@gd>F=e!DIY6Py;uX%+@J>m*% zqGLdD>2_tg>u7TY|Mh2#`iHZoejFFF8n?10wzWm*)BkZm~x+RST?pP zg>UrZ`+4cfdnK1F!ljx}FS<@5=f?OQp8m*$8FJl@Z z-*b+ymoFBxue;Fy>5kYT`-f;G?^G`N({;P|!@?Z&Y&xepW4276D$>vMo~`qAjeX|} zQj0I_=>Hf=Py?UE6&}Z(!UB17vRnLz3)UQLB;z}#AWBfbdm`#YElgXU+;tE8q3Dicnd1A7TWqwK%5= z*5tb!KMMklu$_u7(=KMBq@onv^o!Yb>3Z+T*Rk`SnS$F=Ix1Xi;GRc@4sDmVf_dG^e-K3 z{8XVU=*W&Xc|Bgo13~L+#x%5kzr9~op(z#v-cqWQ0>d_tBPeuZ`)kQ?3LGnX4!@I5 zM5q5u!I~F}kp8^7aYr>P=`iXwN$chzjCnbnJXvzhG_a*PN$daE`KW~2_GCKhQGY}O zgqYLff#D5B_ZWv<=j(%}td2`v1c4Nt_U(hO%-MQ8V|XM{8mEeiV)f~^nVE(z&#J8p zwRjn@9KA2%06bdY1uOjDS@%{Lv?{%Pg36N}ncpf@tvy9cS$V4|C}efsw5cFHOS}-L zF;C?v0?I4W>v2?Jp`!KJ(8$BGqnk?EHrdfSE0?r&VfNa$IX9F^i2+9)2(!2&3-vTR z?CN|}d4vvD9&g-Wfw~Ce`)eNlfp3h5CLX51^!AZHvQR9yP-_*{diAZx zdv*5GXft5diuZV=nHS`k<kud;mu2vl#Cuon>dy4MhpLV*L^d%Qf9Bj5EI(+tO&K zJ!})}Q+u$ayZ)p!^KkKQnIe=_?d{>bn?(By$&ZLbVuHKuz;!3*6-_*85qhO!`11U=|Jc*)Y^;Z zMhNwzlv+8Y2rOiOYF|QM8lJRiS{MAGyl4__I3TM)vWN8eGVzcPzEfi|8!pe_RZt+1 zIk|_?RSdQsK8Z`x!XRF=eKKv%!(v)cGwPCJ#A+mF*kzGD?p~+&)N&>ZI4(;jJ+yBG z3-hhMVf(%GQ{e`m4cv6+hu|WU@6z!04(o1PozNPYQ2(nI|I`L;B|Djp@_t4pcbOpF>ZN83Qx9Pf>KZ z;QIe6Dq%N$f>I3ZAppwom9*rKG{MY(Fn%PnCQZ57K|9zf%JUvF4i4fkLyLjCk(Bm} zZOl7IM})GL1d$%}-+$D)wa6zBe|6G9ds1miuL*p=w_5-H*?v>8I&R0r@t>sUjr8iH zqD}qBze_U+3DM7)9?PK>F(4H>VERE8c(`C}v?Vo^>ys!8wz*`D+w9G>cDx{=l>soa znLtNTb>%H+K6R~f-WhV)5V<*|bHyNi<9XB}&?7Rif-J~UlAPCPC6FL_II!Cv<)bK$ zgVki(k0C$)v5$?z+2e9hwyc+Wi-7a}yO$zZDzHYw+Ss=4>g3B7AJmju_TB- zy!KA^ZorqJ&W&<}iSoy0%5Zx>bT{4@nfo}2y>%OnwO%_r^mX2uL8WP!c%`Z)?n$Mu zsS@_rgf|vkdcyzUe=q>hUc5i=OPFhK7k|EW96peO>uN|#%4GXv0vCNv#qlx)tVF7% z2VVMrHo8V9G+@+NsB|6>3HH7G_l~0&Hb{P`E4m z(o{&MY`*uHHvtFq;u2Iw)o6A5voN{1ye8o%bV>vnA(KbA>I2i!V z{RFxhvvDbe?DcNYru#%YT^)0SHPb{xNr4P$h+=9YI{yX>8 zK=Ig&pU0jVn3&Ex3Qv~biBvbQ)VkupLunR)|Fm@<1Tb|owcmoFyw9k~&i$TjGP8evT4u!E;;vQ4&oa!Nb z937;igN$qm)2=s-i4qU7?;Gn6R+{~DQgY%n1jx^5?x08AII7Q?R)PNCG0tra|Ff%# zYC|fyGY+L!u^D+`o`XAG`g-C(=ew&{zk!7J_ZB>bzrl}H{yI;(;I02d*;l?b`Nn;# zNJ$DR-6bvEIgoCoLqKwb0wV?k=@g`;LAtw3LOKQ`M@#4E(LDP-f57wH_p56!cI?=- z9oKn&&rfm>xzV4oK@7RT4;O9x63SH*YaN{ZTlTqHtETdsQu5@!3iqb=DB##8A zMa|CG?LlfpaqnUM&PQ_AU#s3C$XTQ=s7D^eU+2s95KC`vdllpMxU7J8h!xC>w`v-c<3H=Mlp8U$@-LF~`)D=!4-^jWQ;;3L9!M zuey9ySYD2v4n2#7-2(Xu+0e~oMS3Kf1(IjN(Fg!rH>4JkK4e2LZHsJq(>OM_pZ5g* zscT-)L$H(F&N^OG+lfzWD9B32JnWQ9c}(ql6)KeCWy?_IX8#xkPYSGarsS?pZrs0F z;l~9)oqLR-dm5px&#G2!dI>;!VG5WM&C9C>ogC*8R{8S3G+85zb90M=VwkS{!3^6m zBq9Tgtl`8ikgqtP{JD6^B$2)hR#|WSH4$ObF-`T&*Pp6ua-A9`K|Mxm3gCZ}KoEa+ z%~UL@{Y?xK)J3YjXQu#*#T{-66%?fE0mZ371H9d0X+gHABQS`C=Ik z#59@KFW{X_D+xo_64>|4)QV4zSzf)qA}4!v3Q_4Y8RkVXQ_}B{Z!TC z8a!s37=LpntPj1SyQawix{?LCk~dk$Tfet1LogqlZf>MJrr?(!EcZ`&-FMgLY`1+}3p?&iDBMrYJi@x)OQ zaz0Z((slWRbH0U#=BqQ2V%ee<2)*H(iF4b~I`Wd}WzcaYB6K&A>f$1`-r~<^PInEeL_}v+ zS6VI`+pol)v_olOnYm<{d&`6hX#&Y9SFhob7Bd-kCDQ`wcIRX7B$6-tJI0y!KOIyq z)@(RTZmeFvDbSwC&F^3?$7=2 zs~V_dFU;KN=wPAyt&rcIa{06+FdZ72Uxi<+bk66$Zdc<%#5O+53oHJjp2C2zj4b_J zDe+u=Z@}v+nIT<8CEmEjAi{~c&TXm6JjJIbG0#6O@UaL$;+jSKJYw#zxxHGo=H+{_3;#-q1hUq~MBxz%Ie2ix0AouDe> z4x6p)wkaWD9!jC1#veN&>)f3!D@J$^l)CXSj02&yLs32h3ZE}HgbL7}5~~#)WX`WZD@)V0LNcc8pM6vZ;7u$#W#+ec%1Jv$dCw#Dje4_`i9P;K)jaIr z9z@^F9M%*RON}#;wvDI7ZFs#XJ^fti?^%sM>~@Hl&LkoagFv7|(jzso-bEcHz$~fT zJo9P6lEoXBvXZBj-5~19^BK^HBN%O34=mbv6Tl zw1DCW0ef4(;tN=u$%+%*57YGc6*xM28klLwH=SXabOn~nByy_-C_ZQqOBY2rdAQ?J zWr~~=vRdQD2{CNFo)(8Q+U=wPo>y9_Nl2m{QCxmB(z3K0X!Nzw8&y((wR5}^rJ?$) z249@*Ts@v|Tq74B=zO-vk*QWsfdz+!Ffj<_Mm0NA`V%mDzUHRR2FLN)ac%ebhWC-wbCmo;js!0d8+UtG+C2;7~4DMSle6cS0 z5zQaBzWjq?j>ZL5wo9<_RJ3@o6wYSz@}C7ht>tPRG7YFEw*AX(>=f^GB<_2K%)ZGd z(Z15?FQ74%n4M7>$~1Mdf13WDC6J};5n*mpZT$1yuwCNUNIV&qlb7VTa39X7l9x_BOuLTuO%s(rv5eX4r=1 zX1oZ5jAM~8N9U*n@iyxqs0*;wuuCs;XHLx@T03!CK!C-q0e>TV{;nH>$1K0cD+G%1 zm%34SLebQf%Z(S?6#=uCBJ*R$RM}q6fh@vodm~*Bs1xMokom(R3R-~L`YWL()Yzx% zCe$gE=8@#71=T`&wEB?CxS%cC0-%)@Nya&@lXih6TR*u|oOhW0MV~ZmAJJQ331uuw z+IExW5h}dEQZMVNXXMyxT1q*TWl?ALi1mr~8*jV%%4r^;D*dWTX3IACJ#ifRQE)|Dg3a% zY)-4LzXQ#dUb5g^@Xmz_25L!fpXo$}Z~aZM)5E-NBYXIJx`ue3DwM}Og7=2o&$Wxe zx9AA|Xp(@@`p3jATXF{4CNbrbNMJ@k$*P?AUhB791QFB!`vr}61ZL*{;C=sn)>&K% zY3nf{u@$3p;`2({FUR|_fxelf*aTqVpg`X3KCOv~6{+Z{mgnWGK>xS&q*K~}_a-gm z>^-3#d=u+OK`+RBvqoZlxU<&Dl8(2unDCq}dYdbLcX3{ge@!@jnmI9Nr^B2WJcrO< zJU|&=*L<5Mzm3Ai#8ll^R^&~Xn-LVs-5AaG%T_0EbtfWZSCjk0zw3ja)`ZVC9J+Ys z@7ZfUL-#r%*X?_y+V@p)uN{F0-#zaH5AQoClORp`H6LcIbgi_`qdz2C2BEhM<5?5j z?4Q#_sM`rCB-PzQ_B#Xb-h}0iR4e_F7c@N(j1Qm2oqH2}Qw^9WaM|9*WCp{u}8KV~bq5hQJm9~j2jh!!dNjMpevD%o6 zf&<^5scbHb$@a5$!d-B2yZMDAlEM>rdb_jJ4>yeK^e??2V<4knbM{F@-z2rjIxk_a z0*1ujWe?Krm*w!kFV|g-W)l_B4tWp6@v`*Oe^R{rA&~`4U+rvS!3VApHO7+Z1xlBG2wH~X(s^lM+e`Z5}H%EnRsby!-bF3MRG|=W!Z?xjw-?miXZ33CD(@TJs?PUL0 z6|#XMbablkmHR3!mN#2yR&q^fH^&C)Pl$K1=)HB$>gseaUuqsH;LB!Oc)=1|lj-)u zZ+ANGzj}dRJ5m4Je7%oLhsPWJDTw)9oEZfjF)7<^mYsXjIOR|Jgv&9-$4AW|W_w3`Bsn{+9j~fH-l+Mn>01c_2MuXp@ zxJ5%?wAn0+Cb)XGx&X(g7R}`cc$q)yoSjk_8K)5tqw#vhzQSb@5xnafeb>6RxQolL z+XlHU|5@MtJ16L8UR1#h_dz`}CrH?4I0xJTLhB{8@temAZBfB{B)^5>@df|HV(npR zAmj@DOXg@dKM(~FD~e`$&v&*=-$RwlPdY9N7${Hn7%vBt!|PbPGnQB zHlWKD*W|ZH?w}*mO(9qc}cAB24A*RV0cV$g5dWS3Z_vf49 z1T$r^VViGryWCxwcG)LWB8M<476+JQs~CNRa)AFR;kHFU*T`_FA^DdyJ1Swn&;ZeP z^vq`x3Ap!~mCnp9$p-XaHt!olIh3ky*UcuiPD*H${!LUd%NYWS?b_bS8RvA^VEy%s zKG7Ew6Rcl6sQRzY1GDH?)VE&Z`7V7LIbpJkhP`>V?n#lOI;QQ(7x1g`n*F19vU0v> zr?IL0-ab^wT#1SYS4mjQ9Tpu#L*o+-C4(*sMxNx^_6+8b_!th~z?OBUJ;$*%v_Dp536g~%~Gefyh236y;5rxwCESX!V^Q<4J`8h&dA9%7k^9_9|7}iLP(GGxoqW!`yi~O23n7i{43tOOcP8BX9t4WlK?M2n+4gU5?6y#c;xLx|PRrxK%Yy{`8L7G2+s#tAm6?dlrV+??RZ~hJe zgz%+})^9ohe96aa20Pm_sTS_Pgul2uik(bTL4}cRDRD1z14mz#o*l^wm5cT+xh?jO z&g|kiB_iHjrQJP-`bcCn^3`=k?Ew63ojhX`JzfE3x~~eyB3lZ6Xa+|VP4p3;OR}gj zjqqAw+B$Qf3QU~Y2r=Sv<4UBAcUg{-$AF=atNqXN%`A!;LvfBo?_$db%fB=uhRez- z)Mn6{kh-23wxn9GhaCKA!m?2Upx(Ew>y4^|iqW3s-UHA}+#f=+X2|45XVUf9LOA6? z;=8F|oyUiJ3v*1q+0UpZK3GB+o zu{Uf?9F{DOY1a$f6+Njlo|@bJ#=fu5^|}k_7S>2J8}A5Xw4k()7J?T8${})&gA1ny zNyjfA=qf-No^28cJy^{V_m;sy9c-&p4B5!D%H8tOx}tX?oy$Rc}v-Fk?A%zgJ-LAG(B8o z%l2}8;PMFJd{VEm&94*b?RTgi(!-83DwKP6xixeL4%_7&1A^fWx+zZN5^D`E}DxBJzz2#L}lDdtf8SyJtC96&3_F~ouH`cP06D!_gF~c9vU2ja zSgf5)Nz}PxA>r)to1Y5pln-a7a;0NwlPrb&yb0{yowBN`ls2=w z%Rj_JoU~Vrx}G!zSN9K&CAJ1Y6yC5VGmF?e$22{NQ$N#uwe%Nzkm#$!Mq?K>sD z#_vo^>%faU$yc)B^0pqFpJ zE>%^RP;*N7GY}wZ^R+ha#f=VhP0?kT(t)(2Y0TF)QCme$8xRDSsuzubgi^<2XN~OC zaQ`Iy2X+kY>q8g4FHpPO&Fq1(xh#m%J>-5*KYra#i(Jn|6+XwJo(DFa{s!TGxh>TX5ommMh9Rmn&Co$B@^SX#b|{5i z6}|*zL@HxeuPOP>w0wLJm&5Q-p1ou0-X^9cE)@MIvqUDsqK#`T1 z9OH{A7Suw9vK6wSCZoCfu_mcg+{hwtD#I|Tg%*tAXCUbp1YMCYrQfXNL7CkS|O{ADXFAs^4Tv<{qUSwA%`wt{Ht$HwiV&eep)e+ z&!Qq}yO04lqJdqt3V$hId5K>G#PJeN#!%|Kv5xl_B1n9G8h!5FC0AEVY`Ujg^RlMh zBe6EGPM5pH9H*apsC+xyT`ULjgG=JV7+k96cb`?Ka+T#*%Ap3QC~^~rScgUxMyA_;fn?sk?qJ6d|>`r<&(? zAMI+#qmq;@uqyZXY}~-3Z)17HXZShBIgU1OYY7eo-cb=bI})WCr_!N+AD0!wlgn@O z{Ln}l*;`$9$&VJtHYTm2)FK#44N~khDVj!~D`pJQU10%Lv~e+f;#o51eUnR{0_KS; zuRkYr!ueycIhKwx0MvS7?GxCs9L$VZLeEllMIW!L{blj%*+}7OSl|0%GlOgs78LqnhGEh zI@Va`XBq3W22B=XcI-|uHDvpploDllIJ3Pj5v$%5Y-Cj`_f_Ab2P}(&(*@MpDxBQ} zt8RfMYR1T0v_u>?tnCm1Xz|DN*%+z$$XI%%Y#%2ssFM#xmBu)(RjPHd0w%-|bE=AIO zUN*{6JC44D%P3r)zi$$y{%O82AV5~_VSZm?KFP124c$pl-`6yal^!t~Rdkto9zSbP z)f=jAa>lXqW!GQZb_HU*$LxZt!;aMFGM@y4=2i?mw;=N=5YCAtoLi(7Nn*Rt(Xyv% znmUa;S$wo&9RurN`#U=?o;7Wo`r3}{iP*&G+R0_U)uYcQ);SM0oTFsbu-cq##uzm- z3rBTn$(7FfklUF@UWvb=bvxyJ7P{`5$cIiYIbLnCZ>EM61r}4uP)L33q1mgeLJYL} zJkIm`moKY>e9RW(#XVd!&a;}5im&GZ1Znl?vkhpwv6$3Tf_^(r1=6VxoGH!J&P{V1 z1dfC82Wsh|cY+=h4(S>q$TW&VAihSb)Le{L!_d$2ZJ(@;3{wrnG z9-^_5O=uk=sfH9Hn0Sf6lQ*|{YQsQz*{sFw3>9hqmk)l8nqrm#66xoVBZUn#l}^T8 zuYh|UAtr$T>XNmLHi>TG%KZG&Q{Urrcd3E2@Ij(C9`QXj!Mr}YpH3=e{YN@9#+g>{ z3p*9O_kR2bC=U2vk)SS8HyTeQ%t!vWT{HgvPu2ywkR#(&)a)cv*?+>I|DXOP!Tg>l zVS5-5Yfo)VQLLwFrG@kcGNSq>FPon9&nW!QR)=>wFZ5O6E|2T~L7Xe5rp7EL8(|2# zV*psGr~3<+a60@;fA=d|mP?nFYq>_?#@vq!in^3eOIOD3v2s5{<2k=o?s}T>>MUxF zdd_BUxSRbE*-&P9Wz91l(xk)gupw!=cywEHVjDY z%F}?(pK4P^YyeIciC8PbS#||{=b0a{{=0# z7`WqhFLISR8>aiynVtSbO(WJp)>y1~^~q2QwtLCAyZiv%{+XgP=eOFZB!XaXo0>!H zmAi~A{4O4I{tONRoLbjf{&EVT(OojzTh(aG2i1g78Z?LDS26?NCf3~a6xrFCqz(`? zjlq4Tbx}>^=}G?JL7u9^_0tv66Y;5RO_z)LzF7A(TS|SsPy3l8ml~Dlo5w^fK`H$W z^OD>OzVIQnA3i?UY2eqYE*&LEj%lEKz7RX7CNZe+-1n5=|1F?yboqzOf{DDl`2 zo?u>xkcfC0y6AcQ+h|>29a_W;E6LVhDnlc9k`$-MpbDdu*0=Ziv((l!5IK9Bmx6P! z+6^4D;j1SQclpMxM>FzoT+e%4`21veZ7KSUM{T@uBI6WAPHdMF$I5sWD}n=?7L1`u z^z==L{a=(hN8G03vH$ivcAxX78X}fN>z=S1TwodE4#{=+Lvz^O|M_qv>&AV&UdEf4OK@@HbR37$=dRW9bPxl6 zGYg~Qe;%&qeDCcA#{7U*6S+i6B={p29un%tx4=5&sw6X^qS~3;^n+>)95Ux`z4)EF zSZ=Cdm)mnyYvR1ZHft7fI&Xn!S8B^BRqz%OHohytm6OgnWC5J`ZP{!F@i?hl6T|MAm{Vr&@wpvU}617T^h^4Fvlv76r}u*+Q_ zg;33L!77&#-27s5;O71646|Az|2fu$Nu;;m7#+~DX)m`5)aj$LC>UZU$gD2U?LB}X zI|oIc=?=g(;Ito^a`Y$o=^fMQt_7}wt*I>!^X-^;JpSP!Ptv(g75bC z>2>TSl2o>Xt`&ViES+_x_F1ME-*yxF7aZJhqwc4ZC#r8BA8A#;cAj0mtM1>ioFpZDUNHorc4}PHheun#oh}2Q zbAHh0)fiwA&5p4ZCBBrl9HNvZNJt5lq|%!t!|~Ray^Cd(-WH%W(*I;nElo9jREjru zP+*oeMVDc1;LrJCmC~vMYFZ=yyu6)(JG)LLqD-`;(-wE<4hP4MUeseGV|3=f$&@Pt`aoYVLs zykEaIq`3{=TM9|D$Uw??86NDNOFr`NYV1abvCQI|7_WZpqO(Z85@2gSyDRAGa6~dE z@PC_J9!!6?-E&o_RO4Ujrt=qshE2$5GXZI9Dt9!lmxiZxQ?sYQ1)Vfa2(H}KE>99B ze(^_HWwN*CxRVnJv&Fojn^oIC9Mhgju78c!faRlAvR$+V?K}r%+B%dcU3uCOSS-mr zEw$u%to8qyDr#)}cq_j2)Fa}Qo@q+RLjV%5=k=`E{dDtc-5xtwW5L65CfH5){L!i( zLYP?g)ovd9mUJ%q(}yR1t!*RHJih23f>*7>mV3)qufQrrE=aVIuZRW1(oYeb#i?j0 zN{A?$J-)D{i{zJzV#qfXj*4)bh)F~+&d;l5N(cgO%kCw#iJ)`Rk46KMJCj2tN{b3B ziZ#4)y*X+Q2>CddJGY0WpqOk+e>b#?$%bUL5f+^$bJ5t-Snuyh2VYKWK}N+&S>yct zWQ)w?s$W1d7UWu{NW5rCy+M7Wb^U=g(D?F1MvY~;R4dEkF z(xyK#=3I>qqi=)18qBe~km}9h%{t^jlEMB$Jo2jkA{)zn!;(5d!gZ{j9|pTZG50W? z`nsjDH6-TObPhu_26T$59enDgSq?3KbR*?QLK+`>#^|G;A3rcYcPhezIX*blE zB-*&rB8=IAZOGywnpVb!8k%A>opyxP%eUh=_Eht$mOF~$A$+@$G~!4nlv?xgd;&F# zVrdbh$ab^IhcT9{>t@vScX?=wqNh(|OET*rW>rj=D-fi7E9*eCDeQXMW$qdayOsG* zc*Jb)=>RCCBI|@-HuL&+ItI;lDfK~Ne8XZfy93|Yp1Kf=1<@b1im+reyxDnBGSHG# z{NDnBjwS4Fu25(~8Y-wggS0+Nja?}d=u58Sl|Lh)_3I_F;)Qa;sok5Wn)k}*5Pkd& zK`$H3l)`Rgd^w}((D|@N85i;@f1m72!CmGRo<@nN*L$frPtloJ_OxIws`a3Kq$t@f z4gKWC@*Y+zUrU>%&G?!>D#DS<| zuDt9G0P|D?txVgCnHe;PQcH%~StuI%QF$NP{^P#`xzi{tzKu_yT7Ldl<%LFY=#_(T z=*q>PH4)pDtMdHqf1+O02g9DbC$aJ8O+#`LQ@cY;FHDOOUN_L^iG3L_vZOC!9J_%- z57D7jv5g-;l>lf@ua(lm$@;ANiGRUPBg4frGRA$yA9$Agx?I9XZO zbay8>$y4TevGPHZqBbTICMXAUBI)_An1oloorHb1giJ@~pFI2TKvI{*V*H)g#9m>Z z(v-O=)O-9Fs&3eF7m9^Nk{!BuC4cf|AdHQd#9p392q0D0Sq#{)(uGaJ!e2u|*Au^= zSq;bR3(5Eo%`3rMY;nIed!K!;tEnj4mbLl0Gm~d=x$>nX{VWlNaP!^V0{@A%hQ)(k z*lY9=-ZBR5doezqaY*c($n6!}&Qwo;XI)fuwTbHw?qb|y)Et7*ZV_Gd#P$8aJ zi^SQ;>#&#D?E~fSto73`?L-wwhZj>lk0#l7e-boMh|NM&^4Gi%$BSC}B>W18~8C;9V(JB-AoX$P9~^5JvNL)Wi^=8>Pm0AmeGghMY! zPq6yFLKY^*O9?O)dIGt2m=syM2t`-+cP~2nvq41(&_wKqtUIXjiMZ+bx|VNoR!64O z!QZrM7cy-stx(FZ_X`aS(KQS!^6YM}SU;xbUpQCtA>ia$Kc>sJcxfG*CuEY(R3%co zE*1WxGg$oB^(U`(eI9a^L@|d7*XGBdS&o&{O;+vxEXS%=BY;+QPrOSLc%$8?=UeuB z+%~*KQl=Cyr;8j4A!QuQW)(KrgF(My;SwsZ_9}wjpec{ImLL@;xud|Lhx0r>wJ(=3 zALNXdK0;6!_->=SDXeTYmY21mly zeG!A>1XRtwHpS^o?E}X7ia8mOfxBiL@Wz|-!_x|g?%Vfhre0hm7bl*if_4X%(SDdl z)_BX;!;8wC?cOKJO4>QG@x}2JVi;R26)&PPJVuC;^S^LHF>I*%OZjE_xsGSTya6opAILIZckSqX6H~F$rl@# z*#fjtRi?XGGg=bf`Ql;2-Ejc=qIKu^5!dhq6~UsB`05O<2Gn0|EfE}8H-OcDdy+h!JlefBUaURxj7e068oBa? zf56X;epfAIl9>)O>vmDe7s;~1RZDT*v13EY+MPsG?fgdIP0J2-2(*9bx1WoE2Zhf9 zVoW0;-Go87N%l$ZDy2L}%S0DCl0t5G{76GP*Xc*_-=23LY(>vs?8Knlx4$TFxt$Hj zU+|5Db)iKn^E91-)y7j@~61K2DqVP?FVDGjmQ${i!>(FxZ&0|m^_l70Q z>Nu(%@TgR@u$C&9TgzG+ubf2N^c@@~*|V?k%4eF*zV4uqL3Sc8$E{7MRaE4acou>~EiyQ0q9jt5uce;bQkmg%(hS)yp35v?`ddJuoN~L#;)hbJ2{u-t)`&ga ztCzC}OJSTDons(HOS^W)Sqqc+_Z#JR^ZIV(fX>Sv6|ngsUB;qrpdv*izrA6bsBv5L zoxQ2}Rr9z@tjYAv@wMV&zIuh(kOc)-%JiuuT{m0DOviiAM3!y;+NlBV@8k^hXX8#x zA}IwLXJZzNqqg}AabGtGlX02k5x(_RR||g?sNcShqi`ujC9}8;cx@l-iU|7rM`B zz$ed9L_O#%IfdZ0%0C`|*vHSAabBjv`8;(r<7Xc@(+EJT0T1rH9*WiF6fx|4PuIYI z^^Hd#17VKG3W7PDe<6`CFdX(imeX2{x(M=l@*qn1#_fx~YUJV>S1x{}`f2utP@$m{ zx>@WKPXVMuC-uP{Ux}F1;4oNE$Woc#Uu2*Pb6IYfhGAbdHfv;(Wk!KM|KdTC-y2!s z$-8>Ov%Ep|lb&|^^TerI0~XYSJW_9#C~7~|5;5hx+U98U>}@z;qYAwg%>GvO<1YPB zh+1!CL@E!H1FrxbD8GB!k!h81(e$|YU%dI;qY0AE@7U%3znbh#lB7PNB}PNIsdU~b z=W2|QTfRahM}cd&eT9N>d1#da@ikI1ab?l0KY33DnonvF>Htc#fL72 zPHOr6idSmj#atYuxDLER8z?_F3q-7?OmA&JkX~UcmW$N@)0@on#I`C@E=+f69#^_h z-&e9YHKnT9>1>`)12qKZX+W0pAs0N$z)p9=p^Z$g+0tE>B^p*0U{rcBmkl?+Z&7ro zjah12-l$8eXmkJ6X*zt&f8x0F#uK)pp*OJ0*1+mJ*9_+B*3hZKU)~NP(UN@gzn%BK zl*m!uVrW>3Q8O~HRBD(Ro|2cA&G@7Pdx$I4s28^TS9aJYhomHqMTC`lQ~r6iFLIAc zdAF{{XZ%E-Y>IZ6EHD1rR~~Qf@PE-}cn{07zi!YMdJNK^@MN|v)mn^TKWaOdMkWU2>J(cP@6V0dods-CfN>uW%Asi3qejW z`F1J+(DJ)Vk;r6mljw7MFx%4&GsWX>DJ8dNAuAg9kLhTsY>o|O8AJk^`b}?8JkR_= z;O5(O5B_Q5r$v#C@vVgQ>)OvS^Z5vfi?;Eo!`7W>xUEJYjP&>^x?x4ZIBtdUpLT=vZ~&%gNA2#X zwNhVLa(8u(KJ6cs+BVPsnBSN=aLgUoj!Ma}a;1q@Y<5g83zTnG@0EmtVu9hGwzYoF zgOUP!!VR#4)z9?uo*(6yE=|vu{$bK`H!M0KKce&!UO8DR0)*~|i?eOt!2>Z;Q>=p0 z(e`zIc%Qmi-bRGiYqDfSMGey+8PymuK5TfAo{@X4P@<5>m5dw$sLJr{&epl{`&h8+ z&uPK*y&Y^xoB?)kj0qZWEy0};2}RC5$Ii9iGl?}}-ARfs_#GYJQ%>HAAD>0@3_G>( zYDOq_E9GdYzc%k&d-Jnynes&(52N&;vOw${!X)AJ;&=VpYdFF{!x-G$glo!nE;Y$Q z1bFzS&|YZx4n7e^kv^DV2HQKh9s$o%T)$koj+ML(M+rL)_iQi8_c6R`;zW}KesUI` zgm!q}ah(-|WMajIqGsQP*plve65%KwS<$#*X=86!s+-@b_yzaNGvLlO_?5L>j#6iT zfB9W!i8VgUZ=qTYNEqWyx%3W`ma-4yk_Nnke$^|p=)#T~*c+)ho!yPN|BIE9Q z<2og|rBKLO8DX`de^BrJy%~4s8z4k^bXB0e1b9IV1f0R?6%V}N7#BsN`V(6_okgVC zU4A-81u6u^LY}sEm}@UUd|3`+F~JX66G46z%Vd)iT@B`n$y2`W7_>Z`0js`YR|? z-`p=&fh)Te9Z+( zK?NVE9^*|wohLhb$g6XJMBTYrL{0OrpBXyfEr+*8q3dZgEguTu8Wr4%m_S_PYp&X%C~?svJqWRAsCyR!ajjwPJ4m5m2dQ*wQG z84EUin?|BpMRtpBz)}SgQa(N?mFSUxal7_`4MLH|>w$~a1q{Pm@|mu4S~&YbzAB;pL`Y{^7*B07HtmDYR_;wRTz8mHy*XulK=jYwAE8>NVE9G(058>8at`I%2+wM{61mOj%TGBG6ux8i0-t1 zjJ^A&f-{vXwp~zTEjJ_XeJ@DB4q}`m%~e#&H(a3d@y}!Md7dbj{3fmy;#j*KlC?wx3Vjh%T zMk3GgkZ13dg;9U;Vd79LRIs)l!r_vzS$5eZXPTfqD_2|FcUg^}cD}w$mt(KBuG_6w zu0P(YNADrM&EtmcL=|slGaK_uU1`BO^K*x6U`7f~(jqOA+Jee`y&Vn!lAdh9c#iSf z=<7sFa3n@=z89Lmwx#%h@z6Mx@dBOI`Mc=HP>D3nC|Gw@KC z!+m`GHu=M83HNSgI^}HgwMQYDg?-URHhXQ5l5z07Q2os? zt?N_er~ufsS}0g@_Q+__zdjc@e)^_fHM#`X4J3#zLbS1JZ2Nn|mhrw@FEh|+nWFen zH97f&*AeJ1KEI&Q@$Gm{^gY{5hc|`Q{DN3+Ca|B*Z$w7mIM;+P>{&m5xzN;&t0aNo zyPd#<7RXA&fpQ!8R;l1UwIn{TwCCzL@(lH=0kcZ@woV8ujUHJc`18 z1|FxB_wY zv^kTKbgj$u1kXPTJoY$^hg)e_Aa3?-B~hU)GFK^bpft0Xh6Lq96y z3Ln@NBXtyt!+SF98si0{nEi?N z0)dWGWKS#Ff`9%mYqMh&+08RdtH)NCAlRH90{X0or6?C0K4aHx8Cz1=jeU5+*f^M) z+U z4iQwt73o3+!A-;+wnjPB<#^L=oI!JD?4Iqw4>k$kH?RC+1k#Dp|8!oAUTti)=3@ie zcth}anPkM>%+t=lSfLAf;Rhoj+(m(*+&?x#bFXjsh4r)DIP{)hMjYAMp;gY2RElQq z8;FQlXE-@^{h$*+FwTbwXD#G^m{h?h$QKgfR-?cY6x`%_nw{V|`*xQF?rB*uxEQ9o zfKTmhy85|Md2W&x&LzSI+`w1+#GVBBDEZryq6D^&)1~HnnP%2^Wz^C~$r_Xt-)*Ml zjlkGZ24~RY<6P8o7)HBLy$ZV{%Bq4b%;y&X*gG0~?ZZHETeJMY?x?AGjEnqylI+wl zJrlQR{o^2#8L^F1h3UMFgH>;;l>G)0g=A*_e0>sUzRZ%aZB{#7mFT9Bjdio!W8=Y5 zw3McfR`oRt-d%ghEPe%3$lTn^e9k8brn{-s-~%vudwe$4Nn%Q+ILTKYOs` zcfnUOKAkt)AQ1_&;TyWUMqpD8OrRXOnR{EqdQ=jlRgJ0~SEsfjy6SNUU zVFT0cqNw3I*&9S3;Du7Wh+E{9V#%}f)a0$dJDs*uzPGmiMvG~J2SlLfnJEC4241k? zVxz(6Oz3YeIH{dfs@w82S6SuS^l%Ot=JzCNjepLGcB9{jHap66fetBWe^VvyLu{pg z|McbWUec>rI87-?P2*^Oa?SM~0Zye!Q+;!K%fFrhlq3AaHhr16GSpm&AkzPg>gAE$ zetw#tbg)Bi$3ssaM$9Cd(O$ChC)27TeXCy(PWpg$6_ul5*Kg5vmc}}qVlUymU5!pj zrImJxjjaxaw14*ylxXa@OmflJ3()`PD??vcRwQGr+H5m5G5PF#iWKs~inB?=U>jPp z3el-brA^oo1ILaWq}kYwz1#DYxs^#d>NRdBxTUvO>o8lqGwx%e+jSw^b_9H}iz~N- zK_%%Xqg&}{aKCu%MUw4SIyWV4EOuU~R_LrIt5PmDJ9xM^92vUeDMXgT-o3o|S#K#Q zXJ-)P$k!;k_ai0g_>|iZ`JYRoZB;K2M*TU!INfMPg@Sf43E%z&(pZ|LLu^(OL{doq ze<(ZasHXq;-;0z;haggdAR;0l-7O^{A>ADVWHgLa5T#SPyIWd9P`U>rM#lyWWMje@ z+JKVQ%1<5|(J-4QVrd+qM8pn3nw`9T9jq_op#AOU>> zs9l_qyDsGLRrkNwJI*DU{@qi&AGI`vd!*eR++jxlGyjBXg114tb_-(a4kab1B~6Lb z8}E-4nk@P~QI}gGNC<_xYIa3U;?a-(mJ*-AZsMi-@{WtanF;mm#c4}k>f{B;p)FX# zah-6L58FMI~8SGtYtRR<|r{3JWG zd=wk?8ibKC(Qf|ReRNr-lVN53`gvYm`D^#au`3}t|mu4SEUZS`m$<+h8H+oLw z;R>3)79}1j?RVcHTu%rb$6r!Qteu&2aV-q!TxM|kU6ob4#kfAw?NxWoeP`hEDkDSm z9VT7I52%0gdB?6TN6kG?YT+02BftA^7H%@;%sWKebUbbIRNoxC!wxxbqzEHEeUeFd zKV|XS?A5rMJt5C)aG-6pGBG!IB>|x1J-A+o5DVfPg4`M$xa+Adfqkux4#LjC?^2eQ z>~MDzl2eUOUj}QVcK_QqurZME(fvb9SPqe!2$h1yGC|e+ehjfGxS^-EeM{1rSSjhN zS>XqJz)U416R;khf5R(x8TaLjIji^d+X8>Gmv1R?FMp?8vWiW40rHm9vo`R<0)>GL zRjJ}Td_U);{ywcFN1q<=xGW?7sM&B{J-AF!BGQO2N?47Wl3;^F>~Lq!KU?*DY--IF zb|(y^$5*c#Eq@EhEqvhg@Z#XCVO-iU~y+5(a_Gr69;z-N}Q+FtjXiQ>D_;YLYu{d4tJB?((eb$0+eF* zA1#~x!O9R*Cv!of+&o)2_JQJ7;_V4VaZd>2eMxw-O=tszD@eLY0hc8=4C5I2@Pe&{<|LauGo(cE z4z48&uZ2{r0xL3uz&K5!ksD_paR_4x&in@wedasH4v!9gWAo{uYz%^qIdmk&jZ1f) zffS4BMDSpdzrc54xF5KQyWer{W|#j47a)=Cv$wa^ zP7~Y1XT5MTinz5T<_6?-38H>?JvS`f+N}tr7&pvQX>O`WlKUN%j{<2+f!h#*?cQoj z!(wfKsno&f!(okvEj(-6LDOlY5$^iUx(q(luzzqB_o3KJ6mnSug(=2Ww*?blub)W4 zu7ClBXcm4EEp^Hl!~!qnzuj8Z(x+OtJY`7@2;oM2}81usV zP&ud8l0mfUPhYG$Gg8o~|NFnKbbreIx`6?8ZSA)B#6(o8L7s2G#ms7azIoOTV^R^n zU|)z-1^2z)skrevKC4052`Ca6(Fs58RidWmNm^MrPkU}-3$%Mdyi?!0704Q-+l~6O zyl|n1IkN}|5y}u@p>&GlKBZ~i{4;eh^UUWSM1gqcDZots=&T-Ad_Uie>8yS1(B(5R z%^Uv*&1qlMh*>}K&9qdOsCkVgweQW)i8G}99r*b3(wj(e*@78X=(vB*3tMUJudvMY zG}rh1m7%Gr+*w}PAR&EC|3X)N8Zg?On*ZcrstRp*ANG@u)iy_IE-S=Sm>P}>2q{J_ zoS@%x_c=XNC*q(GnMTTCw;wDd_TcCJzL99t8z`xd-Uzt>l$o&{v;OX}RP!Y5H`2aZ z)<#}Whg_Q+ww+FOL_Z-x^vJ5oSLAkgnL6dwmt}?Aq_WLp=js78rAP`zDL#1yj^xS{-LbcBro^hmoW$3G z!n>?N9G!k1Z>yPP#Et;5Zf9#cp?`6VG*UT?K2Bft*8lT1#s4N0&vOn)8Hby}JH-WE zpdp5TSP(sbqj3+7zGC6ZtqjZVrn=H^?1w-O4ig<2Mg5(sy+qF%{v!^_RC}UUYAG>w z?b2rhp{9}AE#HkPSB_#~rFn1|&sCdTu(q9p)SXyq2 zxNZY-z8m43$Kq_k%xV@na(_7d{>31(!PFkvr^sihPcidd$EPc-U2U?e$-L%K=W?G_ z189H8_TER~Xe5k<_}AuoZpE&#L4IF8lKfS>??4jlAPSb2yA?z+V+WWTa)ggQ$Fzp% zCq>H>eIMxKn$(n+;>i@9XFOi{6VZNvf6$Svn$jf9wmy0Bd~$0QQ7pK*9^b=tjDI*! zax5am>X5G1oO=kwef$B{<>mGaWbvdee|KIH;>;hx?dN#>u&!ip@LW0u>_}lIn1@;5 znKI_9=h9SFEhMMemEsd@DCsdfXp^xpvnKXU!66rQfm+GM%v}3v`3c=Y`vGyO8v=`0 zh54>*^+cv(z}tL@{1r#?0UbT9kYHJIAHkOsSb>d6b5iEKr-0G2ow-nk2J&c`6SJ5? z*0d}gG2F5UU4QH6S=$f5hohDW0iRDq_=dc!Wm;lp)Io7suVtk`sMeG4jimXvE@m*Z zhlBVBzDmGNQ_e#8kxpMlcduw>>8eow>Rw9slLz3P2q$6ZxO`RL&3k#-n3ON05@aW) z%eQ(;VWs9uMWk_*h6kaD?*9(`(9kQc)P0>h^L{A;>UuC(GSFE|uEE32vLh%6;qDP% zOFQ$S*d#09!AA2F zrAA(RtyYkwkBesgxYfZODy)pPw;wyIQQy^yr$PD`^6~85F>CI*mf6{Tvb}bpFP3r( zR#plvt;8A^{}!D7drybw5wHPKQ_-ZE-fFC$l50?qB#^Ps_h;4Oqfu@t{pZk&Jp)wy z%C|9RPpP-wjdD(vt&S(;l>dek*kKHM@6|F2>-P|;O!fD#ua$=;M*LRIfWsypsjDSK@%xl|AB_?P5MXVp+u+T`2#u3{{DEFUuKid7kOG1V}zuE}ZYiTDud8tS| zuii<1yVX*hnJsG9`rO$K9buknIx%`WNdTA4QgjM`3?|;Q+joC6k>$CdPKqr7-?sr; z%%=$Wb~TFrzGr7g^5pEDPrap?QSXIj*a;YQRRVlIiQbrLx*KGQ!Oa-wPKzH{e$sQ3 zFQ?S6`#z3^{pMY|W#oBE2yXMc>Ajij5Fy`poEx8%?5mru>&_lkaR6Ui-K5Q>~2A zJOj=*01(r2QU9db$xR3v`l$CGjk8BBuUgO#W~%I}3X&kGqLVC&Z!*ce&0WFEs(H%3 zwBpas)A}%tbu~Vje(i7D5 zv%ppV!8A3DLT_58UFSB`E{uH##y&c$`-&$mLxXmCIei}*m4(x^l!6#RI573^rWhy-!Fs>utt_);f{ zAk4bij?Iio9%!=%c{(I$ugRXQp2t<&wZCQ>OCmx%s3Sj3WuH%f@M5V?_&sf-=Op&w z>3Q#2FCs@6iaqsLQRW;E!}SHfHeW!K>ByjPQU9xnL|ESrcL5eRG3R!>1G+>}w(4U% zfZ=`rrcjl?DMA}VBD#Q~axag+8(M)G1S5CYBQ5F^q>U!0q{{zuOys;!|Njki^IrBZ zjS?92UGJNkp=KV9U0egp@spvlg-cc3P{Y_f^|TfX&6y*hZkzh8CsfbZ#PAR8Gh5Fq zxcgg(>^xXoTwD*W$0h~nyiqu$IiOajntDyrPni|xaXbAYfy)@P^-EV?E|~<#wz3ti291P*Guxif(?a&1ieuR!ekLB?&EK++#Zn?d|ccxzZ5L^iC*y5gJB}P0da3{ZPbZU z?T%t_?h!?G5L);Bk<8{`%d796)Jrze-dfN7UgbgcYCXp%qAFDvRERi3^H&8JiL4Su zt^f5k7JNSfOY}{JeUQ(c);1jVK(>Y?%9U;@&|g%k0~;GEFX@v8Nrr~KHhAIb2e{HM zhSx93?+&RRgnUwW_ZLF2dN}uGk?a(9foPj_9Z5sL>X+Wdg@Le*K^*DM8^~tqi8!dK-h}hg14Z(gW^Pp_5IddVS4|mehHU>)6!6d z%7!RK{yM!9(o}lt6vPW2HxfZ$6A@5AHCHgaNV_z-AYpVLfbt zm+H9xXL|p|x95{nOrFo6Kl%rdLZ8xaWyC8kwuVlKwIF_0s6Du+i*pBCPdPgtLt8ZH zowrJzf9|dNx`6V7U)olqctha=U#&=YZq~)DQlWP-Py78t&gTeimT0P3Ep#Zs; zRV2YbLuUbSs6$mjuA682s3@2A*RzX0v|D~=fWMzX$Bu;UD5bV5S8nbo zk@qKC=T8c3D8Mr>A?@m^{z%zh5tns;m6cw&TQ0WJ4&U3APVTm2un`;MQB<-s=~tG0 zC@rTT&Pbj7=jh$_yx#K|NQWeTbmmN##AEoyLvEiulJQR>&J?{FMPa2QKUE$paK9s; z*CjXlQ67`f+Ey-kwtI@h`u*GI<6}@7bFVL|n{9_bxt>-|HHP>`72a`;J~@49;*4n( zMY2jLZA)rYkqx~BhyKIw&M<9zHu&fJ546Q6QfZY8euu6uL;|qdzvyQU8BZ`ULio8k!9vS ztceu6$+8S@32mSiwEjhgAFJtLA0Ka6sF2NOQev~u-^a%yf=E)ZDBoeHgklt5X3a+{ z1l!vItCsAU!$(7YbMz7GV3g8X*L(Lka+4Ui$;LMo*C%I_Hm4b6dEiEH`>V%qBrY0U zjJ=^1$bo{szK@t}lb9@-90B`)AC$$Q7wWG1+=PQ$6AWY}34wwRzgfV~!8+N~t)5zs z3!h^d-Q(&0jgkybcuN*2WFm7#v{!2vt@#W2)9u=LpW97H;Jc}kG1f~yh#f?^CA29} zShUhfsWuEazM>xUcheloyP34Qt--PUE#}YfE+?g)lLO9lLN%0%r9X?zhg1cY>V}Blj0S`)|Ra z%F4>7EYU>s(0W9bR&%H}%6#kXK(QsyW5;Qzrd4dn&Q*0cCMmX4vNQ4ire`Mqvr?JM zVDC>bSDU`?TK_)TbMcKTkV@Ko4U)||>=m6d>kc}Ij$XEuyTci9%t0Zaf~^zrx;(|_ zh}&~T7MTO#Kj|5tN&6Y+U0jmmCz|MkHgSETL-k1Q?m*zL0m=FVji5MrA<)RAO znrGfE{gEPOe+1UaK=Fdd(X=Z0$8e5X9b=-j)FQWFkXtI68gfm5u^H-2Ku`}##he`N zMFa=_<{j#HJRDj>m}s9^nr-a2WL7d^;Z$x2*=rwI8b28=AW{<8-&S1znJ;Pi{HOo3 zwVe}xg9El__FPK)4%-mPS4P{5Z6sQgv@^Y^d-uZcsVgfOfFwOGe#EmqL6eaKF2{8f zvnF?r%;!U}tJN`90jO-;ruz0<0S-W5^^eyIcOgxb`G%1IIu0gzJf~_x2lVw<=L(;Q zEb8dol}Xq2;@$~&LJk{|b1 z95SRg`F?;47TiM*LqVhsZHfNmc@cMbZ@BuXXz}son^yauA?FEbwX~` zQ!n)kz>R(dx765>L-zIHlR=8T3#X}|-iJfpIsP1d3C%n6bv}12)(pi*K>!5 zZUq?Eas*9{MW^D}AQ*`j28AU!g^^U{^(>NGM6y!uedRUZEZTR_ z)v*JU20Sx@<;_^Ww6MmvB!kE93>3IHv~B@(U?b}wlx}xR&4zJ|>UE%GyKwe>O9vil zLH#1tdp(QE2MaC)KuHLdc7T@J)0bHIuYBXonczh3sQ0p&L2bCgfVml^nnLt_gy%h- zsSAxDwi3RFL4iX|oF*vaKLU<=l?Vl5%ltF7XII0zcILL}>|V)nDliI+eA8cPb=Tz5 zl(SZEnz^{_An(mb{crrVQc90BT{P^aJ>F9q(w0u`21+`naaunB_h@ksTj`l zHj2CI(oRa4(XIMrBx`mlexuytlG6T-3d-1otuj+NgQ#Mj)~d)*6V50Q&0xXsBSPA< zGgFck|CIcQu^6gd0TXO*2@Wqn`3J$fTsqoCXQX3GrzG5iXbrzpYL1F*Z$94mSEx`L zF*?TF^)SIb#ZeSMym9V!=E!yAe6L}V{=qB%%S)|n!c(!x(Lhto2L7YJpnziE4zC`^ zV3~GO9~zmGEeln}_xUU8Edn70jfy^xI{ zIF27Aku{+UKJ$A844Eq#4lnVWn0y*L*EY zi7fu3M&}^9Id=?O(>Ch8r-@AbKx|p?^tVCzUDrhtPGhWBZW?4xwhTzws$~11tK=p#bOt z#!py$lne~kc`M=0DE%;PUi+-b^zFT%ZG$@K7L<01 zm_+8GAq9F-HfM;JEg=WTAEDr1q6rEDJb3x*`3t49_WCsm+I(=X4)3yF)%me4G|Gup z?H#UrXom2w1d{acJ008hck{W5gREOmxYSe~h(TS0kG;c5KQ5t zG5Aez)!d%AN6ZGFyVfYh=gdDkBrSm@nSgGF&hKy}`?5*G=dYBfMaN0BH|OJTWks$w z?jAM%*1pv{x_X+~Nm)T>q}QMf-aoN+PJ#pCm3(+*o8JX5Yx|uw6odQzv=1?hs;(sJ zAR*rlwiMReP=S(47A3DCXSQX00(mZum_mx<6SK%w>PBnII3$GlwX+q(93K#KQ7?1~ zc`DiVzMxga^r;)?_jhlW8kER|e7HjysK|_{XE@YZZs{Ljj8AB-l!sH2CKbDo^Iork zy~eZrZVOmC<)J^jx~sTiXn$~qqLj$SlM5vSR_7QiT`xq@P;1%9-ImuyQ zt17;eJwhrYb74_pzq@MR>Em8?=l-?|SMEY#Lf`cuZrlDQC;xXa37cxMilh6h8%ypK zuGodDI@+q6-iGTqa?TcWuRp3~cbjQD_}4g11<>?e(tq3W{$U_rJIS#HG7tje;LxNB zfAjPyIU(Jb`c$R5oZ_dw1G1C#^PQ{@$zscc$a->Jh)odzht;C{s4RV12yZU28n*qr zZbKjTKqL@m7F_)9284qS)4;3QD;ak5muWf4iq)mV(^jZR{jTpn31vyDyAd9^=B>P! zIAaCh0K89GF1pAyiJC9J&owytD7Kl!0)2eZvT;a=L$3O}6bEEX=}$Bsdl`oW9z zL74J-rGE67)bq)!nxGS0iJ9`n!)_r3i}jw8;R+^156&`&@%INL=w2quVL#!9x4?IZ zrjPFdQ3yFS=syL#yiCK9(VgrNSy~6G(`ZTvr|A)%3%W8=L#KWBxw{PV&KiC31^vD1Ba$y{pL|-0Fl_^yM>Ec4Y zrXult<786nxbxqrkC`5sqdnl#!1IC8_uR{O_ZBO1tWOT-P6Yh46I=V9>!08p-;(~x zx>@N<&#f^m$4BP<;aXXCy<%(OSQ2}~^>Eb^56MAEPw#3w$5`Kk1$L@7bx((N`&R!> zxp4ZA?z}Vw-?FJG8qsc-YX9n$@5XS`4ByxLOc8bTR!4+g8|!QptXpmRx?cD>(1|?l zM3eC9Sx*e&Tbg;MF=pdg*hf#&u2^_lwmpxoxkdtM_vQYrEXjZf?CZtNo2S=bzZk6P zlYTMYe?;$52!3tT*{| zuc#jvW@8Sj;~k?*lN9iyBX8zX0}JA&<}SWRG`?#9-%Y%eC(&%^D@|K0xLPU5ltT18 zYkAiF8djIOc?9p1Tz2z^0=@f1{|KL4+7;j&#UfNh&_IQg%?{{H+mX8?T_15*HE!r-Av}9Jhg0bg7wr~{|u3|6pa+dgMS(+c4n6Z$_%NMfu zX;SwE1NfQZfcn~KmDWzS{>^TB2<6)7cJGJP+@K*UC-~y1?hk}ViH0>ln?boK&14fA zz3v$XEyeD4_^|b@{_obZWxGV&&wd1zgujHi7+Y;zQ3fK6%Zdrvuc@HUuq*!{qq?z^i{R} zp7R^{&k8O>510@M|E>DP+s9fbV)rTCGT0}FziDYv`Ui;;RIF=B80qxiHI`)r{Zitu zT2DQ`)W$^d7oyd#ghz~W5bEedAyA#t#{jdnvGp&Y}~ zd?h)ehM6@RIpKKYe~~2?K%4EI+*+FDF;tVC7PW9>$84E(MZw*Gzs3X~V`(mz#80}7v&@K5&4-Mvf8J)VWI@znnu&b=Qmux+- ztIds7ZhYN_EZU3XJLCs%Y3~d#D0`qiKuLy7tbH>XUqb~J5a&x)S8?{&eoS5uUpotN zY(}FIea&$`>TFt~S_x(LbV{L4I+2ost;m|prM|oP@Y8MQ=5nU=#Mf-UJ{E@`DlEi2 zVwD2+$a`!UUjGUxzb^Uq1C5L`qmSch0CzAK&zoAo0W7;w?9va3&mMmdf6>wHZ$C%2 zv}uu&`uDA*K55|m!3k?kpQe#M(PLrpdFS?8~h9X7?bKUH!26*ch?$1+Jv+z_h6b-31DnBq*zW*HYc zyifHRT^|-i3rZE3toH*ERNxs_4vWzaqih2~)Z4eUR4iPib7o$7nqu-Ekiw#meHMek zeiH8~UBG0ePgu!RH-P@=RxNQ#z04oOBe{~qmfJ?JUz(hFVpaQVeKVZHg0A-1mJbxr zX>SvM=DgEAa5jnn+jjc&)NaYN-PjiEP%+g<7Wo1d0ylEjNs|j6qRZ>YL z1GWDo=LU4rvQSpy?A`)iWylIMOm076U2(l#S%xAUr7p0kkG!J;uE&GA_n$ug`-iv{ z+7Q7y8&Q`$L^K9j!a!%l^$Vs9xcNj=_DMk;zV9bSKx++TcHlYS84n}7CdsJ)p1r`U& z_#waH*;)544*7UJBB-z6KRQU14Vf*yN}iU*k=7VkKTIQlnQg3LXtvw>ePY!0SohQH ze8|CoduH3~FWQx^DPQJt2?SO{OCnxQkUrDu=`9CHN6Ki>STTsf#f4ueB@L+N7l*Sf zT7}&>!MN_AH`oKM>?6Gk?~hDaJvIHaoLt%rVwzw5X!+%CqoeP6mxf{W7J8r$lAmf* zyEQyk0*&M{4OcOfT?cY$Vn-C*!MJ|{wAFJudgaW|{%uHn_ z{csVX6opD77Oc9SDe(oFix{V@?wtWe*(*fzsZGDUm~I6>{jyMmr6#T0!Tw{6d*;fp z3ccvJ6}C-T%_Dt769)70QuQ|P#J#x+6@xMh!fwEhEI&DTV`O%{La2;_r6bbgd#d%9 zKx-mbE)xFI#;@YR#g27=+bx;=i?r@b$GM3a!^ueA7nx32O+!8hLBrLgG+z2IKGvql z5!pvE&sD}=xED_+O^i)cdd1#Zn_Z1yzclh*Lho#UUHHr;c)Mvrl-6j z%a`co@n`Q}DwQ9Um9@3LttP$Y?!U&((%yS1dJ$G(swk9Le?$AUy~hD+TKcvT2gR|$ zu${uB@7fwbxXPxDP{Wfp;l%?#Vv5;Da;B&HU(fFa-cE^G;TzEC9RhWA9&Wt6m zzuSUq#xKZpY7)?U>4|Mlk>hVz>027@SsJw*^tTE#gu80}@ns(89LJo{9@lW*hH|5= zT%B&XPGx^6fhB_b*KXe&)@XP6;0gdaI!>7jSrxviGSUNUl&V#ZHkPClFucIyJZ2V% z#Pu3s83STaG(T!7^AgorYL?=iDM8Q|^(?PMJ27plwX+KSB*IJRZ2=H{9>jtL#Cix2 zVSx`#QIgKOjP50aTptL9rs;x?PjXE2>$E0Y7?U{We%)Av3n;UABEQc@)C?B&{|q%` zGRT{7XEfY^a&WM$g%PnVA8b!T-~9b)<(SWV#het~*s-i=Veojh{_BAh9_(R>)0nBI zizVU*C0zsGMQ$)jF87&q#%fVpTxM>+`p6(w;`QWhA&U~>0TV=Te?7~J!2r8AC+k_# zfVCm^>6TbRkRti?-mha9aHp?{OUfMMyN?YUCiCPC`c8p{Wih; zsHbK##Hmtn?kr&@%9yXt+ z{e26=$iY1)lf<}PcWi;K;=j#EJ?D*}TM6LFIrXJsQ-OhDmOuYx@0bNclZM{ZM(2j@WuGVP^vwd%XC`CH4rity6q?u zq5=S~ZI_`67|q=f^lL3!EH6r4Gs2QQ#TJT+KaNrVG&_+Xtk+Q^nXJ_UJNT>i2f!b3 zUG-gVf5Z7W%ud3d<4PS^8{H6zGBt=7`Pk$Cpu%>EGPu}H&Z=uc+bs8wep5+|ba`o8 z|Jw^qCXFB3=WtFFo`%)OxAC-94kE%vX_R{ZUo9@m6_kbx^MlN1H6Nxa<}@oQq@T?% z$Z7q7rd}V<_uWk9vWnmp1D+^Rl4!?6q6YEWe#ieBD_N=vGc}BKOC@@^U@}7wt(cOF zb<+7p^ik^<`lcr5G=P3>ETE(|zfm}m1U4&?(yJ#Mgnwb+x4!Ai#gTHp@X?U)<3LzI z%0hZ6ZrHN|%7njjUk%UK{mI0-A!=5I+LkB?Un7{VqadL=+m?!m89ZMO8aY0#VVIna z*f{WsoL>RbC?2X4@hgsgn_}i_z@|1MeX0ke>6q@aHjI7l*XoBNf{Uli?NT#X=~MMl zhlRu+89sg{mXZ0`cQo@(@=I^tkQqPWR+XuQ-o~!h=7F5ZxtBVlDOW;Mf6}{jjT!LZ zlaHgpLoV)hm^VLEQ=Kju(P47lM8Gx8z{XDvC{ot8%&eLOTR+oP89szbZ zO`oqWe}bMlKTU{Xx1CRYF?4Ouj8gt^K)5uIXIsG*?yjt(JF<1^hh#Nlaw9+a74#X+ zP{D&E^%G|_w)Tg8lD1vj!f=`Ek=Ie}G5gekC->z?QO|p}FrWa1AzJ5yQ@pP5yjWxI z*z@5_94ts*mv{scYW7U?A^T$dp4ukMq9W5gDMaSnig<%>a|OmLdwhmyNZM$>vy*05Y5qxp0gs^ISVsY)*>Un_YJ_z7vZ<} zr@_=d@}%f~;6=UT_)M?+*u&QREj7$3|6RJ(tRDg2HiQ>PYlX-2aLj!c?mX2+DMK?r$%!gtb-Gn831>*$PD>vI=^wWv$-H>QxV(5kUrP0C_6 zniz#AsTJxFmoOsHzPTlIUiAj4n9BVOfd6cjyq|A2ojYIiAasjOBCg| zT=L$~lL5lBgZ|20mB>}0`%1v{pBE$Q$N?RfkIJ6Bs;>bDkZ!cDr=<}tF9K>vNz*)| zr^$Bj@JPdb+yTz9?gox2nm>Vgv#i?BeBbOqfv_CmK8%{zy#DeRh#LWmf=`3srlQ1 z@JVBx<$9^^jFha9G68qu(aWvH3bf6PT*|U{8L;#YKLxhm zfM1D0*NAv+`Iq5UP>&K2-?4!xj(nKI)Y!CyY)K5A8(mn0AEMXmTZn!Jf#A(SJ$=~h zgc#^e$A574up3pWN~Tqtsk+n`MSCSXzR}l{hkV~SX-BiLmQ|=91vRp6bw>wO!X;dn z^a-b|*}@of+QNH-Tg!>ybKI=-_tW)w#ft@2ts;sHo)-n|DLL`?`51_#NmS~$48kot zjIWis9-e$*U3z%!=_6iGEg0i)SX93DIhg<0=CLH-m%c((gEj<9LC1+{RF|h9+c+lu z=_+b7= zusA1y|BtuhAdOV^GV!3#!Il!v0&i^c8m9@7(wTFNNr7Lj`JGA3O8u5RxL<&G4KSnW z#OcjSUA*97p)~)kRwxv^_#cLkVX7tp#2~!c06GZ%-F3M)eK)L=EzB@=IYj*05e+0)~&#o^WtoK#4k4&-TnYG)bHfpuXqFN|5ocdM9@-~hU zH}TVOs5~-x{}qRK_TUI!@1|KpmDbEZA zEP{|Fgg;^}qvg|{l*&-qXtmQ)@MYkm2f>_14aX}4!4lgGPkjM@+SuJCyU}mwqLmT} zf9(d;f *#B74F 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/Rmd{>pAfx7gvxzGt5 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

?9I1$H^cJgFFYC!&O(-@uI>WnQgV zk?}SvRfft)A+hM!77}ggY1gZa)8O&f$t|GQU3xdcyj7H@qqs4?XTauXtIQeFx`+Zi zxmToJM(HM0>`YkpS}0Q7XVgf5|G)oy#+9`8$6|%-`7a{Ae{afBf!?aw5|;Os@qbfX z5fN)+_{rHts`BoAK3+ZODSUIQxe@8X) z7Q7RcJHc&SBNG+Yc{XO@?W$39IxbFbTZ|$k07B_=ch=R-HSSHtg6eDdUp?={8BuBr zW4O&|5Ml-@5Jk?G8zsc~j@!trvPK{9B^_Jq3P9!k z#4{ahfN?jU!;aX1oWnUKvdK^Zud*<#78JBR4V3M({|-Kt>-z)={vKO6q*wNtmM$-G z;<((VX+g5jHRT6a2xarHmM*fAmN(&&b#UH=MjO2@=h z%}gZ1$@)=owW6a9UkS*`f%!l0Ilq4Kw3|+h9=5Je_taPwi=ZbQC?5X}rEwlRm=JS* z!Y$wyWU5M`5fp|!y}Fnul)3six=}JzKU|#N@|s{$qWYB8Nf=!zhk>9UM&6@Lg*)xL z_X}b&LEOa-1x;!pr^(U5*{1Cm%f-kJ?G#M+D@e}C-Cf)SM;?AL)WP=7Ou|e(`Ip%(){}yvpuBkRlw}8s+3DC1oq|q41%%AZ)+; z@^?*-%S(LBQFr{|_diDy!#U-HGP~7weaxtTZQwi|wOHH&bOZaz5d5TbZ=Xb?gw2|N zAnNQ(fui{_!s5Maf`@(02qZ|<_0H`L1XJc-c-o4!psnd;t~AEjXr|J{rOfSpSfJ}6 z^^lyps1E+%Od>|Vye7w=9z|#;<PN5`mwXDk$%IV7PrH?p%y$zZ8?N5A z|4ilS8hKXH$w#v{r8*mFuGQVZx(24uLM%z_K z?y8j_$&s4o72GS`c2RnuF}9bvSJJLiMJF7J{JXeLpzmDq;FK6_#-bZ5W%nHmJZ$ps z?R?*P+kiv#_GYcGvytmcYHv9eS46a>x%5JQ%=^fm%2-~5u8T92x9z+3>t^Jim&ZMv zpMLT3nCA@fs+{?4r-}15_em5qPLik5s2tKX#OYfFu`#Z`-!r}+9Ve`xT=naan5PTw z`94sH-yOx3td+V*Ui3#J8eMi0inrkTxaNEQ!nBm^jIoE8ZTnTGPi%b9q}nnfW!IRu z6Jg+u-}1rh+TcDItf^z%sE*mnxTqel}9$9>yFw zyeg|hdeHK_`|qj>lb2G6qZ;bbkxx7OTBOToEc=`T44|YY0+hpc*eKfXlK<5U2Vp%F{W8 z2(OLU8y(b8Pp9kNkb7_NWfms1=UkCk_2xZO{l0Yl`3RYWb`;vEpvgq28F`BJO>Go2 z7d7c1d`+#-udY}T)1UUZnlj+egQM|6UHqjl^mozAt;poVdr1UKfdRLp?QbQ57AwtE zdiW?Isp5p8?V9_@* zZX^}_jaA6Z&flf}P5MFz0jT65TLcYr@zUccy2jN0DC)YXXrnx{R zHdhQ+*fi}BNzB}72h~#^9Hw^SZD$z~xx#u;xRdA8@1@%9feq>O{v=H_F}FxHO?#c? zPrJmUGp0Us(+*SFNO%-pS|_7{;PU5inj6}vT_9%Pn+ zVV;rb{V1qmh##Zk6MYg`YJ$LzP&V|>rIM*ye~SLKU8#$?4o|4st!5LxojXj-{L~7muoICv?wribesvq4q$e5(;++%{Wnmk znVRy-AjR&&SQvvdmoj%5V|4U=DL+dn|1@u1+Z4q~#1j}_ z(G(##^?Lf;QDfDeu*Os?>Prhtxo!jNh*s|W^M5WCqobzQ*=lrOg&Ltjg@Z-19geqt zn9E8nWs7eco~<-{g~bOCTh$?8MY{XRKwK>Io_$=5-g*#ylryLVx5aL_7+r2fxvtk^Q zImprj_uvrh z=a~pXi!-(rQdgAIcq)~{L0i36!8D;4wowy|Y3$GAToTBYMKtBX8D`|J(ye<)4#*8ReEnkNF4Q1&6>Wda*mA>L1M6)GPw`g}cT!nmoP z0PDS(TTj%?A46-ld_V5YPyfh#!#!MZn|oNRaFW9KS=;wqf3CUx>Nc%HNL+(K;wwD= z#5a_2H4*|GdQNY1&)bgU8KP?W^aB+v$O~HWthm?9GK&Lx7tO5OAAY<`_j!e-#PDC* zu5hCyv&wFF-JPM(PrhV^bqM#1I=;=)G)2VL2R!ydVMZ@|T)oeZHYTWN-ZIJ^_XV-_ zZ>s^X0WhS${n-0D41+yaJ{@5xWXmf3T?fX&&%}O?{l@x#03oM#pElz|4!^Qam!ABc z7(ZD6hpPa5ptPo*x>=>R(9KS8#B@vMo5Dm7(2oAnfM@QD@CC7?gbw0Ip)81%CTZ<_ z#Ad6w$E^yezZtX@a9>OYg__7sbOv zdbz^)6J8zI&0XJoVnGj*KW;0o?qwemuc{}<-fnG3{tYMZF(j};e&73|RgijX&{1gk zW2{GKB0d!DmRTX&B8&sIAh=e!_WVz{L6D{ zMTTh(_tZoJreeuq)3yJS;Tb#w3Pd!U^!8nQvi%tq%SvJpZ01=8_;u485Vq2a=AKniEFm;u%%Ewu!CKv}A&F~ytef90?j04X%q!8jT zTv6iH8-sM*7f`OA@$TI(`VG>0Bx@L$MNayi+X7q}si`kFdj@`Ga0i=hvjiY)#TPZr zj3#cK3|nb4pb1Ld9n;U{*-ZScyz1uBk#|-2AY!wG?;ZJF2{%-#<(pR-;xC0hLFieG_IJH9T@MQZKig z@qgPxp6l^<|2z*%2-#^d?{<`@oF&$fmQxKpVwKlm@x#PJhdouUL0e;uuw@~tRxppd z5J}})2b7Z>GnnMGV5}7D-J~1#wUQ%qO$m{uEB9U~jLlKe^cK)O{{HgOwdBKAb?+-f zZB|oj{SW#pZD_fbR_m0`qTPK40Na7oTZ&>3N3hTw_47=PW_$!#rOBuk%({v2n_^Tg z4%KEJ*99Th#s=aGybG~)vJbB#5r=lgoExtFQM;cj5s?~OzfOqlO~H#lF}%qJT9idA z{u$|fHVROl-{`H(fn4?!?jEfb!wz7*-WyQ&cHkf*>l0yeQK7>6HAfdV#IN|R3IJ=j ze2frAQA?PqxeV5B;{7k2<82hEVIhI|qbi(opsL`7OM=yuv@^gHR%9URxW!4zZ`VrmC2a(Yonw zLCvUDdA5{Myb&{)V;NOSW=@zho_B7cIq7b@JIH%YR8-Ape+y!Za`*S2XzP!V=)cE3 zNcz7*c4t>ukFquvt?W@)=RwA&K38K1#kaV7+E@vz@X251BFE@jY$vj!n-!%{_Ay~nXblF>bNhUAjLUxJRP8-l zHb$H{8NZj3ycQrJCY|N4iJzh->$0%e&=YuGx&kq2Z{!`-!`HK<8X+o|pjYMgFvaie6Ui z{5_w9l7jb|>BD6?;N^Il1$uyD0);t2-*Lc;K{L{n)(A@eBcikU0$^KR?DumA=K_hn z$xN5d*CjBaYg2S~4%j5tEiEL4T+jhfw%f8h;~C1mwIMb<`Q=sx9hUO2=Miw|p_F*K zTr*z#dSe1hcAFc0?R^u2ori^~i?nQx)W*-6lxDZa#1IX36} zsQlSXXUQxM00rNcajq*hv7THM`lLei{TLCut`z-n1&Knu${g-}CR4Zd!ZL)EeAN$T z2r7dzS2nq_n|p}qGSQCp=3uyUp8&a3c=0{GGOdx}Sp}Q-h#tq`{1J&#m{mmx?@;Y^ z-qnLy;2scdGJr(9VIK-JXt$f|x;Z0&NhUD_@2yJ&%hFkhG?2+!bN%#g1+%*?=eEQ& z{x}QQ7LzXDJWGiXycDOonfM)wG~)!^E*d5MKyx2Wb2#BKpgF-wl;EBo)g5=aJqeSC zEE#22ItE<+m&bW#)l*=eM}7U#N@|LDvZuKP$Bn9H|CQ*u@ig945!B}tr`&)uZaV`0 z=3-Qf>Kr9VYAKyFbl@zweHP)I>y>}H^&7J*>(Dc7?^l3p{m_JXLA8FFsF$QhW~wFU zEbnF93`1JVfy><$j8Z1TYl#*Bd$ed1=4J$lCh)h|N=lKVr50R>EZ9*9TI0E1Y}D`C z2oY0%`+lfJ)m&WVeO{JJbB2bXD>P&dNFoCB>!HwPCi7{Am`-wAz*4L-%!Qq%N4h5o z5BH2P-R1FJ0dn)~2f~AE7~ZUh-9|+OE-THHSE%CKbO}*Hz6`n0at>@tx%aL26#@2BslGnE z!FpmazvAL8SBZvmbCdBrj1`BqMiOF?SoA$&Iy``UuL#K%zVo7^xFs?Li^2(mYpszj z8sD&Pa4-%CvYx-}?$8^eW!|7btArbPGTGx0I8A;x_Q7ht2p9pJ7_JCD;3v2QyH#Bq zHkgm-IRtC>S^3PK(xzMdTdR`z(;u$CMb5~dtN5##(|)?;-d+AKslu{n{V=&F#(t3t zuv!yff+fJOm3{U2HocYmX*JdI!EZ%yKHD*teOq|3(yOMXA}3;K=H2QC_`oltn8kTV zl&n!y;|&8?s4PVo2M8><4Xm=Bhyx{ZQNgr0MZh3jDse*Mqff-rI)#-TofUR9-nTv( z?1vLVxuX|CI2G1x5Zbf04JO+Gp z<}J7y!fSOtUdXdYSouCW%_ZRKK|3zB4pmDJE_}umU#2_sv}cxVp)32e>-Tw2ijgd3 zh0V%Zi?h6WZIC8&R0Qx#W!IUB z8)kJR%y}JKsL1|b;Fkdz98Z3^&vwr5Y>8|B{u{*_FQpEbgI16u>L0cN>B=38uUxk^ zf@S8t$6rxFt*3A?#p*WmsIKYgK42r?WD%2FWEx@+241Y&T?Jb4!1%OV~hG@!Xi zGW*oovd%oI z+7NYfg>iCFxQS4_>sJd@@mkc>7jD^e32caEID5ZkUFTs}S{p;6S-F+AC@}q zN=cBhWF20dke01l)Y!~ zD2ws>@~=lw$?XlgMbV`wEsY^E(b3ZS`?lRLv-@tib#>mop}ugA8y`QxQHq#ECe7<| zp_s7@H(84EGzg$2lNW;bgv(lTD2~}QgTLW#`C-fmSRd;Cx*RZ)li3T|2~+U-2futM zD>j)^!wwRFjpn^QdSnP*&6MVdi^ax3uB|kWwX&wt25??3c&8t5SUxS*P(^VFH_^=c z&D77F+X$-LsMOrgL}!(Co(p_F^$GdRJs=Sb{MkU~9@f?VI$k$1yCifqcIoD|2?(^H zat&Wym|^DvgJ9K-84C+df+o2~)Gc=1Bi@#bkPjgF_1FDZZpoRyEi38$g)RklG&VEQ z3sa%mLtBxj>s5~U*dkV0(2vN4fy4>%4aj#fE2NKK2&|HsK4!}=n0M0U^t||>D9>`7 zHTcv?lu+i5u>bqUx{sKcs-PKpD16sr!Jz1zIr<`NBAuzb`2PM!ozL>gZVM*EhpI`D z;3If%S)}P{wF8qWfC*xsLW25;-1x2!a`(-UkSnsl>q=o06@Gc!_G#~n=W37%rL(`?_M5()C~Jf3O_;;ja* zdcYY3!J?LrHA8V|NN^yN5iGBd%;DT~p3T&me}XrDjyy*^^0|cJO-Zg*a(a;etiZ&o zjv}luA%VW}Syy_gm~F`PLzbKUUGABgA!lLLtfc>!^WUOJm?%+ID8pALYzUg(Y8idn z(C6g<*a6bgs$1(1cF9#=1{qs?|4kSIa*q>h^~l)c;QtFLW!#<6s(XCsr`B`}apirt zb9{kj%r$=;e-MEwVf-|(z0&|)=pFS7Zgxnv)6PALK^%OSA29ZaRQT)P*8yt5QAf#L zP^|cn&|iU+pc_Uz@Z4O5!n*Bs+lcyCB7+*DZ-l$wVjN{+{^W9^CCKW9Q&wTJ?l}&B z;tUKf;7e5n{pCJt#WiQ2L}9_8E}%asz|0EarA!TTQZPR{sHsPgn?cAjus1kEa@ITV zee7`84OxOHW;}{@__{ zYmnWlna0O|!NATo(ku!xQ^(tMl1coCy{-Vrg9Zi?`nw*5P4{wZ)iiTtQ(Ilr1&ahDDgT5)X z=W3iK>H96obP82JZ#* zu~Nr}Aw&EvBWzA*ikvxG36>7XPkO>#IP;~IXKUmK@;pZ~eqkn9p5r2OXqRkIejX(S z6tH&!99jqbwg!reL5qP$)+a#26Q*5sFeTzB&I)OJ{X;6`ob0CE&?5mt8@Ycb&{UH} z+2Yfue!l7rwW{lgzZ3~BxZ)F+ zw*XgiV`$A*U0e4&mHcyxz|3i(d04~%`Jkja)I6~}Jd+^>#}${euidfG5+qgf^EC`S z==J-8>U95|PYBOIEM`H*%KWp$q%dmAld{NbxohGI#$b{0eu53DIMyPRrxj!DW(Ak+ zT3(A zsPv??wJn-<+=??kb2oT;QAQrDw-b~4Mw%}Y5k1``yvV0L0Z z+}kSWiV)6-QqSuN*kV>)Sj16p2wfDdm4A>#J}9BLvR$8~a(b4eyuNTJ z-YTeT&++iA)DtcnG%x+qRk`2l%$y_oZ*#IYY9OwFn~2;TemVz!i$39}lVo@Dp*9*% z75(>y)ngti7zqQ5Yok0ja2PU7<@IoDtIi5pNFuh;VHZ}CmMJlOss%3Is5DlN_B z=^l@@Y;a=8Hl%=~~9>K)wjn-G_waU+jz@-Gj;$0`qDI_Gm zJd4v$zP|VQy4^8AUdpNCBjTRV+ntR>?g;SoL#mg3_6>XTL#%B@KO&NrR=iTcWuNY< zyVpUDqfHX0jUCCa94i*0!@xT=O%#1wk1OVSRa*PwPlCbe<=7@Kgv;@4G_AWVw0 zYohNjLkU$B9aWB-dkwy~21@SF5xM?3jgq+xd1%E#nJNiU^MLoY>hai;6Q|-pi=g;v zWMsG{Km$09))PM?E03kDz4Fi=F-)E5o;v3Qd)c*-rL|& ze6Va;9uQuWsnr^)_5xJj^UXRb-=`KaxxBxt_gup1s$fWZzlKPwzTgvo{EFkL z2EVI}XwGpU0iXC4_Y{I8DCrt_ltwfJ{k-cPM)`$DJcf!|;rlSTR0i=Rx&PsGxdd90 z08LT7xK~6}cOnVRFGibVh_XbQ_qh+njVJ%#CNvIh6ut4gyrVmDWt&y$LR8+VKK%73 zq0Vq?lk-s%i&)XmGI0|g;Zxb~nc#WqO$?d8I?N?mi2OdJ$^`iR-e1XR3lTLZD^v6G z^8X|01~fZVjkzuW#bx`Y?J0i~m}=zHUI5xgeqz)QT6;ju2!xbu2Kmh|x{o75>%~m7 z420AFgptP0$PvDX#1jF5M}dbEgf5zEqQfirS%(Yq%2+2YZKwzQQMS}JiLBj{Oqi`Q1@-(5kWAw1Kob;gNBy);Hc%{&z+V4Fc zZN}>ct=}>S+*-KC4X5R)3;NLKZNy+aDr~K6j0eOjIw%EYtZiRIGbLrD5(+$(~TONZ|^m0>cqGqQzL^`(0k zmZ+1?6w9Uj%ieLYJi+Pjd7UX2a-!*alQ)W02e17SdOVyl_n$HHS#e^wHZYiV5&(T@ zV_kB@!kSGpeoj`H6Q0~vDI;-ikd~H43gQPIWWDp-{4!EMrlMxYbs#V_y>vj|p=Yp5 zlJ#)pNR*LZUI8w>fYap>y zQ6IV|BM&FQcWRLUuSzDMbj#IZ=>4|zgogxIk|=Sm_Y8S`Hreyy8$;8m7gUvaGtGvX zHRLC&UzFZk(OOug=Qc7i+DEKLtxbKEb=E_H5DV<8Rd!3I^VQ-DG0KZyX9Zm`x#sH= zBTl^^j13fJZS3--bfJ_Z4IOA8@ zyTn^un6Yo!9lMaX$I(mM6zE|ldr#X=uqki<*(yNk=GlXg1%lFl>5}r@kuryfTm3qe zi=(-BQzlSSuf<1{=7MO)h&Z(riSE`D)R~Y`346PphgTG*<*W^Qw85 z#1|t#9HuL*QXr3(Oywq;yGALsN!y`ff8QWp$s`XmtJpC6;TP!J>6=lp@2Toa*mG3C zt{63S!9G`&4l3WCtH}RM~gICU0UKj@G8+M-etqYaO`%ffwt~qNE z5jbG6+*jkjl_edVd<6GgzVbU7`=|elQ2F0<$6)U~4Ms5t`c+Xo8Vfl(lS|Zp5hXcGQY<{(~ zM^4jdExP4N{rtH$R-nm`TltO+F~2}&WsA36y-tsomdLZUudr1(gy2EMv&+FobqJCC z4$Tv$tyl{cPPVEi6UqWI;#>-M>5=2MFnFf4_w|0n)!Ky!=B!olus(;0Tn-8;h|@l3VL;Nz zm5HR!`9;0Q?R&WoRKhJ7f7RLHlcP$T(+=Bl@)XKnCA(>Vw0go5H5EyDqHni1_5prz zMwaSsz!UY!CFRxBKdwkT09&6;-_<^G971P`QJ4X(XzUtIg-+aqG$OHQ0sx){Tb-vh zdM%hCbIB(T2gqMc!1Q)Cn@0?18g2nBu5j3IwH{(QyxPud6To z7MB+vYRWXD-&Drc7BqCe*@vIerZM%l5KEHPbbFnK@rdGg`c=Myz6zg_{?t;x|Hqq2 z^479B02_4pH))V5Imz(KI=KpQ5)OTErY)j;@HWy$gF1Dm9gvh)7|$Rf38SaPpxTDQ z9HfDV>yA+H1FYbVGEBox;0#4yK*Mh+!&Z*8^nUt0ZeB7x(+SSx*(;v3I&c2Z31iRq z)?AT{aGMOY!Wo@rMMyYw%Cq~F|AO3|>PF2U2?DN94G&zDaGv8{MU(~Fo~s>Ul{t6A zbZ)L`6h11~Ggf3!r_&IeU0-7oePd@K8w6KTKv`$#q?duSW)>)&JUnQ;tJxE&`Jh%Nph=01VZI%~{^o zMT-*)UK5pje0740;B?eW&lfJ)kJv|Hn768_!6lx=e9Z(uSM~&wRN6mZQc z-<9XD&YZWudzSv?K31m!FBz_&+nbu8LW3)kuOU6NbBz0}dBkU3X{@6;MvpVYldOWB zmA-Cm6?IBNl#|pR&F75F1}M-6a-#UzLUZWb{G76v$Dr>=46hV0xFr+jiSLsAb5B9V z8?jjro=RkA7qGv^{vV+|{-!RYb?o_hJktR2a4dht=nmfMu zw%9=#vZA&wyeWFbcXWz+`skWj0DaV4@^C?mlDV8NS%MDkLhmBzdSnffL_!x*->aIb z^9R7l(sE#itIK_ANtFE=6dw!A?;wK#ww8{qGSVAA^{b;m8ng*=pp;LTHi;&p`y4eR zDrMmBBipToEec#0x85#?Cl52R;o9o8y|-l4)ZQl<|E<9>B$4fK<^W6rdZIO)#poZn z3`mponUTDLdpGFU8Nqv6{TBv$`!57(x{g`kJaJ(QR1^-`$>M@3DSdmv41|P~@GTwb zyWq&?=}^|p{*uJ*Z;dnn1Pgcqt|CL{!T{*u@_Bv9Nf48aIN&He#2-Gt=fqy*T5b9V_GS1@q5StaoT>em>!l z=gRHZScS%}!Q10et8{Jf$VWCsIB6w;a4eyw`Q=;H=h8t@ZP&PX4J*wR-%mD;pOKlz zk}nL+HRgBX0bN2m*jw}r-OEot>!bfaQNo~(RLNSz`|#Vt25t!f zdmfHy{W`q*E?Xm;DkeFabsHkZ24lt!6}`=@3Snt6^Oun)6=dW-(;^!H0>p6Xm3mq4 zQq~YVc&b;@lkwaR@7$zCasS0AND#*@wtk{pi)aNBHj~qT^7Vr)_p~4KDl)-Ol|N!z zMu%QMUpY0qm&gO;iuK;EAik69O0p*-t1@sc0{D00OLYnK#XXONmx>OXQDyUh8Bd@e z(j-CoP>j^;@|eg{VH^lsAsrMjVmvsaj2}=Xl_pWw;}tjjY&>Fj(!W}&m6#xin%I)y zLRNM7^OebhK{GqQ2@NDR;-!&_vMLY$DVVT=^s|NaFgB>M7ypBs=@DRbc+m>$g6og> zEGJMrUr=g5R1lLBQ?;wZ(MT>pe4ZrfhGmKmx%ciFIzKBHY>On2|ATNg3E^k3so7&)}?V`R^3eG z9hr&!g%9{rP_SYZV-3F$wcZBY^RI$?V5rhz2mmt{J|Z{hN*92BH;)iY2aP{GDUz;3`;*4dtPEk*eSM=+uK{sSMiM70K} zHNpdn{m+Y?mdeAMmg7YVkELrITyd=dKcDrlIz8fDx&iWCwJGL06Pv(_+%mtGjlngb zzym?Hb*@k*gkC_=gGQ%~mf=CqWq)f(^|oxo{VR`LMdnf?*i+)0*lXQBhW}gZ@y@WP zXm$1ukN(t!CEm!sfRwT{Dc}S+Ne_VcX*%fZfq-~j*La-#YiUp`#8}$OJ4%|F^eySG zNt-fL!f!uMEBzf$TlGbrmlz~Ti8ue&DluDs zw9)L3`7xEE|T^fPEOl;qaVQX{@y2d1kMMtS@!5DBh zv#cdVoTOc5CTW$f)GkWn*~9a9XW4pau_fZHA(A27(}3aMjl;~RuUD??0`EpY;PJzg z*?ju2wubGaZ6xUTwbcrheY2nbvwY_#>#RO4pRlc8Isu;unni_q{v>hWpCn7*CH#!a z!FBA|0p2eyp~tOPToajY7=-*D|w=tu94S@uB!sbC)7^4x}u zu-$@gc%4~|oa#cqWcbkZ_pYVW$b;SYs<@ri#Y>Wd-U%+Ni!?X#uRpxX6a-uWpbiz3 zY~LTcZy|Zwg3lAYl7@*T=Nu&q5;2>{Yg>_+zre9H6PwblF-M3t(;qGf zeIze8T+A7KXFY?8n}4nA3U{YW>76w$sNC!?5V)m(G!DX!Q})>^{*+DqKJIwVvSz#U zl=oaJ&+9#@SrS5>tc+}vP-Z-xw?&vg4*ME(K%_DngE~ra!@uD*6s>yK2SrJX$%X1$ z5dSBu%g;^Sb(4K$fuu=h#)o<1_XdiFwX+au=_cZ1j?FHQtO9vhc&!5rMe0Y5FA4N{ zKhXnaAyS)DXh+b7y_uW_{!;q!d+IG8h2j4F^;9ao zAl?f$?!g zP~7{W6@DOKR&5spf-jR7>X&|W&2*RbX{dL_FPl6-EYv}ZwnVG;@*^w&&eA&Yr_;`h zUL}!cu>0EYOb*gQ(N)l=9*VvVWEHN}+Ku%AKOPxJ`1SKRW1kct&|#|^rkgi;oFHhc zqMQs%zm!~~q(1q@+1fbZHBs_nAUGsQ7%aLx+Y$ixT=#T`A}#G|6@1CJ^1ZWs^;7c) z|CxFTh4Uc&_;-4mv>Uvd&95cNDnqVyt<`f%dF!0B21j;!(`orSgQ;k&6)eIHp*MSH zM4>0q0QSt?#O0UWf_RK)(00)>ZWHT$TISn-o?t_(Pp)=GES?MT_X()r@wwS z2d#Udo}4z@E#EQj~h*X`5g+=@myg{KrfGXGIdlOa(AVh}uP>XV$m z!a~Z?rE+nqixA1hJ}1WlnTf;{eN;1?Z_u*Q$KeOwJQUwy270Ac% zrN63F_>|Ai`V1MgW^hCH`fmD>K=8bv6BavDIuOwl3aTJ6{_h{4Zv#?~Cp2k|29GE+%R=ynJRT_Sb~^9}?Q(vjM=DB+#(rmqoiV>Y+cQ z`*eZ<2cNrrQUIM=t94pf4=b1FKKyCpp=a>=xp^rc%+UsT%GI>4)>rA4<~?|~{&Esz z7A%Y1!n$o_kz0cuIum=sAAH`Ql}1U{GM!8a!(+AlF}HzlD4PkDG&jQRG|D|45!E@f zr(#Ds9zF9}U5`3HIqT*a(uB)k_i+^XqOl;FG4NfHSh^JPQ2InKsxyf7{5C#?N11cO zKlfM-klyR%H~Lb*v0IS1r~h&73mOcW9eK47 z^q{X@_9?)h~!{iQS64S^#6OKm(7Z1N47|kIdlq690+6*o_LO?66MKIR{3` zq6oA5~e|^lu-N&jH@u)V*77`e>V8`{WBLAM=zHlPhz%DfTs0R&{IGwmx!2;+bK@{@9s(~V%^j+93~y}N zI8h?Xv-5rtvAMJf6NJku(`6oN5egYyzYOBA!LwAbmJAh1kMkZEbCNT;E#r{bY;|$1 zxs$P;65_T9Ylx6q8NJ1DG59?WIK_`c!mG^&QkN=)D!Qwa$K9HLv{R)taK^8w`hmQT zQ$xAl`PEvcq&4pu4USs&;~ya-;U@!SDheXwMzg#zjnpDT9d4Nk=K!ke-v0g)GwJ+u z<^e{RieTwp@^& zMY)JwzXTqlt*HzDoRb_8-iXD>w#3#QrerPm1f!42ul+zyoZ1vJU{((6V6R!DEu|M` zB)N)?QhE-Xdw(?;()!5D_;r^k;O#MGe&g#WKN@L@(sIwfb=S(WAB<_SEU``IY#kVr z2)fwk=sdGF{0D+20?lF1)*Y(iLtT7#KU%kCh1QHyEfe&XBN<$BY&j(nsYhRV|lS8G55Q#R)n*~e%~@8>!0h)O2U*Of`(+RyB z3^K5%&~q-|ZcVep39WsdGNGd`&_>LhX)o1UJ0R*g*ir`5vwu}m z*A;cn0RmOn3SM!lb>6Y$BXwyH(>Nqi4H@=EaidhNm*OaQA|vNSF|FlcU~3!pC%Mqy z33Rj3GL?Gm3CFE&e@376ZxO{a(Zi8rdQ&;J77$+88#KhCm#KyR<@Nr6F^b*c7uMn0 zsd$pvW4OsESQaUDDnh|)#M|AC{51_|vMrA%~zGp)F@exm#KqatB z;}@@of9QCNa~WXqLo)E=H|S2WrW!|5&NT90bjoZ}>iCNL3>mICpGR+%Q9N>=2QBE=$JUA<@>| zdm;NujM->;Q^NhoiID(i13mxY?Fb2y^q3u{xRwlARt+JU@#8uAtNqxU%1H$x|L-I& zdSN(Ir(p6jOKWVdX*H}NQ@-C}ICvz?kj9b?m&il`yL2YD?sm1mtG}N&yYfHqAi1d{ zVvH$jgHf)g*xlY_B);>2RunaAKR{A5@?|m!4_PPdsQ5>FYCj@dG)^un4`teOWL^8M z)h(*jusZ9nh)Wtpn{Nu5AFV$ zrK6qh&ET0HA#ofnK2J2h_RGt!ZorZh72VngLSBpmFvlY@Au%QY%wGFX)OWipo<|=% zsQ+}3N6@ywnGc80bEw3Y{W;RY@H@I`q;_5`|`4&Rrg|dW2JN#Py1oN)1S_VT7P6XrH zQTH;Z#oW}3yMeFIrM-7zu*wNz;WVdB+9te)s%nM$Iuu-fgkIjR4zD)8UM&H7rqNAq zS7~bPefSnv^JemfP#A|Ja6k{wBHd{U1we20;2*lnp~)^zBd7CyxOevtWp#i#3|lo0HBp;Ctro3U!x=5niz}sKMyBiiB2EA1-9C3IZLPm-v_U1?MEXP61o$ zR+5sQ&gI%*uP#OG)^$Z|l0-uHwfF0m68T70P?;@?G@>IrU4wpj-iR|7v#5`nBHIYz z8|;&wF&&ffQ`x52;|C%=({kAYT3PC2ViM)s8wbwqaXjav^NNO|aCg|1E=r~BUyP?d za5T5y2PtrcP1)3PjDG(j1Ff5~tc%(ArT&7`fN!pqqrLCsknCE1L<$!0~M5d+UVU~O{AgUxM@t8*{9t#ZZ#%HZV* zDy#qf{PUB@#_Nk%jbhFB zm8{=Emn~+BY=2))-ua1f+26=b{gRYFg`H|$HWQsI8Pjw4NY6d*4a@?&r}FE`n?o4m zg!Lo&nQqDKtOp3wX4=0yrlRjV1p4X1-~>z$>L^XO;h-P=XMPN)lxZ4qi#q0tGX=js4Jee>=yyjyKSk zM?(r#h$gJo78yntiPtP^xX2FE=KRogr^YwObAvn!lKyw9eq+(=ePB)`FKfHSkLMt?XA;x7PF!kaa@v z(3jw%zH7-US&JRIpZ<$K`#Ry~>=zA0nn3=9PFDfp&3Ew8b-)aIj2SN*s*4iaQ}Dw{ zsOSWN`B$bRGi`z|6-eDrtZ#u}iY~!4A?Q{a14dI>H2pgk z#`XUdLe3G^$|t;n!>p2EqdK!4N>7%5g|8Hi2byxGPJST@vM|zrAc%HHrvE>bU4=qa z?G{xD32Bh-Zt1R}ySuwfxEVMfuO6EIrK7G1Th5jD|t zj!x)Q&_0U5N&gmIj>L-dA*i=!h*EDXDxP0dNucL@Vd+c~T}0T(@AVDJb0zoTwN8SC zMdWVlyWW(ja2yuSK^nMiM+ONAe%s>!9>gTq_9+G{ybrT1)e#22_4bPy9P1Apow?g6 z5)qu)v7R||sJ5@vve=cJ6&m;q-cbqGVztPL^YzxZH)8p)|xNiSRLTfgf z>&Ky=a}yPJ8b?xJmCD4E=+ra|zgANheBeViZ|$7{`@PZtugdV)s>25;shBY9q>Clx z33IST%jrfEh=3}%T$ls)h=H#Jey&ciAyOXis%6o5L1Q>dD0Zql4vbo08xpAWPWxJ^ zrpfTJZ;n&4;LqlJz*5@4D*GLwVQ#y?$beg*Y}qdqp%#5yeh*r=`CFM!X(WFZh>qJ4 zZ>Mnuc_lN;^vj16J+0zrV-og%B*Inj)j*EIyHP*&qu}lQpkawh=)usQP^!?=xxaWh zZ!(}H0{r~-YaX^+#CGEoHj1XVVy!gA%g3$Yw^P18MJcJUUu_CEC$<7gQ(VA&mp4m6LOFA`GNV6{x`}EH9iGg%I9}u%I#AHFQO%< z6`Cv3O^B(TSRc^L@5?RGjj>Cdl*5;QVVbb>fiTCQgyHjcd=OamREofo6p~9JuyjM~ zdUAjwbXX)&tYOIN_b44Zz+n6p*yQ}heI9@RbV#@ zU#T6T+g@;F%OX8Og?WUmLmtao&^e(Ir*`I7jE1d~daPVr|pzAAia{MussUIfP+ z4b|G1?>t=!K*i^0q=Z?(@y!J#53^NDN`Ju8^IMCMUAtB2>JJy!n59CaL8U0Tg`(|4 zVxc43WvPE*N>Ry4Zq-~2afVRex*7)O0rJ&cPC2}!~KkL-`ssi%SB1C-16Q|+*aF@(b;Ov_JW#Ui4pea zIi&S8c_cb7w2(;yR!XLt`Fo4G&)CI!03Xcj47HADLi#QU?Q*;fMA4T6IW8WvR0e5^ zacD|j&J@|2zRe+9{#ban1bEqQM2@ci)px+s(N=S;?wl6u^i(a%olu3Y5`U6T&_ZPm z;Mg+|ESF9`<~sk@t?S-+E{_)A9(n&uzXHUua+-8ENxb_&goOp(4$6y;HhJCxR+R!p z9!RjTSozjnP6t;uNZp9RU=K=+d(VHJ?|2Q@(t=n4s(e-^3LRo=lQO1<^V@_+hbw}c z0h>PS<&%q_XT~I%waV6Rndxb)wwWIFR^GR84Kc+SOIt;rCz(`73hmkONfyW(beC8m zP34Ovw$6G%i;FBPv__DK*$+Zu8{(7?(_k?LX$_u&%5XVRNP@!YN!NBy(E4j%0da=o z4UIJ{{o_R@;FC+#_<+w&u&i-c$b@ykQD;<*lx{s3cGRFdwwp9EYkLtZ#R|-nbN85& z>i1ecuDcX4F&LROu~Sv`l9S7Ihh4aEdJ3({8=2odLJRWw-Vky_n`Oh zDQ&0n2ER^HI!2;noj74TE(w}P=DO`MxpGBJj-&V20$RInn(v<@Y8=D# zHV6ZH%;x0gEKg3qjo+742rQdMs`Y4Dpoy0sEU!Tm%rdMQl`Aw2Oup^pe|@v=t|6`{ z>vnK_DN{}Umu(pJ{KD{;Q`AQRLafqOM#xnyKnrjG{vfb+Rl}Z_cUPwW%GZwFqd>J` z6&WyFJ%MGh$xn@v>lTllt}@ikYnVH3^%KnbyKde+*?}#*-D_5E#$!bdtX}r6E@9vY zL8BN~s`_kn>`+T|iwRnSWH!g-=CFwZP(UCxttnQy^rn>{_+(tXh<2+ z7%3h)vHo3j>M(9I6S|az?jG_*M$RA?!cyW2_ssr@#>l~D2NTT53cUMxXE@?FjSlEW zi+8IeT-ic?>_RZ4(9qPq=3EgG03~^+`WL_3X4|!mcIz!kUg_lAnUr%PNA_|K&!jKr z=e$Sbm>tGS=MH228ht~C{8lzZmu;T#VZFIAj~hVHs}lCqNcs0yygP2}toJ>}tfa(x z0Pa|z50u~Kd3c#~FO}_8g+2`#RHq2Z7O-Sn2C=_-CKkCtlEDDJ4vSikh@VAby(2MhefSN97`6gmwM2T+$Trk zksT;0?eA#Ew%OIylfI-cSw-DUlLZmI!Fv5OovwR<8@8si^)61g4Q?8a-Lz_snY9B} zM&4M999&L@0@Nh?4_e=PgQ+ONKj$UM?9{5?S;vv`#)Gp}3WKOZYS6 zU%fK3VB(dry6NTRM?$Mv=P5r|S7KA9E*;OYj?j1SzP*!|lF<4K>hk|HCm_Al-n?ae z+B7fr5n#a~!V~euD&XfK_5CD~Yh#qDs8xLqE<6EMF?LJ3ny{J0W=@5g%BM%Py$5CR zV(ZVKy53x8Y_2 zj`~o?=U3DBol@ep`mr_db^q?~2k$*<8$29SNtdud%)L1|wb6_Kk$A zXG2S?x2KVyEL>~yojD)gwG^oyc6KA-ddOu`b;?h9xjbjoE zG%}w%Ve5gP;SeBh&TydcM4|k`f0L)=A7;S4H=2zq9ojo%Lm}V{X{_7cSl47^H+k2{ zgoR-pv`axTsY%IUchk|jHV*y@x?e0Pbc?1hTL_`-+5bo(Znd99h+GujTl|RX*!9-v z&9JC$4|HEh27H>}6e%C=ZbYbOX6n4)7|T|ZRtVcK6G=Z~%<~c*c%&NNTz}~H?!}Jc z#-&VYns_|y!b&Sw`P!tx8>-yS85MU66Hl|FzgO+UXP+p}?*9a3^ejxmFQ*^~_PtRn z^Lsmj<*c_PHGI6mH|-Obk}3#F@1@f1sz{=r8~@^>zG$t=N|`%jMm!Oi!Xwqiz>`Kj z#$+asOM9NzuJ$#ni5LdL)IX3)l#y+oL9ShWM6Ko?Wq?!nXZ_c6(b1I{K(OMRX!YW) zI9jYG*{1Qll8tgeyscka0nI>c)8UmEzgg3g)2E;E6Mm&n+4DG-CbY`0!a*@!i@$x= z9CgG$(Jp(p*XAHD#T#TQP>&N{hej8OeLHLb?$hQ2EqzC_%UgVNQCHZaw|UTZ{uX1y z_)L_bNRSWL-qp=z70eOmP*T72+@^4SoECSx-QK;7Flt325mFS7g~V&+i_Pw(_Yq~= zCbEesHl35mu@aHNm-rr_iG=x+jN*u3XWVZhucI?T;JafweijnpQO_$P0>-1h19sk_ zX@{%o#mA=b)Zc}V@e&PwXOiW?N|9Tt?x^=!-+CXaFd=)~F`j1H> znr13}e(#>|?@}#7PGOL-b5<8)-gWlHIv&}cnu|_G&^8hNzM=L`vu8KY+zK-f#hO0! zEA=g+SHi)lihum*Wh78s5Lr?vp_rNoTowHp;OKr*ATA+QCb2M_&4Vai|DIFgL%ppv z7s}rOnmLP4JQDu$5}H^-LO8&H5)#rRHDsD3+>uZEA2n=U$)vMsHuxWKL7P?|q!3Th z{t~OOXZ0d%*Ov3VSu*YX8#vxxTZ0Wq4f|i~wI;`RgJI?v(YH=^STp^rS?Py^w|>;^ z=PV5_{vs%vr5cruU0it*W_FA*S>u%rT-yE7M4fwm1M*1#BpW{}kBQoTJmIi2X=z)OqE9Ee|){|~LauI)fi^>m9Txh3U7R?%+ z=O)swS0N5j**RAyD-oh`>jJ#|2YA|F2d%5?`RioppdG_|kj7sev{`78htn$hn6Qbf z({V7W1Qvg1*Edf0Y^dv3F?0#@fPWvLzssgTS{v=VeXuzpKKViK6uvHh{lCwf&%ZvM zAspLFNfGm3&u&z}`VIFxmI`Ee)v!(?5^21qC!O-~GTAJ^gbgQI(jUdjZ&16mw2~LDrr_XJ{2*{H(EmR9j6idkK(`&=CxPx<))Izqgoq|6(oW2k3$e#Y?8GE@3s9D8jgyIUe zqwdF?hj9`(IIz+ezlh}THZ$^lZD)S`NoHx0Ps zi8-rUluA5*~-Zd0Bv@*r}q;oQXA=UPlaKW3KIB-Ke0<22i5|ngf*96 z0b}plec_ZO(BsDm zkMz4|4o-%l++J6252mjm7&cjb%?OEu(dWSzj4cQoc(xeZORBKzqxu{bB3l-8ej^66 zW%ge|-(WE&{%^|VA#K!caGJTs6b*KO+~|0>s! zbc+cL-D=DcZb{Y+`F+-G=Ri3FL0=}eK$@+)$PqGtgk|A&ZjJFGGIr$iA5E10pAHbh z<%*_d5VbjV4nsh9A6jKL=6p`0wJ-dGmxr%^2C3}|-qGF4s;(dp4`f!iDdQ9-9G(kB z^#y=x+qE96Ay=JSy8UCGE%f z<)GcatuV$RbfL{e6#f6SV!kRJzTY`w20lDR(_mcB?)79?RJW8D{wUuMgbWnc`0#-c zv}#ATg!h$|GTt4IsMeR!GP>&XU0rbmwo29-77-bxDi*nKK==Wx7}~HcfJ7d~>Y$GU zUOhO!ipaCt1=C|SStSKPu0p$A*fZT5uT?~bD-Ycpm}!q%$7-=_n!QDVc&LOQcYrB5 z=Y9l8E`z=S1`o|bSKW$N=lFsV+DLvk9XknKND+eH$)__~^Z1VL)*{>CcNoZ(y~>Aw zrFutN5~NVgSyIV{gj z2f{Wh4DiJ6N*XBw#>0$vDowhp!!Q>h>>9k@;>Sc+_6}KZuUpqY*J7-p(rj*N+OO6( z+8+PLSPu(vj1np97P%)9_KOtBCRPTw>J}2Gd2Nb=HE1w$dR`LAd>qn%ZD@5FWt!(JD0&(j`)&hs55Nfh+-mmq-W+t9AlaN!>L|prMBOWnHyuzsqzX z_U$^FJeXK8ty{2_*L%{{mke4K+#wsDypjLi-f~UBIiZ%=S#fNh?hFk=5;XR#m#)n6ng?EXK?-xmj19%avRc=-77No@=21tHM zAUnxDl?$^Q5{x%%1$gcH=1eWyT?YB^w!x}b$b=us0Gtn`6;jR3I=$c$haaTB8(vOD z20{*Y_2fpN7~nAYSUq8d<)+4?cfJ*K(LcCiD%v1Mu*Qb>>F9wgj;SuC@W1BE`(qj79uQIf z`Fkm90>6GDTmPJ^;Njwx?Bcpx>{2krJ?Os^Ev|`mDqgeNTfFx?Mokta&?88_?}uqt z^Q+4&o36Nvx=G}erxD(oPNaN%!j|*ss-f#$vD5@~rd;xQW)%Zim~e}&LL6gDJIRa2 zv#{UmsPvU6f&Wbhju4;sgjVgA&x76RtQauiRwrQdK9595ZvBWiYqkvky0s0=4$hzi zvk5OiE{=Kpb%#AVz#Ne}g*bxFuK@uWn+u&iIwar5gXG0)s<$8TiOB{cnwHGt22`*C zp;X5NS=@~#akkY~$r<;Y#^-^xq7wpo)FuB&M&-qs73sCI z%dA~0KEbjaB&=QVA`bjq04&x{zn*cr-SSDLH!iS=Gnf11?r#VJB4vYcTB5Pe*Bid- zSwJ_ZGck>)39qop;S%PDd`B+JWTy0T+#T0}J$JL+unz>9zq56!-jmW=UZ!h?3Y)tS z`Z zSDV5wKTi^$ra%3xR?C_q!QIokEPPJ>zLTWFV_orWeGxuFX@ObdTH7#tSyYT-ae2~g zvS8J9F8MOXWd5S zBwwM~kHJ6U&1IwwOu4CW@;!7+e9`f&rW?wo68IM$Vu^D;8m4wzxpLJ6qaX!l%z!cN z&EK8h?l+d6eFoqhdAS&)8~Dr*@n?KdSR%GoqCQg0P=T?d|3n>NZOCj2IwxsVQ0%k{QIH{1&V@!~A23N6%C#fR66#es zX_qKpGTNp(kY;=IuL)?qM)Hr0(%qvCq2*CVb3v)jW&Nd#xD@U3T8Q=zwcF<+ zI`;9ZK|3x$#72>?HDP&?GE}bL*B(q?_TO?~Hp|ogJ6)LWzijSJfQ{?^zN$sO=jUSn z%k+Pmt$x%eNbl|gJ?vQhHhrYM*zJCHDqS#Aw=XX=i0~CA4R6vJOvLZ*o~Zg1Z8N4{ zwX9{Mi`f;Wa!&xd&!YAyP>xJ{X6l4Z!m+5pe{t0p3anHN?N6im$9OE7h=|kNX8lM6 zo{9=>NIl<+6r)-sol5c9jCFk>RjrY7r@0WuAgDD&GVY$I2x zyAmilPw-kMp*-G%^7Mboy@@J$EVR%U@TcpjkLtO5a3u4X>G1S77TYb@CHD`UCguQ` z)qQUAoORfG`i(~2YKwzHnI?-rKZRlZe@?@I#!A5xJwB?nQxCCCueFmz4N7Pz*1@lM zOqy=Dc(Sr9p1T%o%&Rj&%-n7Y8k2@)USyoJhB+$7cO}n?zYTK}aq4E>|*={B(gjN$^f`tWDX&$<=Lz0dpHpUjR9;n;7Ba!5M+n(ERk1&nALPZnS} zlGq)=(eaxjg7{ar;F0Q)vwK- zPMI2Bms1He=R>St_-jYn>Yiq@O0I)YASxwK%UcuSi|^`HuK?(O^01;d64-R|&94!= z52f!D94DB|8fUe1NsR9&sOqBe`<|WK6NK*1S1%UY<+c#f%zX}Eo-g-^ z=ZrmY8nW*&N)YL!C~<4_D$ye|3UMj-WmHC{q%G`iHMc_4%N~~duXJGo^hWlV539YM z-)!Ku|6*OlF|)tXz&_M(c_BrMeGi`lRzM7Iqs$nF4^c6`5=7;Nz5+vr74PK5dsZXz zwTKSOPBONLZZ|x`W9uH$t?OKb21oz0%{9L}I83@1(|R%p48%J zK)rZ1vB@AHNMY}e-DJWK@#n8-kgPo>Fq^)URi-#M|9IzAC*qCzAmS zIeOt-V@!FU;SgZZc}tCTb*apyzuRf-gTYg4ZH;w?ajO(9K%Ka&F($Y5TN$W)#rgRW z+bOBs7c;DI!O%#}UZvH-K^hBTv7LagDUr`|-flWJJXf`PssKz^kvHwzGYwlHFh5$9 zP<;4QiC`qBeMvKG-MV^UMX|GK7dQHO)s^>vgAYNSHEP^7J4?jg@kiY;o&NBi-`m)x z&}sH?&;`(2@rY&RYQ9ysC34B9de=5$O z+V106b)e)fyKkjE&&Y)oz?w|qvy(nO-{>dYT>qpD?}XOeBXTgcfgQS+O%?1 zhe5ZHkM^DU9JiayyN@vHviB{|l`4XaJ$8aNNH79z^-pW_x^XEEb468u;Z!Aq==@w$ zfoIi6{|!7DgXwxBIh9b4+G%Hx_?X!g$I$4?q0wcAk_JdV0Ooe27a_j@B{T=VI7E0saZ&=CO`0t{x@{b#&gs zcgM6B1>u|fryn8i&`=|P3;UR6#6SBl7`)mWk}bQ0YwZj09_1gi)rs5w{-nz>?z)7v z`>h;!aoBB*CGAriIJD57Y04*LiH<7pKiLBR^w-)Di0i`S2T0WGsMwP=Y>aV0+SZRg z|4$y{tWN^U*a&1nDf$&Uj}Vj>dY@jgfew=dvyIg75wns(@;+~n1T25@lP(hl*{7m; zQlF=#-eeAt;r`Vn@b~B6f$>!O4rd40a9Y!8QtKgOeHhwlK`XChKw!5|*0R?XHZ(^~ zr=#{S`Ta8!iVsk|{fPhU1a6+{r-mwe!`z9}=B`K&3!d`E8Z&xl9p&TRjo9OVKk&ti z?x0K;I?wBbL5|*b2gY9Sm(jvSn=HzqipLjl)D!YE*kuRZBpBDc07@P9d&JM@Ijg@A zr``wo#NDXc_JD#9aiO;HUevs^$X5OI-ioqztWVISkEWZV0VPn~4aVkj$uyW0DhA*;# zaH2Bbj8Pa>HL1>90h09-x$NTJOv}P7HP4$IZ@o1cc7g=gK9qOIvLLP5K+`YE+EC*ciD>wq3RP_S+PBoAS;cAY_8nNV5!B4b}{sNrq zT+H*g!8a&545kFE`a)is#ookV3XmP_O{Pw-wpsg<9YWYkIl_Nkg^iT{po%F=N$oy^ z-gsc0!CA;NX`U7QY2dVTQmAh*gKgS`*eq&nm`2{Fd#5@1uVvQrWl?0Uf&T5AP{EmN>`0W6P3&% zI2aX?^+NPe*O~LUb6Ic1!S%ag7|P1EUi1DTY2=QqW`UcD#73 zYvv0Rqo?%CoY(r7BhPAzCC&?g{*>#zm1D%iwWhQ?OEZn=Q zzd5ACCh^id)7q-~U~vfUqf;X;t3$rj`a9QXxf{9{CUCpRzc>5-Z4#DS^A~*PfSLCS zh=5Ur*Mjb9IdM;9jq4^qOc$*kCadTLE}p@;z0$m^kkhR_ge}O>6WPu;d8)?MtNS)} z1^Z1oIfm0(pCavn6a+Fzvr>TVCvlVYFz6PUMNI`wW9K@YWRFaA^oG0Aiwt1nYC5=D zlp)toPjb5I6e%ZL3)%B1%CI|fMtnYc^#{76V~?*|15=Uw(mYqECHq#KlID{qK&tgRFXDFp zgL5*oplqWVdK$IbIg9XizjXkFrOq~o3Xh~{$Z?Gk;9y8ohB5*&PW=ftyOI`N5RBRv zbMH3ZrRF4{CED)5Q(F5;EGfks@dGuk*`q57)U=HWB1xk%mo^H>&>J_@o8)<$1ejLWf zB44jAWs%{okT3glGLA8i^uF{!y~6kDD;#Ic9iL(R^$8zjqezzF|&M1EU$d| zDsU>ZW7i}ayo`{lt1qh6g|4ud1o@5@*Tlit$dFj)n(aK8nABmteeXW3BA|X8?2F>K zI*14|Ppy$TD&!)Q`Xb(x3R%We7}rZd8KbV-9YR?xe77LoQ;pXt{)(Pp9F6(A&?DSQ z(`uh*u7DX);M*djx;}%eVv#*Ep>-_eAp0pAsjNEGGF%wsJ!34H$*o;sp%eF#6z9_} z`h#F5Q+)AVOd+Ke_S#R>hAbbSPd`JMn2+$zkMTv(1f_lj1s{m0aILNO?z+VG(uU(# zKY9ABB#DH@ju&@B>u$2W`ZP;5h!1``2|6Yp0RswCf_w)GsF#xSqqEVrLr{Z!-2osM zrzXDO$9M4bx=ek8F!P1auMd<&8@fV?Ke>72D3xzJlcX$*Yygmn?9Wl|w31oG`=lfY zvvr$1vhvV^P1DY1{D$5G3C#f@vRwNKJLLlNMlk<^SW;=QmhbwrEA(N}U!VnG^uW9&c_yi+>1)jQ@k z{c&Z>*H51_&jk>w4mWonSz$NgW_wjDJ1YNy3a0G8IfRKpTHu+E-!2{dVHsTHff*;I zSe{y`cAS8G4`M~u{m;A56VO`8!wQ)0?lCBiCVQ9;5Bob+JKkMes6Zedc$knNl&eE2 zjq&LY0H!A8Z0-W~ske`NeQI+OTH?_>y;p7$JF##zFneLV>J`NQGLV$BS%dHD?6i6x zC>{UUx)7{8dzpVQf>J+|6V)@TOlLI5W&6l9V*ng~`|Omzc}AgY{vx#g=RtJc^2gGk znPOQ&cj2JYJxs_bX7jT09nb9=SJPEzR-|^3TO5K(YAVPdQKB0F)m>FIUBOr)7AvY; zuPAt^4uJ{b*i6kA*H>Rh>tWx4>X2*L!|3wQ0NL6fH#edBqpaLvRSGrbr6%VRa3e@R zO!&GaN*w2-6{=?E+HUQO+7aGXDJ7_?>5Gfow@BRQe!sOkj^_OPq$JMzD?*LR64hVu zUFWzHQ4r10n;q{%Hby;%vJ;pFSTa#b&KRVps-omvSYa4g26we)zB6D9@ zw4t*0gt7_vihfA?!wWGWfOqLE{~YoamH^XsS|JLhhLy(GC~}x$6Wm?nv8qyE)gpOZ zN|DGAZOPOihOc4q9$?yBgv@I@*I=UJ%He0nLL=NrTSS~vsSu4zY`F3GD0(bJ5n!T+ z@Sb}mZ^wQ@kbVSR4b)JlIc8f@A{4l@D0*j~=Dl*n!F*$^Zi`!0vhfih^!o{`rJkyP zavlGTFycb*OSC$AFQpo9t$Enty`E@D=<0EI`+x4klxm|W+1Z*(nlm9IXbxk_Cq9Yr zc(?Qpcv6OuxCsg?1pW{?A`QfV_}`)>Zi$1%D51tjdTC#2!HoBMBp!qqGB}gta71<2 zt=r`;V_iy~z za_BG2L(BPuZq(u@ey|Psnf*`LI_7NB9rDWl0wWZ< z{!K`BIghjf=u0Vty;L~$ujt>x-e53A^zN^&cDC;8-(48$_URu3WgUpj_HUaTw@pKWdi$H1 z3wjP(&N~;W3Vv2A14rj$YnI0}FUc^%o4*D{b_xyege!jINZ??>1+?DbIg}TbqtYKH zI_P@oFoV{4C1z_puHag)gB0w!Yl$qIUPn%`UppH%R-ai>&Ruc04et`lH_$NFE&>h$ zloo@a2@u%y>mlwx6MdZ6D+27p@EU>tALTQj`g`8~OnhC@CT@K$+cRe>e{6y4qUTGA zkrsLmD39I|`9pVowJr(Y%8V`}JjAu2HOo72FI63yp=qow`V*@*KzQlo08jP*5b6sr zoXklbjYikR37nK7ZSggPbQJgC8AWBCPEA8YTyMZyew(_TlFR*mCw*y#AqmggL5ffR znx-jdQhzHNPo#Oz3!DaluP0o^^7#Z4pmw91w3RQvRsQShzCj({^Xd(VTm*Y=5 zp!UM@$=rLrnCZU-4*SqdKmyZu)jAE?I-=FF z23YR!D~ z<@}5AvNzV(CbExPynwrMAXWCtiMFktUNGs8;tt(-c1>EcN1Jq3y_`Oc{`o|~$> z!7(@DID3D;(Noa-tGfX?IqyDpg%{PG2{banhdGarF#XImV&+u9!z&m z-xFoczI(RYW4Dp6%V)xsUNrDg#Rc^Zz$GIc0nb_<=PD2w|C_C;S6E@*V!xC%N5RdBl5Qt#wk~8VsKP%ynd<&ma1oLna$4l!PML2y09DbxoT6STCF?Il5jpC!I_F^)0X?D)p_GcKH znd0J!RZ@hkM4Q2*imh^IRdlPa&GdJZ7V_>BtGRmCKO*>@dZDi{JJ2H-(olOTRL_}q z@;pS$R1inMuK90KfQ%f&c(1=c*JitA%Tgri8;V;8m%2Ub6_sY9>of54`6sY+{r2%! zUyG0Pz#lR_indLW6fyR#WtZIeK&>M22#YCm6=>Jdv!ox~tMFPEEGqz{;sL8PlH{M} zbzxf+;1wpRR2dZtGd?Q!L29d%+nXPaG77I}!X^jbx-6tZ3wGTgoH@MJ659AR$NbK%$#=&SKn|@mcC2vwW4iY(I~vsSryeNZKaA zwB?hb7y0eV`uQtk2L{uTC<~VyEGLx1(}_BUQE3AgFj&@B&$8=e85mSl1pN3X#%0g`DL}mh! zY4$RRY0)ly?Xj(8J?hvv0LI@GobLsr)j_W1O)7q9YzmVH-}u1zA%kA4E z_C_6&zj<7R-_hGYMF!n{J8Fj&lY~|7Kj&aW*idrBz+nHL^~);;%t9*}ra&NN*Dn?A z#(O6uo4xJ}6ic`w^fWx?TVa>C*c^G`U8S7yd{eHV5Fd)fHspuJ5+Xr$aX`99&&;V{ zN?Vj%2m$Vi<7$?{?OI7TX7OXl#UF|7hg^@UfX{eq_qASvYHJUX4yvd3e%d7SHC@h$ zJT}~BFSNI;R6*tRAUXZSPC=XD zxGyYz>!m#qMfYQ4W#crycywmFIjFexyWl+Xc=`ZAy>D#a2qPmtcqOg5NtkHS@61cL z_9*#6*9NBcMyqI?3#6hH&FH)f(r>O$kXDtk5VK@Yn`J-+bTzgsN=X6pjDEk+!DF}9 zMV{hw`6ySdf;%H`PCV15d>w&j%&l36KicJysupo$ZjC+mwN-8sM1G$eIhQQNPHh(jQ)Ij9QFt#J1R-IueF*noR%@`o(cd z2?3{@3!kchxOHGL`P2b(}LvOoiwXsqGQ)Y!+t!; zOo+)){}M=QwXG5Ec>be^89v5^93@2q5{g(`DpvXwOE!y8qA-HB#(YYmyeh#E^mS)9 ze2m1^y);bsEfZ>BJNsWgaEWgI@?Wp~jN@k18jK4#mc;;q)r-X^nx_EAwXV6CTu0yq zVFrmd*;Vz6v%bE|;X{(LcN2S4fwA_5CYMi(h(!xXmVc*5>;KBEc>8}0m6EGL=bY^S z@JIe^r+Z}DwJu~&$iTnaOAW3ZnW4`-RWXyO7#ZVY^3fQpRmG696_Pz1?;nyE0@x}V zKSNHmDknR-Ax|fw?vocfCnZV66d$_2AUP(bm!UHFoay7cOv`wo?6kQNUPN%r=6xY> z(aZL8mMq0OV0%$bYe-xcuyxWdUsQh)h*Bn4p2vf$U_E?Mmo8EwFzxY7UzplX5AJW- zwHY~$!IP=0bLD*Wc_E9!*6aWE$D!PETNgR$5&GPrT6l=w`Mvgr3(kaH zeAE|g5?ae22q#2DFS6Ey9FW{gYLrlx2{q}_T1io|?P(o3j9+yvUJ^564&AX&BV=FL zWO{hdONr8X5xD?*X)-zPOYV}E;o55i@`h{tkOq{Ck&Z?S;h^uAY*Rt6@$nMahsB@1ye_yd>8nVqFS^BE zqSIX%r|DjveSa%ZfHSn7MGX=|uGgh1o&H+z)VI0k-okM>&*J0bMUe4+{=|^_l}&K( zk{C$0H9JLmah6Q9_c?5(^v8a>N*Hv>8W6PwgrcKqd405d<0CwH)ediWw8)RA3j|y0eukB=<=7Q= zTUCzq{*TMh4^H7_`O`wk>m`s3>Ma?}zbmd>$OvnD*{U{y#!9Sdyzfo=;3xalg4pgA z!yiwdW~9Uv|G|ZK9S?pskkG6APobi-o*tO0D8BKSPf0T?@Z5<=H*-C&jTKAY6FU?52Q0I+8$zT@K9gc7y))u8@ z1&ok=U9Sfpx4_x{lULU*{K$Fe_pLQzVgX7XRyohWkQ45M{{34qg@*a@cQpXUu|gSA z-jZojlI#GKI(1xW1%nGdBHUKv*e|?OGP+uCtPQ2VX6Y2u9SN$b;H$hQij6+_>4a2K z4&Ey6I?g)DEFt)!Y#b&pnVs=UyC2g=*B2b}pFe3faiLa*qZFlS;m1-h9(te*l%y#V zbY-WK-i5Q+r!OAd5=ru=RLyAdrxagrMe zW)(2=BSpNa$u-Y5f=deSK}m9hi|`s~o)!Dz2Q2@UUV!D98bfSol?r~*ZNk5m0cA37 z%V5COrtxWqVgHUA%?R}V7UXop7V+Qu7Az-iSB|4t5aiPkgJ(u4vHaZ%; zez(E(I8)S1B!$Yxs`BIb9T(qkAd6cGoRD zYG)PRrZ4;i^K{;+dPEO@NuJO5?w!gG>9kFG+!UZRyL2W9cX;C&)V`X886N%r$%er8 zw$JuH!@>w|Pl#QsQ&)FiEn%I?5#MVxtR_Q=qVR-Bu8hz*eDLwpwX%c4%Qr>#yp`y& zvGE=4Py+&El5A4FzpI%YaJ1`&zhs6FmLxq|Hm1t>d#{%fb=ve?2V{78NuYPKz)T6GaXUJQ5?^wVN_&W2OK zBTIP89kdbU-}6>!e2qBrlVUK}9aRZ6iF_rq2xjqO^9TqxkR^}5Pm))X*eVrY`SL6} ztd~g`ki>HE{8?Avd^>`9%eB4k#zbl;XNr)3uxNYvA??(_Fhu_8qO>bG;NvqSD11Sv zf8xO#tII3)cXLcbOx{?Zf>77^A5!8tVV@7@1&VfUMpfX`Ts&gQ)>fS09<>0BJWgF( zzsly^pejd9bYWhn5A?zoaNrfeDXb7CxZ?B%yZb8N;#)*Q`1avrA||1Ps_q_ z|J81nI|)W?gc$9rqfHd+VjlFt?AnJMjD-$r3s2aM4!_Ug<7qrQ2$<`H-!E5~K%z_Vn!VuEz zwO#3wPc-goU}jqS?qn=2MU$-ecZ)KDv|yHITHuXzb^Y+Gjrs96^0siR@b8{uvVX$M zQs_9K<;f^{KY16WN}+v48)C=2>H#j#=>sbncgO1${94-)9{BUpM>kZs(nGsd7lZzk z(AGsW<>bq6v&{h7vfOThfZV5qEIs_sbw{RN76pGcKztFFIN>~PMte>TWOnGgO7^zMKI6v&J>Cu5o4|EZc?Tg(^b~HpI<^HCDL+sH06GyT(|h5 z7gV)<^~|=%hsI|g3~$2B+y^7CV;a$PcCW5jpK*j%&!adwssZFSMMZVSaJUP^H&UfkW? z-JwWucL-YCrATqN7Iz8m?i$=J1b67odw#(=_Xp%dlC{^KbIdWH5jU3ZUrujD?!(oIgX+hQ2DDs$stX)WOY z7z@Da7g#gn<^=QSqk2L2i@hi`B`Z%y^ZQGvA}xdVN6KgeTM%re!=S=13GSK>UYfF);|W6YYvB))w{1t*m@oZI#L{#23a_niqn8Nv*6?1s=kn5B55y)ddGb7dIQ zt|$uBW}Z1}YX!e1+yw5Us*zw~ElGJRva3>6*n|O_l3{xOrkbqFQ$AxE<7ePjDVgWLh!9yT*f$zrw(UxT26H zLu$AK+7yt{%!piuzF+hWchI{G>A=9K{9yilhGCrwQp_*a9-BYMUx|=`LK1GXv0}7* z5N|?G;z@QGvc^RmlZy?pNd*&wM-9|T;v}hJsVP^v0+VHbS-7cP{?yzUnDu>77pSXO zsZKdg9y%A3mWeb-{Y*>r>!-U*MwEQ%3^nbkTpIWXTYpQ4WtUe z@rC-JOx=Ait@u5wurgjpa-rG+$%^pNR@dk1(`SAsP79_0B{&0+Ih35Vklz1H+K&!it2(?0=%g#7a7dXzEJs z0mHdzq^3!V0qKy5A`_w+-sb`}ff-o=Uz1Y21?-Zzxq}-xmj6N|UAI z>4f)^<*}5}w3JuEKj{rC&9O!>Oj{<3x=*lQejn25dpCNqVu!Ro`5W3=q1d{fB~}+< zXQ*7Xlx^`hmdiwM_TaAR4}PNPe3RYxkzmP&t}N6uj274*>`tmNJfu_|`DU}5hEJlW z+STzeE=fV5x4HH5cEq_sLlii9H*Za1o5u9LjDr+3_N}zp!P(E{tRpSId1)yfvo8D; zAKOf*NR70!34L^`5aaUU$aqUoHud-^)`4Bqe)|l^iZE@K1q$Cl&veZ0v?!UPTt4MX zHKB3LXaL^k^f|u7*BsrKP8YfzwtRyb`~9}tH(`4TP~TVBWqNb)yw-WDpMg0GpJ;BM zc&tls$A}2Gp?r?+#mcKtTV}48-&k8}mB$)F&Gu1JMk~3OjG`eg4ah@zygP3G2!DS& zD0rUfkN>SRUDPzmU6dFmFn-`No6IHsid(NN*w?=c!c#Z4FX&_;FG4b*rc&H`FP`lqfN>94R+bc^M`hMh zZ&idjG4$e|8|vR}-&_pdb7f}lar#&^X1mm4-XP^ES#T!Jv@35aM)sR|61LmT+}QG1UZzKl6n^Li z*qpan@>A>r8pKs!wZn7_Ahk+8sAG%Z7ixt}S&%nV*u=1Y-u-^{qubI*Hh3siB5wMd-!VtwzmS}B0qq$w zP@5$O(?ox(76s|>z0_;xC1Mv$>Vx`Tz`9(&$5Q`f*g*20poBAp3~ewhF2bz#R#odJ zSLF-L8uJebn_^zg1!Vg_3qL}SdqeRxR&STO2L845eJgLQO~`e&_>ggvfB7OcC~mZ< zFPLwpPmpK5^o`rUrmOnO{7*pIq;8sz)|XUw?WMyKD?3h4o}CpUW6gU7ZzGdadG)lS zEPjVGOJsLm1f>=P#q__eK^3lI4oTunF_hltvGSbcdJJ zmq^cWS!sYMDJx;KIJges$ZsDItB!AUb31MZV3WurY5$usSZ!f-%(~2wDL^-Yh{@2ntKf_oO@_OSM zS99QBLg5inWF(~ae=fx6%J=Z$)|&(4eTcQZCl=>2em?t7)n@F@Y!ct!2d{zS?oT!J zIxel%k?3>SiaK6XJUf5c5-dCZ)^AP}&R&Y<)F?V(KK1$jhdX}V*7k_;sS;2+A+}`u zK>3YtpI6la$d70;ky$bd?Dqe)c9Y@`AZaYV0xIeYsJJt{?swiY`59NHJ|7xP?Pok5 zc6wLtL@%jy;)?cp^YhbE-LW?pdGQq&Yqg8!3YPNO--RF}o=IlH;wkm3r;@`P>)UQl zo$C0O%`s|ayl26?!e!SYp4spyo}CLr^jw>5)$dxfMsVl71O7fh?>C<_Xm_0u>0g0e zF&JilzNTPe)D-pPd{YGNlk}=fgQi{f10Ba>c#U=z^blPC?I+b3C>wwaQAqlwAQMwW z&PUN2U93zbqdRnq5v`r0{K~D_Ey2eBX!*9^U~O*+UA0X3p2nhq{;T{!$AZQSROBSC z3lPJP%Sxy1(6T2Z#H+`zxB_-&%O=C|iVX2F8ukhbCY1!3u9t?&i+dTlPgzf04+-D1 z!*0msG2=ZB^t%sZMVo_X$ez#%$G;rhM*m=By^Ql~M^SpbP(;3}U)IwjC2ZiVFv!e46nq^jy|Ksc;S)}w`?UG^bry^0C~=NQ*-PI(CpK|g&r#2i0qL} zRayket@>Uw9P`Qqu|wtniMkr!MU{F37VL=}OrzYSI~aZ2j+o`ZDI+F6Cobct$J#7i z$LBT({p`A`{xn#F74q^fo=`FDSKKa#?QEEY+h?~<0=_dR9;wZ~XG}8@;M=^{>JCDz z6x=*jCGfGrmizH*uqJsQ)@aXPmfT|fYKE32b8x~RNes)+{ za@kX~{-?|sCpR#yj|xkdAV7&;8A2Hmu<3UVGf&_8pbr16ws+Uf<=FbTK75lU_~pX0 z5aC)d`X$Cj&UP1&lf-nufv6_YZHiIT)z+lmGUI zcp#{0zsa2ZgHE{#Tvpho_1Mfx%QHW_5o3bIUKm4Y#-@~448=IGlPES1$0PqUOL#_) zWl0bEVr-8fRe+GCteya?<3oQy5bUF1s63dJMRXC ziClHr_6aQG=>YnFy3qNB8V<$ZjcUzru?^(47L_xZ8P&<9dKcSk=?mk3rjiAr+fz!< z)r$;ulk|PvVe1OH`}PgHY%JYtUb(TiZ~OK-LL&H0&5#BQI38`Eyn0A6QLl}G6!^AXKKBBooG9Bj$AtL*u9a?^E$IaR`tV7tPR=0I9 z@RKf944Fo{n!?;m*~3@aub>0C1s7vrc%z;w|yQ&@8KU9vF|Qh4Zu$bb%N z7yI>8F+4?bgVxJOl$MvG4o?#)cY3H`yw^o&C#?Cv0$sqstUd$9;py}B)A}0L2z^28 zg>g!>V=h&3skSHt%r%I+VJaHapAe7%@P3SD+7W1CTS?9u8C(psn5`5iDBg~pf`v$F zEmJ2au#*LWvZu37goII_CQdTA!@h!;f`vdhUkex8Ebb(Uh9kPD%TI@vx=|R^zL>`S z73J-myXy@W0B;{0vub_0Cd;x3U0+eR?)*nWYO(gw`e;wKgtZu_YH1xJ4x<4&e%X~f zh{KGiy7Af&yh8#D^bB0T@J_#`;`3M{102nuiVW>HU$M`!gv%?`f8t{54|8=equ7z| zVmB#Ud+i_AWb>7hzzV6-fS>pJ@tys^p-iZMFpT5?+{e(&Xx{uWI(LA8)4eYcnCc~* zT+POMj@jlEzyn+Ly#KAo_T}1={Nr|QmW4FJc&c8h%I`+p+Y?eHKa`G&1 zFjLmGC`AFmXj8!OK675Yt*p|YsdZ=CJ8Eo`xJaSgq>_{ofls3d9|2<7T;McXl_o< zIckIlMvAK4D3O_qbSGH)5qBdu?XmD4$I1_f*KB@o_QNr^C`Ow{Y~=bWKX8qD8C+43 z4f}y%L@ZKuYvrsx&Wp)=ox@b}+zE-3z-BqmWOo*=2AP#;{_H{|c?-SebT%bQKLkw` z5%@ot1c!`JyQ>Fi_F+B2%o5XlRkHi^ccjT_%DttJ*4H;E@er5zr5?Xs5c|7F)uYvq z5uG-mC}LXm(K6#03BzSs9LyjKopwMLQzPfPm(OrlqY2!w57Tp=#1WX_-qGX?JXAv& zGR^qAoF&yS?=0=61sB*cv&FT%y6xOm_mg$eio8 z6LRS`i}2MOv47C`v9wE6Lc$R=ImOutTPaWVegNgv<3{+wM`fMWs>Ts1&KLPgs^@6Z+1b1+Xc-Y54doD|+M)Lh%;6-Bru+YR)1IR!u;tuN|MW95!%RwEti*)2ph`hizZ-o)*9><=oW^ zJTEG}&Qrp9x*7o!Upe_G!#b>*EWc?uKOKFG_(0qvlC$s;+q(PsTBLx(ieL85Q}nl9 znw(Rn&TV8q9INHxWKG9&D6=mtjzZ}9&>t3Bo?%b&@9DC}nFN~m)fMkna&q53a~Os` zeazt-O!BiZ-v``;-K)16N!t12k+-d(wm+J)DPn|?j4qh`#N@zUO1dsK&v zkZyn5dVyZ>+-)-N=yqqEtyqzu`JZj}*yUM`0NGF?mD3mFMWfx%jkJFpGiE`K26B>$ zbbpPEC-o;pHGrk0VaY2oNJf%Z)b>9bN}rlR6NDrBgFAF5Y6dY^{C-9xy#0TmV3)6J zr9YAWP^99jieY7clMaWM(je3a`P^shEEs5v6kgqV#ad=~K{QQsT!E7ca_L@~-3;aR zy+-^EbujMR9Na}(Kgee zWiNLN5?35WizjL@!?B@qi(V2g;1X*6u0!%J z5Z^_`A*Rt~kRxS`V`x?g9v=TDU4YoTWLgrb#OhYDTrc@Ux%+h;uDvn#aVhfgfH=XsBu_=6B{z`l zqyqrCom%glzpJ`>OJNS#G6Bxp@|E9N8E@{|RzZ3`=Obe2cUfiI0#CvJnmS|*3nXJh zjcfN0WY??fs6QjbevhKC`N^@YAo9#J?bp>l<(JuA?~mNjiv7f{X;JE++$g1$A+u-~ z^HG=IRZwIg*eE?J$i7sfw&Cw0SoXUH0$9p-4;#AD#yEM+zv&mvJm&V8`ng32vH^1n zR&wf=GBedEx|^nV2@9-gTT79>$1P|Z7^FAvNRuj`_0td(t*|mNipFt@p^n1NM!10I z3o+z>pZ*Q8qd0^dr+c^A%>oDI*jK1!?<3S+$SZfL?=>6zU(d3uTyEQ@lNlmIWhT#j z!>VeH%`&lB6v6wXxrq4&5K$AHUorzfJyxj|{Joq= ziU8n-v~}ftE)ZXvxm2yM%ZWxPkAr;Hlnclc{6MxE7t2w;{_QH-%ey+r>gj`3RjdfK z5H_p%FKNh=yY+nZZt&-(ghMzbWWv`E6%s7CV6DOc)3X%Vx|bcq90|MewH)tjW%r(Df$wyXs4AiR0zc7>|$pL6IEJDY1YgrXt!n3-N)5Vdr z7(n5^H}$?+H`DdPRkH%G=dd$()58z|L*qfaMvBt-xgTGwkgg6j36(h|tw@1$x(;((O)Qp5%(d&^+L~x%pOLXNC*LplCi|g0@y-;1VFoad z`iGle2gOe@`EGAqD>5#^_|o}pf7+Po4`VST>+8n^vaN}oo!*TaRJl^lKI!FF5?UH3 z8EzjlSvUkeuAy4}^$hgSx+L?go9rQ){ zW^ICvyc!mEQ|xtO1&WI>`qjBYd~s;ryW6n22rxA4-$0fqbsn`f!+Fk!WpvhO^V3gw z!AEIYMnd6El;9c+$d7Q3io!%W#-|Yp&hZCzNb}5|f5#ujlv>4No!0+dYDE(-S|P5F zBtn3h;ZJ`wur7PU@c#fcT!v=7{ifC}xmdn<3T;;XyBj!gctW zWTUesR5pdv>c%+#jFMo?A}Xm)!L7>(zl8NPkb9|>Ifrk`J~z)${wQ5RCXw1&?=Gq( zQAfq^$6US8re$5Ry)^k}DaI^dmh0_v5lQayxtPD`OZ2yv{d#d_`MP)3M`^?=;da#yum-I zq0zCk=hb>ZJ&i5NQOmTWpFeB^RMt#oS;Cmgg_AZO3c5qV!dh<~IbDbkkj+heJ5ql6 z(kxh3@^Mu@(LUyoPE=RNk`9YjdrX<-*6DII8kT9*`3%dUSohuKhmG@{Z{ZAU-`|V= zt|1`^M&d%w7D{+)ijbZ)QZgI)lKI?_G!Or4809HFRosQ`P)BE?`VIQr+*J;m_do~iIJ~wyk>h-EDeiz6@qu6z*GuAY4K80qeiU9!AZB5Pg75o zrU7EMK>1g5%*}mtc&cmKb2^_C*E3)*5>g)Yzmb9q&6}K+lA|6H1Hs z`ZXZbkAmW>BfFufm8!{)hX{s0h{*|2(f*)Adq9>}i4&(iCQ*8k7{cE!$9+QnSZ9o1 z!&2s$SzFuSz{8jVZs+hkfpO zJ^PzfTokaEVK7=9A;L97!Ll*WyyaIm%w~1cPi`3@jga=2=g0V zvFF09TpPT1AVx~X!{0lKZ@4*%U~b`W6b0?oZ?NdDSO>O9s;P$X3?9!2oIuR%WSRu8 z-X2y_?-PQ`f@9nV{$I6dem3KT)>F7S8rs!HutENIprD4aS5AjyKQJMJ)=9<*&oG(- zIkx*n6Z9KkG~%L>m-8_-IenY1seXd*;v%pEUOO$FtbQ66BWHoD=bcFsyHm~DFv5Db$5qRULlHA0;_d%q zqmNSWNd{D~>l0I~E3r?7TL4wO(jNFV`kt@+c&j3~iT0kjv!HG=bMKv(D?L4RXPWoX z+GfF>=FJG)vT~HhNlAlyAw)`hGl#-N=aAVH>`j3+2uRpZ0pTKJ^ZBAdXE20XU^O^C zvjOafLnHZ{ozsLY6)q4~s)PS2TwvyW!{TY6_XCi@1D|)Ir$ao&qjZ!rUij2lo1gnY|yP%QVD@`GgGjl zo4Nz0Yyr{}3Z$W-_fhBybIzg42nZvhI&7K}gFH@t%C*;xKDV)2CDmCP7{b6?1=o4A z3PXM=2kW-ns#4_q0IOeLIuJ7v(H*WT*W8tmG|8*J!VS!F$zaOn2H;fhez_+gxhUn+ z$L!T-ty-(bb=0*LY?Qyrt846Q+C003mP3tT0q*y|sO|VM*D@GuJIv@3dvn= zah4D2N(Rv#aCF5ZBX&gGaBfhZ%mua^?V~tX1!ypp?NoW?gxl_dTRmNmf71q(PMkip zqWU5@-G2s`Qg@UiuFmIUj$ind+$9K1P2~z#&Vu|Pacj$M#?=D>!qTMX*$R`Dwk4Ax?CJJ|IvjPb9dcf@hNm|q2g5f2c_cC;Ne;PexNgc) zTQ`G=8{E<(lhrZT&ez_D-p=>YE5aos={B#w%B4&`k}&|Y;UxenK#8nOO2`k zM2nUt*^=0$67=wu$~i2B-IKsiBU7-ss=DWjf9o4H4#!47imdYK(qqNZ4{b0RZ`m~O zpvzC*Ib(@T#(IB}VjmK;ANqF0E~~-sPwQ{7pm>%u@BoVr!{pVRVa`8+0qSm{UjlX& zC}Es#%#a5A3RD`U3%-P6lwY>ZrLu*pes;g09}YqFooU(XC@a#aw}|%CKy!)$gTni> z?`!PL*PsEatg#DqkLqO%HH%7qw&)`bHBlF-kXvN)(#xJW2b?o^{b@W%i2K0#`{wH( z-QH(?5lU!=c+y;0YLnP|cB(6v)aYQ|F6Sv&Lh%>Hv^Y0#5mg#woMO>@IiIq@yL3Qe z(Lwq&qG4-OZ2CMpW@xpC+;~nTLm?tJk;E1P$kE0+S+EbD#<^~cCdYT-oOv#&_RDn# zpL#aK)=BfnthL_p@U0*YU~BkO6j&NtWK5Jt+mU|1dC1U`U;J)Ocn%b-LW6{K_{F@% z)L@|5d^!rD$2RR5%P!WPq(Nz=m({e&2SzL5`eH%F&+F# z+D90S_~^xAZn)ZQ5Va4ITqVb*Z?5_g##dTXj2%;K;KXrMIG&e2b`4Kn&7H^m>r?!G zpE#3#>6E9E-e5i4ZPuWW4llh+v{19!CRw>+Al`z?XZNqT_jE-Qk2^gG!haubjbHIk zM)^I{XW#JspBP}R;w2H7CMq>9c#8*#=_S2nB zqFkGn{8tA+-@7(%4BLXNW>aDX0Mv1jz6M<2c7{|t;L09_INP7Nj@a7qo%cpn|HhT| z-uqbf(A7haGcCKg zTIh`+FCk$qi<9Mzcft$j>46JwX#P~z-%;W(w2*ks8pE2e9{@Z1~!mMnKY zTu-D(VN;{@d!$}u%{aU9uce`0SJ{Ea99SqgwGN*ePbjS(hoFC1ePkt80=L(-nT^9p zP<1MX^3<^w4;OEO@4-C>tv!VAwmyaw_AO*|c)%#3GT(t8j`q4K_*SNF_tylS6o}|d zP2$uo*FL_-A~>}9|8RPFl#}D?IwaklmKI;@Rh)Xe87E2-ql80Jbd?XvI(zv4DQ?$s zY-spyu}wIVQan>ldOMz{y1jr~im$_*8p+%@P~+0l3WQf2-y3oC>6+7V>MF_dFMEtije+ocsr3k`TY=3rK8xP6LL0qtF_x-5~}OB(%| zQ+nw*R9}^K-R8BPz;qbHiZAE7Cn@?`?0%2B&h3e(IFMtOe`(R~)=|&|zw_~@z}C!+ z9Ly_v_W@`Xv$d|(l&<1r4Ty!gU>!DKn1OZuv-bvQcek%wwFce0)X7UthT6oX{s7&@ zBZeh*A^=8qzl5gC*P=47-}9Vx>-Tsl;mFiI6NDEO_TATya-Xerk7(gSUPQzW5G7zTtmWtac51PAKAwA*Z?+%AcH%G{V*$a_;N zve6{1#K{b9r*a>wBVRuy5Ktc@F}QTPw{b4m|nRr$Otr$g~gz{H{O!VHJx z$klme2tt(vdiF}>l{;YVE9&n60+2S%&f^bIhcICs_kM@xaNt_FViRN;NYSQ-Po@)>>S4ZIbgJOhElp| zhvmrPiH^<~&zkR%Z@OcM5XvY2c;7dpQM|HjTKy*V>+tae8%WTMooQ8aq%jznULbt8 zt;#Jr?Dmg8qJ$V z(MnwY_fkC__IJ~ELkbEyytSkDX(#??J*RIMBm&Bpuj|B3SmyrBOrDp~cQVZ+67q{@G6?ZS~e`8CIFdLHXi|D`1Twj^u4$x25 zY}b`p0uV@UxhzjN!%b>Ii5xU9$|*C0@cy9h7%*vOsSPxnm|mRAI(!Z-hK<)am|DiO zM@TFMXEq-GTDJIab`JUc`w@O

  • RNF%dJTUw-L}Z57QwqLuYoqhf|J1?n#%G~@lJ z-`^FNn`YWlGK>#s^*`l-4qJ%CM555eQmJK^@7fTQes9>#BHjse9M5(t9VHc8BSmpn zt*Sfg=B-+D5abKr`n5;1F}08&AN1ia!7|(B(iNljT?kLP{$%wF2&;K%eG1RwvW6*Z zL0+e_1R)&xdJ})T8i!Oj0&95tOC&b!&aUyBZyE|OS;0apaQ)NZ(1f-KG;NbZ0kQ^0 zwM?b`^Wrt=VPXyk0c&?>{&1-hiS&HmLL)%bI&p?XCTdJxV2C=M`g>(n?I*tFLtb8z z9wv&nWbdwqhO*gy9aMmU+)6V`_Md}qBKzpce+h?qf@a{lr#2pqqL=RRQ#42 zPw3h#Kw=$ScKxj}lAvAu{OnEUSBnxql;%m>y1 zzo*wzIu1(ziZ#Kb+JR41^y_WLmm3W zq4>RzXiV0YY=s}CH4o=Y6Y=8Z_bnH0e5bef*rVI;+}a5&*_0YNIf50_@~twh#@amh8|Jq_wA{vEkhk-%G4GnGXT&$Qz2 zgidZ%$+b88!Ls0U0$wDOW7QjL0v!8Do>v#Z^b-v2S;qL1K&y0yt6k*_9!Rd~s@ZAc z)L)L+H{=HNJFd{IXJq8nMdEx>GPO3*&b}3O_*IW|SAD#}7PY1A>3n85j(jBBDpB1WUX4xb){klkK)4}ZU9c3b7_`}mG_?LCGbbz;I5 zAp;>A#?`2Zc00B}?ALGX>calrUw_2ZhD}FLe@6fE9+l@>PE*dxp(oVWJECKt zfI%YH z{S{YSmCL`o(z~i3u1*>4T_`5%)RJ(fHZuBe&)IQj`2{Tv8dflRZtOm9evoxPOn4rq z$cxO56iRT__mkK^vMr1S_#c~nUph&6uddPMy1L;PXDb)FCE?1P&5#lyl%fFBwX{d~ zW=r?}P?n_!*~c#k-fK-E5&QTYHzYE-+-{3HHOStVCWR`=AG1o{4?QTedQgc;a|A(t zDaTN6y*UQ{d3sPMQr%8xe&K;V+RwWFpJwc;%Q(uXtJ!&JJaTT44h#fO+1wneJ{$WU z+*#&m&eA?%*`cA64GHPpq`x>wX(S?X|D4x646Hj$Y}LQ!60^Q6bn47`FM5fgZ z%0D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

    gM$$XpY$Xy2878J($!s-aXJxZSjyrXj{9Gxs^6 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

    Vp^z{B!|M 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

    OebwcD0>jFTE3998b8-{sH%u=X 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

    b_PSY8edW0NxfR& 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 !|oe3e;v z&VJmiAR`lLbKh?5Ym%yM>oLt*|6)gin847CXU0D+0!JoU*fqs&^GM`c33nvx;dcPd zdT1%U6^KBFt6+^6e#lPXQ{*OsqpfO;bM1qz#2xlb?DKB!vo8`~8~Ep}Zqd7h_!hPn zbfD|*+me~3!}BfX3V*Ol)o}6++o!3y%h8%Ib1!E;y|k*p{i7qkeZlH@4qRRV5gzf< zxh$fPJ*7Jro_J~M*5?fAafBQuz1Pa^)mn6=Nx!<&#uK;Fui*WgLt1NFF!#tcCuW%y zE3d4Y&j5CMn{T1qlanJKzu*Z0&DG^L0pF??gxxXFoo*B4x4T4i{3h zzPP<<=GVJ>UI*UVBW)Ng;7zJ_hWNdwvY*I+0f8WLkb2~SsSTOsW(18FT%I~s@rbQgOZK&YD-pK(F>8e}rpme-p9h2$_iK8|>husCuS^##iT{uuKOmBZL2_L$9Z^+Nk)d2a!=m6y1UZ z?y?cV9_W?YZ@5FL%rbZ$l(o~ajZFv1!%m_+A!2ZOst|OfL|;8Cq4`Xvo>K0gFbVt4 z(1f=(urW}e^E#B1e~PQ3Y}oe2H_{Q6GrrhFi<{cGE`5hS*DcN@-|%fgYEMu@a|^TY zanaluZ#7OWrBqYEF+pv9Z6E}VUZ!YRQk1-0IRe=6Oxk^( zhIe}y(!MZrrfV{Ys<+D>2H{VMMuf8)Tf=YH-sg@!uH-&(;^V)KS=Q0(@vdzE>#$cg z9Z?;mvQ~8KkuD7CLZ=~Kz^92xz`OKhFb=RHGyEH0rGiZ){%CzINdcTm^!V` zP7Sg8kyGbw7@XxzmL698)p<}Ql&D@_49jsur1DBVC!jlFSi9eesXTWX^V^0mY@>Ll zgDvf(OUp!VMuQ=Bm$z~Q+FsQ7={$^9c7~(gaQBmDc85XO`h6s~KWA03sWy=8R#V96 zraP{1%~i6z)O*o!iDT^SM?vl;%-VX}Z>Q?Sn^V@L$7!F(-U;pD0V$zg|Nn?B41!%v zj-bOE#c`1G#Se6)(l&XFUTdAF&?-y?TFB%zp@K>dXq9l#gFEKSoX=PQi$<7lJ>pwK zz?GXExuEk>O4qNW=;(@0N!knET$zxmEEfxOFA)zd^6<#l&k>X$>B{HbXnjy-r3WI? zovl#3jY>8C0$^}kAXFxn4wtKrmvc&NH~kR%*N?r;Dhl)Cr&LQTUN0JcC+^GwOHp= z1Yzkb)aElpTH2Zi%X&Dx5L+tzQw1t+VkjW{$&?!w3JMESF19S@m5-*1jcL`0(9PDr zGy00dn(#YH^+(4|6QGy1AY>}Z`~3%!;}}=q8g!SyCq)19+)U=zObE**L+V3b=f_F) ze}`{!my90n0#xOgEht}w4|*seJoX4Qc{flUOK>^v#UGH;3fORkti#))*i~p71AY0^ zVYB4*j2rK~P_9A{y~0Q`-eK}>BnyBr;JDnYymXDhTc`y#XDJ#{G&^KlBqS1Wt~c7x-ZWMPp!-5- z+3p40ANqB3WkuHxUVPO{V z`Emo9!Kd^Xbkr+N=KWI3AH!&n{_=AG(fZu^&z9G!+fP4FW_ijm`OmM7x&lIn6<;~` z?r^3aMSF@N-*mwHr%aZ~aZ^7e$jyWA0vS~6GE@e7U9}ywJzYYRTy}}nQzBzDQDudq zYU8is&2m(+3liU;s=nk-yB0G}L1X*~m8g<}2-rJJN1e>pVujT&XvpxeWMa8gHF}HTtDC<47-@ zm&<9u*Kjqas#6`EF_2~z{q5wBE?(=e`)Wi<+37A_gkDrCL+t>TylE}@(_Rx&5cI$E zZn4h(B48UsE8Hf>RMSou1krDKs8xFoB zaDKq3Fm$~3Cm%N&`ldu!2}47z`0R;BlOPtncn?m+d8qUymXovaXvEFxotNkq*@k4 zI6V+jm(r)gqsVlm1*NxD^$Jnd%vTKlX&1LWZ-89|ZnjzReO#QpQ1{FtXqSq2-~O}M zwu4fO90YESQ{tJin#A+pLBHc9PHYFlSS>xtALGJe%?knJW;xUFO-BB37mbMK*=?j* z1Vo-5B55hleHAU^LUk7&)K_b3E8tzeGKh$ti8yF4{lNXl*Xi_zrnu`x#~gR!9Wzp=9uBJeeUCcowrjFwb}|D&u%4NcA45PDE&D4a<_Y^VpRmSV1BwIcha<%HZ>PmD z{n?@H4k&S{Q&qN@VB{3!8s-rF!$)Jh^?^5fM!UQ>hlhH_#MkSOBARBug)J(Hq`sfx zHUs!udmeBlI24Y-8)2{o{8##hc`FNgBrAA(hrhsmaTkqr{Zl zTiI?d4u1%-`dx+wR|F0HRe#|uKTfqS9pZuI`peZ@SfAm3=+d+*^d?$t+omxmey3u) z+m>9`o2FDmeDdusAC6#2Q2~r{MRk92N?(kQoh<+Uy*p>|A5_Yfz-G_IqZ4hnv`;=- zqu*nb`HR2-gFIIBBiSNnoByJ>I(tpLB4IoWu4`RJs@RQF-_{18YctL$Jdx|HoPc;Tf-41nUbnv~OIB7cYn=;Ba7mz8t z!ibIk)N(?1HPMIx?A>(uW}p!`K-DqFQ^*5i{w*IDGs*_hJUF;BzKya26}h{s&<6hK zU=VT6e3N{%$_u?Ie;g!#Bp(sKcn;YC0dH54r&Bkqz_A}kzW!&#ey`roGM((yl;L)w zZFXFxA)(Vr?fsK{*Ox{esDI zBE^jp42e7vL~1e#^EU;W+2gs8wTIp#tk^@=(ADH*lg#oTF`)FbEzb8p5G~a8cM!7z zNCMaVNggraJ^-1wqi=UDRk6`c*ZTf^E}Co&q4CwOt*%A-YW2l=6v}dsp0ADpVvKr(a9CFeTUvBYrXnkgo%kM3^mh9GP2P{FU))$04bwZpk1 zRWZqqkETxx8!HQp{@y{?y!ciGS)LQkj8hs`8UCKdn^JJ%I5nj zlM}VdJ^;9TErH3Mg+vZtmHxO{`Y-@s|bc|d%SmnkC^OvU;N$PMr`J$^(ds@n4MW7(JRl+)$u<5&}7;fD4a{4xA|18 z$z+cZ#XFCS?4fylXuBhSWj3t2-sX;qo_OrMpG;?r7Bhw8tAY&(Q2n>tihQCk>a+_; za=hF!GxoR|fF)o(UH5@I0@1b7*a2z;#0yH=?NS;Plz#*s9eqcPqG{- zOs+M3=E=!j^=o)lx%+=x*3e|T&^cn_ir@u%HECiTmiZ^@%NdLHR|gS?q;>=c{4Q8v zAdGUf_1oxv&ZQBGcO6;PYGjkqeigYyN6i?Mto-0v-uhd}2grF|>X*`A5I5t0?VZ<& zzVXgo4&l=z!+m+xx_nbEGts-z4>pLXg)GXE*=N}8oxvtPV11bEqkp7r)FONF=9`4| z>YPG3%(2R|IBAs2a6we$kXtdoKCZV)ua^=*A#}g@Vj2>8`wn0h6yL}iYt1v_7WSC_ z8Tj^;qpTx{kX6|>&9}Q)o$tMET)rym^Y1;=v}0qFTS!#Y25LY7g9@sKoCejr*hlN)4tu~Ld&gV)9^p<4J zW4*PqWl6i<3w;A3uX=w%F{o(#-nTy&iO|YA*GXp1f2cWoURS{J@qqmWuYneoxhn{o z^WSO@@;cKGw14H&M8NWJ#Xe}(4hQl6@$#gjQRMad@~RMiouMhDP-U=i{^Lz$14)r^6|s^Aj+z@%e4KJM}&CAHlbWK7IDQ}d_w)(qdePFS1? zem3_UUPqkhg=_iR8?u>;d*oCXWJ68+=PcpMdR?>fzcX-S0%YCGqqknpSS5&JUbf66 z)Z_cp_3qXJsgufF=r6eyvwcW(#1{Odba+`=ex~TRO}cV{oT}V zRIE(jx_80p`Z-pXPz;b5-YJY|o;Xhy9VJUmb_L=)Zx*_k#bj`Fqx%&r%8a=%f@Tt0 zv-akZs0aLGb~Wk7F`VDpT(~M;6c8034(gKlYhw+8#l4e>Y-lOue?Vr>Ls7rODMj=~ z!X1rv_p<$qOtrdF;MR@)EoYgohrDL)y!RBxf3GFZHQ|BrA-{h-z#V3BnT*HIsp3_2 z$fNd?cIY02T?uqqjF|8*i;BalkPyIpUJh_FMwK+X6Z+31h3ZBCn);y=gtN?FG-gHd z-ivc(j^&iIt$PT52rZ6SM%`P2vVvNpqZB_;jN1RVvP-|N$x-WZ8v8She(il+foNr$ zKBo1<@N(j1Q{c+jbJv^L)m7iWvj2j6)n^|Z+wGa^zD`kV$%{dtBI5bMNBFR3n)q!` zm}v$~2RVJ)^L|x=eSEIocHb~yo*_ub)wy0x_fl??ovOd6BO;p_hI*9?;jpSA>EhbJ zD|TA>DiGEy+C1AC*V(igj`R%>Yjr!MQ zu8Lc1p-ie!>siRCC>Jm*Bv*KRYa+MVg-RxCE{zR;bAiqMkg^`%Dpv{MwmIIRBd)8I z8<5w(bB$dZ96MOUUr-8PtoeUi?ESxdl-L872{SY-d^aHXXvAQDV9zhTlAq94mh6@@ z`{u67?W_6dXEp(PoPDkQW%MH+x)-aaL{3e~cA;?hUqO4#7b^BCNk^|9*==sS9bkW< zwC~nI^;qhMkW!|Wa48=~9CduIXsdqW$L7z~D6iUN4V5RQ(Bpi_5NTIJ0Q)_LZ}g_F z)sX@vr@nCmzI!GPh2`bHmaBu<5~G04?V!7L54)1J-lDt)zy9r_T7kL)oQ0s+^#@80 zxrmt+&K*mz#_cm!SuZY;R2pNAB`fHt^{157*irP7p z-B84?PwJ&T@Dqen>G#uYF;hDN_%z5} zb3D(QJ`4U={=o$E0r?A&J#*kPrMR2=tX_DpW1n<8Z>!s~y>ab23t6%QO9#o;^;e`* zWvjFi6J47N1G&d$u8!4h_fF10Zw04KuoRPhc-xo^ zAFd@(yVAxpupdRlE(i5O2J$)t!$*EiQy`&PM^ch3P9XISR+A`KD@b6-pTynLENjAO z$*59ni$QxjWkT8?*$H&hKL+S?CN~*t=zT=r#dm~Ex1utskP6lLMO;w}DTwfu{mQET zX7TCW$%x*Hp$~2Ovv1K1;AQ~~@a)e?^m#T8d?K`n^rZxl(!7^(Q*1#r{J8l$#^)T< zzfi~E`K9yDC_gQxZ&&>J>J>(T!CJcgeRa-_%2C}fzHAL<;$hVDaNoBQ1-HpH#O+N} zPOk-`sA>7YN=|ftZH;mHh8-Tx>u6{9oJ>@TKIT1)k{V8;&irG-{_w-6aec=jrh}jF zcA(=t@o^)l!1MVS&p%(My4D+SwQoAGUtC>bmHiv~wuSlZ1O6&3`)%hPGRHBmrL(tg z+2dvVTkhpFF|%5J%%w_KC$&E``!t;gKcNCoWM zIT2W1mi(ns^C2Wpqoz?z=iKG6zDSxkiCYFS?hE|HvL28p#p8#YiuMM)Rw)Tz?z{)n zFQ`SYUgj!%1an4a=KYQe9cmeaX0v+9pR#nSkH{*NN)In#T(oUwIO{l^S&%Hwg=Wr* zE7F_51oSKxO=lNE;=)Z{2}z<0yY34l>Hf?2{@xY8`FW1nVfKiPC(qZQHBH;gZ8NSJ zc$$nqo-1#6sL$T1>#4&mf86<`M8hbUR*_h_5l+ht{zwy2u8lwCOG}3DySfAE7_^|Z z6~cuuXkcMf`7zcDa>tmm92V5O4~EUS0{6Z4P6Syb4E%;?#_S2-OkYR(Y}V}AKePgw`F4*5zH)R|H( z^T$stCG6RS-bc8i7{$oJ6-e2I)uWZB4O5QI2q?BB#CPu@^-`u&Pwn5K%Z0HKkzH}D zwYdCZ@cKx1F0LVkH07gNu0FA5aXL^FmWcEv3b_%&-B@qTj|hNjgaX7jlECQtDw zcE0pM{|D;NWMpbcrLeZdo6%d^g??{JdPp2E3e55PDTen;p|2XWJQ88uE5*lzl|~}G zLnW`!2gdi^Yaa9Rs5+*#c1l+PUT~L4mV0HzZ+;EQClLgHbL}c%;XYCGn~LI+sW)NN zz;ol?efB_5(;{GSa=QE?^Z1zM8GPqnyqc!lr)3&|gP@8>>bV=4l)3HoQfw2U*dMqdk|9j0QgCK=wK--I9M?2y z(z$fVbG6-3wpd%&G@}{5ojWN+0~I&z7YGZ;FfX1%F1w0<#D|Ur!fyiH#{I%&H=L^2 z_W}_8W0KtwScIf+>_5?}Qw$RZ=4sY%tO^wJ8EleXFz&x@&)hC3HXC zvcD3o)(o_bsuzH!onJXO9Zg@#b`OQ(;@!yz$=B?cUDz-OtmP(i0cZTMd*O4Kus4ap8-+EC zap-!%)1fE#BMq-G`ib-^G%ALZ)q{xZWItxy6jYe=tw4S}q^F|Z!~eHvJDZsEUHstB zWPP7mbM!N+y!F2R+;;gF<%o6v&$4s-LCgye;o!}0E=)5mp#%F-N|$Wg4x@w#oV6>+e#{w zxlHc4B_V{pYk9}n#dzU|6euL|F;CZt;+b^b%~u8RqH*)Biw#y zu-nc(*wRVRt~qZ{jrd-K*g%&Kovq_j&56?f*VD;&U0!^&l()AjO2!l-LV@3oFMec~ zB(5=e1qHEy#u!Ox7DD}40uCZrv01)xE~lWQrllRrR=kdkQqG}#s!U#0wV`2(5M(TM zjRZIVFhHpq>C@E>m!hWsn4#IqD&iHSz02m}cp7gHT8Ymf?eFSO0vpNO$82nWh;14z zkZ|`hMqE-CkXf7`x)%f%81K^?NVxl%k*7|Sv~5-gM`XzSD3w#WReOvnb-T`*Iof-? z+oWZ9CjxZ4eC#V`sN2y;=0lmHGKn~_7Ud+xvvA>euo?7KA~IYs;vn$=|Dey9p8kO} z@r(&^^Euq3VVf0fs{LP)?P~=C(H-ns2j!2fKJMYs$yOFNlThv5YNM++gI469OHB7?oB^6%pL97p()&*8QPqD;tr?X>7!4-qI@_Is0?ze99 zhcECc&Vw_`_`3fhi7_DB*+B(&rkSRHyQr1phnwu@C@prAM~i?8$WFa+^GYL+Y?QdP zG+B~AYB-E!`LY}(>R(=I_=MntUnN|=(UibyS` zR9z@$IdOWraDTTgBYGZ=H&5Krw;#gUdnO%!%+uwvLmWQ>R3gt?IA4EMCNh@5m$Vdr z!X~cjSu=ob{e&R`&vU_V{m(F<_4e%jR#KWPQ5 zst36%-TN1FdZShp_n$HG-{)BXjv3J)zOx(e1I%{&-jMm+pY#slUadtx#nz5~3A|js zH{IO3{_1|N3p+LSkAecPcZ8W#-ZEEfA89WOWWwr+C2^xB@dG(X&mY;$pvxkWW~4(V zv5jQve~^$_0m_m#kWO~5cHdkNh#-$;$%wssFL%RY-}NobJzx3fa91M?J^5zI<|emZ z>wzEz>H+P!MJp4<^mmN=99ukB5n(JU)5kc-NPc-^;0DBOzf&`LgK0nlLH2XiJiCvS zo5pj2ug)<}J(wl30qtqsd{Y3jpbLy{tG}Ysx69Vg{X}_t8;qYiZH7;dV%N%bvY$T}D9UV>`sB()KBL`#8=& zzqbr($Nh|U{rtB2;xs4pAHB#C5^ z9azKUh1T}CV(Vn2wVYjvEq;9|&*Xun`LL5Vk)`}f)FBYMP(p|dm{~-*>NjwNwaZ9_ z)pO4oC7VbBCWSoWt}FQ41R9tw+N^8*Ok4VX^e%nKING~GT4i%viFQ1=5r}3`#VY&s zQyR?mE80@@x6m5#S?@mi^8`%Bb<+N})DQc-hzDkXW=#XKrPTh=K3@-uuqSaGU+TvZ zh&MU6Hyi{{*$h1Wy%4=$*R?u4!_dcP+?+)IcogkjEM>KRUMqy3g(=kZ8Ebo;FU!B$ zTz}hsa?W_mi)C{Rns^)Rl|$$Kc65>Ug6OHbUwP<#faTez34Zq*e@|7*)Ykqee79yz zlbv$waYsUu`@rG-(>Dz0Kn&)GzR=zoOz=jY;0n8ASnv5@J|AQd5y^D3vhl^J$|dN5 z4h&xF*0C4K@PeRgZ3KqNonvs$sk1i@jNz^nlxP*O^#sRC1qFdWuH>xCuTXaf&b&km z3oU0=3gx&#d70?EX5VkQaueDaiUi)mD6VWIGkWkKL)zDF@VcS{P8-37in#cs3hTGh zXi{Se|1xFC0PEY{HJ|d=u>2o03*Sw|F5UX;Yk#TetK7e6L|4T0X!f8)c%bbLO6!Zt0ltSf{d1|UP8Y#8WyXS_zcNO<5j{M7gv)vmU%`Tzq9;c~8WB@h9 zA+D03xZWk`IIQI^!WJr!#lC{A)t#?8b zh8PckZ&tp16gqmVvCdEMEW|^i*3}ow;||o;$Wkh&Es`8s2do9Y{zYp&7tu;{ad+!0 zmO9D;)SBW_y|!$YFmp@_WJxwz@7j%p*6nQ3`$Rjf@eFxgyd#cHH|r{w3=OO^2tw7zuyNWfJk zI7sU%aEu!f#q^-1C*P3FplVBdCwUSVe_(Qj>D@J)I6OwMOgY8>=F5|8rJt=Y{AROH528{P*^0CCLsh87Q zH~c4aRb$R;orJO+`=r5lGPA}Om`jikOjdEzAS=8!z`82)3l+T|jnIAdnS85XH4s^~ zs1-&{-CYKqq&OYmP^qiym<|{=qTaVK{$+p(X1c5YLeG>7}94wR}fdB zdbx;l*rKXRLFMI%9D`7GE>%kEBO|MY*B89 z44pZPKuCc>FP-PGjeXasBNuO_GjAN+f~V$5D^n#}7SZ{lHKz6m^XIb9AEJF^UQW9I zBY56UOkc%dGuM;zGn!|AS{e6=CfFu!?~&*Lohy>L()kaprdV@@S}8UF6wluetIr_c z34+!820iHZ!7he)5hBf#)+B?=<++KQu4dS5d8Y)9NeJotGE`B4;kygJST?zChxrPl&`}%QLjS+E?&)&h- za%F_Sg;!`JoN@sTi+A{0cuR1-r#^+E(%siCi5zWxcT#l1b@>3%w&od{_|@R&wtCaD z*PUaHw*{+SMK>Ra5C9S>pA z?;AfiNhsKc<}aR;>pP~>$goQkMLgW_D-Pqm8>uu;+LWlw8axp76oFWhS!mw;;IlE2 zPeJBFJ1GA^q+B-O*w|VZO=G80D~T_&A)K+wuqB>m?juiGOkcDajzDo9lzn!C4G<;$ z-jZs`*H|6RTNwFpI=OC{1|I5$2=pVjFJPT0KYYAQ$;-=u-EYXhbVW_MybPULg9lQ; zEB2G)hfPXOuos}nHpJv>hzf2=ot8M!xn^y;WWH`U#o>h`C#^zMv`X9*u;49Dar47~ z`TOBGV*X2)-IlebzLi5xR(pO-^}0d+E#GOd`r*mk=`!7#MTDrpM@Ko2+LH`=VUhBy zz?4(BoC1HDG6n9-MDP|>JLY&X;giWmZFQ8y=uO!zMcY^t(Ho{e?-<<-?hCi7<;?Jg z9^5H2+hv)DX;dDuA;dc|#(e1WMT@}hqblx0((XJ2^F+3@je3K0nluhX6P33gc7#CrCeq*>*FMoO#4fS;G+ zZ8N6QE8tq*@3tf4aPgnechAv#$Y8r8O6Z6Y}G}NzsX5)WlL)k%XM2 z;;vF+_By!}7F=+!?jv{v&k(TB{f^prH{${Owb*IXi&mtgAXhYvtE56%5mP1-0MFht z+x>-zcja-ZvHTDmwb=j-n@Tm?>hX-M;xr9-q6!ulTZXvLC8loE`f1WNer1`_#7)vp zl>`^uWqP|H$CYgg6Z+@JcSo!~%>`b#37EX)Q}e1N_gXGFQr>%!TMuNdiiaAjf4^O1 zakbGo`@|q7vyY|x^%A;>3F-WiVzHu7nEh7uYfd;0N7h)&O4Y zfB5ke*3I^9(nd| z0Qu^Fyc5)(lZ_z>+Y)S;M9WLURA+LZD3!3}%aix0Z|N=f+;4WBEdfXUUbdRg(MUJ| zutANaHuwGiu|Dd2d=Db)HlLx2C z&e)oE8y)v=13xtiiv{ptLz*4j&9GaJJ4l0}?QaQP$BF$nFb7W8t)a5cq-(yWnh&Xn zcf#s6+pIX(Py+rW_OTIhVI@% z1YGlo9xhZnc>N0VRyHXFL-K{wxfiqPMnED~fo^8MEp6CZL2dZmI^e-_vDgb*etJkNq2wFkxP{(dFY{QV?y|*AdoHDwe3>&uZshjX=;`{DE^RtEP)}6hlxLx z$Hrl$SuwJhcG;_pADg*7s{F`STlzEbu}+YU6guvh%FqTZdeGAI>{JLL$Kh#lyAF_0XnqGhliMYzR+GLi3 zy{n0n7CTe^k1kDvou!_Wvk!?@a7k7?QI9g5s*XV$8BWw!;x8Fp>|sxfLixuZxyEZ% zMU#ylIF&5=8yyx}b34lG|9uy9%7uzF?b3ml%wjHxnpwCF2Rj+qW92|q(nhy<4=hZn zP(wYDaytFfbuGCh4JJJP1)q5WH$e%d_J&Z`ePO z0>>B_d`onu{1T;`uE4qoPutzEoG4!3X6+$J78rAj@G<=dNm7;_3;rA{c+jt7W+z(e zP+g`QT>{0xG+WcQ{~86`t|^ZA()2Yac+?geSlv$7(ipVDB#gQ6ZpZQ=OjI!9fU*xL zX7l5)NaV99=V5pZWqzDz9OqGTYDNQwM!EoI;@2_mWkn*x_0IEuNINx>TGUiTD7Xj* z(mguFo~oWf05nS#l=kxyM=%(pu8Y2-`n|z$SWDz|O5kPt%`jb#WddFdiGOH+D%kB+ z=yL2&O!+kL#@3tE7TXv7;&Jf9=Q-JwXO}B6>_6y!TdUS9K7FSCPcdobc0S08nBkI? z1|@hfk8yRX8pFGHef$N!?B?2=gp z{>c*<-D+(xL55Q(a0q^PrPPG=^QB|IT%ebI?rG{UMd`uZYDXG3`X)Z z4PQ-tc?nT$4gzxlBh6d_e%~=y-DZon|F+DDlc7IvQspEsM?s5xm0V9j8I{|nXs_~I zaq`z71M?kGE8ZK3l13xa$!AD*p1Js=?{yk;dpMy1co-!iBW(Nz4iTs_j2_*qbE&gpI0Nn^Z3?PzMwvn(nP}@XK24A~Su1mB?)I3PpV;4ithW)G4&+Me!Fp0yThf!GH7!okD>YJe_e3-T| z7I5c}e<}+0`fP1UDJ>Qe^`=TehOFfRpCocQKYs`0^k7)FqE5C$*h9ORq0Lse= zy*bwWnBn-cQn-YQN^Y&JRBN55I>{DCt%k?BCf2uemBM1h#2mI+6ce z5*#*GukCxT4aoXiEj6W$?$kIrHj`@dM@8_S?Am{|(cLVJQvSEmyCCvpH**q-LaPv3 zi2(g5T_1D*@wE-OCKeb_d)mJg1>6lqRCejQAB6R}p0o=0s2X+p!1g!kpG4~%vVR6< z6q8uY9{+T_lMNp|_%0Ph51*2BfTK%k`g0otY9Bs|NYRet(XyYcFo3eA(MooW? zNdPL?JdM*o5H%;Sv9<}*D$TqE2J&gam^Kf+ev*N<>Obr0If(IAa{_AF65dxo_yS&8 z=4On>*+ugKFM3x)(pa^Kyq`rz@~etq&gXyh_AA|2eK0s_`ZAf}TK9FftTFB-34c@b zxf1v@Ql#c-OtgsE>(?dwe63&Y5_eG#FaFoz>Xasdf;#HiU4HLpb2PtwLG zgJT}51ji0M=Eb!XgbRnrFPZ{9E*Z=3C$h_8`d$o`S;KsZ+o_hzCU6$ z(Nx~O6fx#23Mub_>e?-eYmd;fqo;}K!W#i#S*CfwCR5x`Jr`Gt zgD!QK*mMQEUV#UKx+Z$ISZV6N#<<*|#GKU)OV?M2PbifVy3XI!m z`TwOg4p~V$`3=qZ0jh9HnU8Nw4MbCW8GV{l#bBD3QB?!4}LsZNtF- zfy*yrE65jBxw{(*dSBxdySpY2zX!iScPXeqq;Jz@N*+883r3Mp&$qAsJ5^j-k5_xH z7!P~GT3>LYu;*gJ%1J|_G(HN_sC&?mmrXZ@29z>zd6aNg^7?A@D08sMUh_%y%OFr% z@O*24BJ>zkUtjikq>DP`T(3-}MRxB9U4+c?kcRGmZ~PkBZmwn7(7p`-wYCROlX+|M zUR;RH8q-?N*ohA)q~JXEIo?xas%MYd=+2j0)amTF?`uyUZ3KC!m5GY|b)C0yBk#Xm z2X@96@~226adctRWrh~R(NXA%`nth*8h6x-*0oTwj+-6-`~K&|i_YM4wk0X1%CV)@ z|5T6tH^Tpg@@z8(n>L)dQcJfIjbp%LObCsxoniS4JBw|=)^3{}h?onp8ClBw%8%K) zuZysq&B+2CHrDIk#7mc#Y6H2rzgdsZqp*}pgZi7?jSVx&$PZKsSA_QE0lKave=HIv z{KV))O*FE0DdbzZ7T61=3PEzAoR?;cSq{V^Q@Nfdw_FwJ#c9gP2>FHbyb(LO-!Je^ zt4fbA7v4iaudnEnW(|=mL5NutTPv?t*JSg)C}Y3F zB&tW~)#vxnz_zzU3`;oT^9Rm`4ldie8G6jq)s@q&@#IicQ}jzC8SSf!9J&5f^~|x* zbB?%vC6!E6p{67=gIV!aG>1m9_VqqdA)mQ}t6(Z88|Rkc7roVkCMxM(%JYn;j_9C6 zFENpC7=WVA<)-vYcfw$TicW+61yc$KIs^rkC#3~ZlIqALY|GvxFa?z&eKENi`^5LG zu7j~mBy_aF-?5)9vy_D`&n)no7Iq?$2AJUfFr!F=n{B ztgS+*+aP%S^*62Bug`~c=M%4&|LqYSL~1l>ST8qm>}7F5nWYqtgWdk0{D$9Gs>Alh zbaO?1&Een{g?Po_a=(CtNC)=|k#D4ip&7RD_Lq~b_)$@*FI*oxBcm!Y7Kh1fbkD8- z>t_Bc@A2yZduZvUlG%$^2&qd_p@sfxkLO9yWsp@4FZ$7eHR86SHisn||nM<%OTd+u*&D zrwIeW->zn6Fd7Y@duVZ7d|&jk?QQ+k;aZxRQVTw_NfUZ4x@uDvnKqF&a~$M8 z$@!sA_~2;Rlnej@7PpV=yL-^ftLSoMG;@pq)ksvul=t`Wse?594nL;FOcms|AnX4= z`$nl$d44OK1krSHnU1S_T=-A|gJ5v*}(R=T*%D`KjYNJf~QrVH}Y?$=TOFqtt zPv2NEivcj~N^Zpgyw%^$r)`OmSzaEo`C>LmwGiy#Z z`^N_~PAApEZc1+p@%mwKS z;1*qE3|a+)huFjZVgXK|)XLY(xq35yBz>EAIrQ}?S(CoAN!^a+&SYs~=ZuOMNkBJi zyGdU&K*AVkAw*2q0Abw?U%DcGN{temjNUxa5-)j}E#=ZR^74q;?LvguwUSlxp_&NT z*${AJ4;v9Lp;xfsl0C?B`wUyKU&Df}q!vXdfe%lk!y!+o@D~~@td7qCDv|+~kWk&| ziG0f2{U4*<=-bPi3{DkD_;Mx~qkEnmweT}4tw&sQyYyyf6QA>r<>2}LN3o@->UmK+ zDJ>cy%vqbmEQyT+ZUY&({IVaY2ipq+^_+)k(*>h`*?%1_jX(Zn^1tF1fs*^Kf8Z>c zEo;4&)^jPi!3%;cXruZq24R)Yp?Pjlt)CoV8lx3q3(lD zg3G}Tm>N1*X%Dp(27GmG5;?KYKk2w zifa!;t?FVCq9<}zAPxK7S4a1$J=1|-dVkwvE7U^Ll6CMw7Ff~Hm2SfV{jl1mwrEBB z`nzbwo$LhVpV<6Jfet@&Oi;NeVNQ*^h+k;^t~&{Ar*_6#}o&t#x8p|B-$k8eClEq*dqh z_UZy=t$1bJQS%qv;K|j`#~mp!+CI#Y(sEPD3gUh!m0HEhR*;#r^HW%RM46Bj=?eQ! zwVV?2CHrLBp8Yx3tyODQCncdGovFvTVBE8niz~s^5!Yl@#pli5*e32(*?h@8&on4R z)WLb{zaETU%ARSz>+hy|>bCfE9900w9^&}w3R+#@C$D0I-He=m0oV63MRN>1!IfC%T2?-+ zNDEYMpvdV<0R>D$&hy8_B!aL$>U?v?Ew1h{f2N6JzPD~?slnw>AEZO7V~C2NSCP&= z5nw>WJ*xdhZ_v>h@6)wOrApDK2NLyo`DrimNpDpMprk3}Tjl->%IY+-SnS8^;gniqg7%5`=zUh?>Es6yBL<*hA(upBT+$ z;<>@-0r8+nWh9%zkO*22>WMc$aij4KXPDCN#i3p19YEVO6T*BEX=R&q6{jpF(e=Gx zZ3Sv=?80WyJUg`Eq)E<8)E8t8dFBOsUD^=UA6N||8ag-6N_FK?Xdg0}+LF>abnP?o zOGxg?<5Np)#o7=ed~il5Q$F)>-hWx5sSZi!N2s&d!`g&T95w2PZbs^eyBps1+I!BM z;-$~yQ51hyY(;*`Ryd3a{|!ewXB?vR*nm_xW0E{(xtmeKs}%qW&PdaHZ<(`jx9a?Vd$U1%-e9}L$W)gr{}et70;J>cZ3T*o}^__Qvp#M5D3<`(n?4_40gt+)c#l zC093$g<6RGyt6ixm+jo9@{}W|+o)eQ&r_m#)-eeE?qX477qZe=Zz>6>UZPY_o1!8T ziMQU1hj-wZXMdi&W|i7PYQJ3gO>By^HbL+(%fOJ2 z)jxn8m0=v5=K;mF_hR4Da{84XCbWrh=j>Ev<$d#UQwvv0)`dALtY|He!{vErxx#W| z=ZeWQj(z*k=z4TwR5l$>d7BpwI)(Coj}Gp5SQh|~NNzb8{h)!Ad}gc&WslE`Ofadw znLjDOQQ@rX%JL890Z@UdkNk%5yox$~H zYi0b|36yQS{L{{RHmJEEY7Tmrs$ww;gBo@tEt+Bg8KJ-M0oko{;}MsovrurX54KE- z7P#OLH`eLzoSMW8EmfCG0%Mryec(lY2J?ozs}#?Mn;#vW}lDHAO9-rdLx(*j`-?E?C|<8O!l;K$7->6s4il{ zD$P|Cw%Pw+2!l@IFBor`WT08iV22C)*40&mFr139wB`D*GqmaHf&LxAuO#TUa zdhnCM+t>EF6LFrD?2p9`$@fViZq~NZMu#mA&#>&QqiIsw**o0D zC))qwEG_G1`q#ZOG4{)#HJ_ZdQ>O{d8<%8X>BVo4Y7u{1YBv^SO*Er;8fMX%V;|Bz z>f5wPIt}Jir=O6m)euS3_eP`}`+upCvn|R^ zB?9GtNhR&IHodWy{(V02-`t@S!D$$_KA&0n*)F@?4p39?Xvz>2AM`KU5ymya^D?c@ z)$aPai8Do%_DVEY-;?GWLZ>B3*YqfIX?TxS*FR_b=;v+7Q^%PoGqXlvwx}-cl2CIj9=g(7Hh*(BICXhh1J1fytW}W$Q z1}M@4Tdm~dlS54V~D3OqHhiTq=JqF7nP#gwgO45FcP$VrCm*smwcw zjQSP2Ux1qUP3x)^KF*1~!9tE_U_?;k4-tdHfFvpt0(Yc*SoYMV%j>m3;NBm60rq)A z1C_qH_#FHDX=de+PB7MP!@}Rk^p$^o_IF$KSADOrLz0!%MlI;KX(a;2X}B+4M9=HN zm0Q7>QQO=8+p{q2wZHDok=?w`%nzl$KQ^X|BoRNfPd7Bmn90AqD?8%0QHu+S3$}0T zQ0Bz(A}343ErHry*T?<+!mB;Z>91iuT8Kx=B)v?DBO!j&gb@)?(7{AQ0Jyd=r$#Ay z*H*nhH4wTkpZY_QGBt;B5j_l?z8_?>+DqU4zQ)Qgvo|H}=O-}1~F2Yp|n+4uLgIxs@$hxEvlTx`qRYR>p8s)1VW$0s^z_m-n2g+3Lmn@2KL1z0tWld#6c^{D z(;@=Sf&xg;p;!ZF)BnA@7}6irdWBzL)c3M0Lu*@e400xG@X58_gs`~AF8L_YVf|su;Y^MCQVQW%Jh@t+Pt@|3leZMYY+5>)LH`m*Vc);%>#QXtCmj;96V*E$&h% z6u08;8Yu4WUMvBEr)ZF!@Ba_>*&b`1<{%>@AA#$eMcl2Y2YbGl*Dpw_t4(&;p@CC0JX%S!`KG$gRH*bkukk!v`aRb zRR_jN{-sq|!(||qEFN}#Yw24qXzy%+Y5;O($jPZS_JSkbmEe7Mf3g{W)+tI8hBD{p zB5P~`4v7zG#^Z-d&OIlRy8-7L*8ZCZ(5|$zGd@%9NkR(E;U@TJ=#k2lN3(du>35Kt z>4^E<^wsj!TzJBtW}Fq8Y8J?B7>;fw#Z3xB_RjO25t}Sh0XeyD5i;pA&pGbx?My-) zfa2FVTclU+H$Iy-owV=%A_r1u-^A*Cey>{v`4Omy=2fe^Op^@NOq_d1E;G}65)j0r znxyf9@yq?Vt*t?zwzW_8{sC$!6nMBv11)HJ0hKW3y^j;;RIs-C0m{5ah_9Khr6J^6 zgurxpa0_<%6flyv4t{KuNS~@P-F?_z^qzaheM?K@;t^22DEcBgQE=eLH9VN+l9C5T zI##2dXWF?LJEnVxei9#CGlWQym#m$s8FdBW4sQrONjWXRtKRC@)=&9AO*#Jrb8^=K zMMeJxRepIccF1B6aG%kWVDbblUgWXnpvszuiH(>&T8V`h@=gB6xKGwTGi(Kl?4K3z zL2FkulfA^e`tEhjHp;bBFiBJMryB#0HXG%8?(%TunGc=}r?PD&U;hd}nmcu%o)ohM z^GzE}*J*5v|K*h$e5Mz^DT7u@__%D^=4hjtmf?y`_+tBGO-Ufu@AE4Yg2MA&-s#46 zQL{$EL;G(c_LfecCZr6C+hnCjRZ=LO1k`%ht+$xF$)u8Y?^NZhbI_^^$kOW z1gEDBlB=%(RqQ#+Wo&y^fYH}+&HfsUMiFV4Atlx3D5a1R2>(_j> z-`}tTxV$JbN20LZ-ta+mXU!hPfJ+_=T~_gzA8fzo*^UU#ffXFg-3l5%91nYRN2+Q- zNwnTIF4Yn8<*Kp=P}7bd3phXVtL9Qdb3Sen0>MS-JFLMT{@t_DnhYYu9(CA`&($Zu zH|MS1_gDa9f}8;x;c15w{q=#dsZ`h-c-MvjlKRk(rf^a$)$xkqx`oaa(wMvADD|_j zkJ(VQkklu9;ld5!y3oKlLL>42dAx}Ge}Sr`_uOPyQd1;An)8?5f&@VBSETm_*l@1iSy*I(t<8M~~Alb+ivurLIe9COtX z3?!F2Gq5t{;X;TF{S5bz<(lvlX5V+>S)UH{ank(+d5jDObN~UYl8cX=CQ#0zl;1O? z?&jx*Eo*|@UyOnFsnvOXCFA?~D%$8<`S z==~mb{T5^n=&hE`DpLo9RbKSq!*>a->-xu^!dCcfQes_P7>VR@+Kx;Vl6kZ%2{D-) zYn~<=5%)ufy>hte$p-jW{eQ}8OxqCCq1LTu#81(yv$IX{;(qYL-^I%zidV0i-`$VW z!tqL|C@pV8@{_%poNnlWLRgQHRf=o-WZR0(L>qW*1U)=#hTel3x02_>f8pm8^y`?m z7mnz&x4mt&j7{^rvg!X&vwOZAFy zn)Oq@N_f+Q^fQW(OiXK*R!0;o-V&%2JlpVDtNA$M($Daim7*6L2;bckS{(GX>!lL! z7&G)r!p@Pxs*i9yS4zk%d@L~>!|pfG-0#|!TOUH;bGVFYaCM{}OwTn28FK;rEBmmo zuT>OoY4w=0310NWrO5yJ)<~@SM|tmW8|Zu8Aw_>)Ec1|rSUsy0@Zxa@Qe$Gs1CL)9 zz3g%aBKEUql2!swDYT$|YZNY!WcnWqh#s7k88-`i#47R`P`Xn2WE z4HZ7KVKnk6ig0*PXR5YIVV|)n-o^Y{E;x&N(O06fJUt%DR9&~BP=mzT2k4_U!d6vTPM)YeUC_W`|n39^6I#Xw2ktoeu(p>+{s3@05 z-AL4wuRaZDc9a~=@M*Gi;%3Fwg5BTMKUQ!%EhBa(bkTQK9;*6y^{sJuP%|>O57X^y z&V(~G*kr}W$+9UdCL#=Jd)z26UT&_ssn=m3QsG&Ny-yk!y zQ)yg`EMF<`0d>NvRla256Ii1!ipZ83YolBl$Pyih%GOYC z=-6*RC*f?y8c1o%%a22;I?jAw1k33Z=Gg@;tIe5CDppwCEc22_E|e|Bn_eS^|2JVx z?O`>JLU(WnJz3FXcsYVpCEk;-z)gqAs+ zkAw_AAMkiQaZM-p5=@_aGC(WBUUvKiA=s3TX9%i~v&3LQP&$c4BR$a&SxXLiA8)w& zhBRefr|&4o-oZ6O4e2oL2C5+Cs%Qd)iJzWbY;?8z{aOBV=Cs@v=cv9J%sKka%tfMP z*}p2Kfn|LeNPPPfn!<<;MP#QDvHQI}=kCNX&%kr8NUkm4v)2FC&3-t?r=5>+|ne3W++i;OK1rj15t{=)eHi;RJ)ubR9CqwRfE2k^hP_sGo;@CW-`_!?fOq zZM#kVIT1&+_hrKjA;{XJ+*5{~e*JwJzk%JyRDxo~V%B##T@nhsSLUl0)t3ciDI?E& z_F9_a@ODT6hj;FY`K$8Q}yN?2WdDxz_$RiHM|ir_nTpV^VUk$lM)A!PR6H7Y!hT!_L(P;qpf;o;^x~o^mxw(vRX|6rW77;A^nB^mX2XL^+1Bcu4UXOvqk|bwZ4o zSWUa9jZ;%!S!c=V0HmO>zDLx4m`Am)jX+26tlf!TdD2a>UiJA$N(SYAY8SC~pL*yj zfT}{mPmsI3SXe@DZ3R%C)wufoc{J6zZQqR4%Y(bJHTL zd*x8wL;mPY>-QW~CCz$neCTb8l_1hSU$ZoR*g~pHw0^D%?!Gkil_3KXh@V2}r4&#S zk?wnCd_E75W;JQi3Ab-)v4E7VcYHrh+U<2&U5(son+f5?5+RxDMw(d(l@?K2F3Tx2 zmzJI|@AXLIyR8ivWbPX89E9;NJGw4O_#A20AQgzK1)4b*Tf>NICfGy9&Qjp+J|L&Z z+;^ovLP$;h*2?x_YTHu7D$2KA(49j!nk4SO-!q3VcdC4z{qe^o4 z!2`*o+x%$)uT{$WQru8*U3cG+d5JDsRT!%TiaYF9=SH73f7*Go^WR-&RKQ9^CPt9Ucsve)$Yyq6ITFy zx;7gD7-{|(xLqBo7HO0V5z45AwybVGBt=Dazij?THtD5r9en1sb0X7Bma()Gk^$pm zqIA^{@cU=F`#q3xNAuncGWs7Ur4BSML05h$d9RhL_i87k7^-@+7|n(FlzWuRz(vm7 zjL*-dWb$CQ9(492&XIIxcRa5$(HZOr59hr~K3C<6m)1~!4>Uld*GAVYG`G}i*$vd3 zB}w%8Mbd)x#vtywLgoeg!4%jt8#ec@lXOSDw5M0;KN7B59SIvK^%l3EN^#M*r9I=)-b5crLUMJx2@i>@}*q> zn=xz0b(L-Xfl0h3Xrde_o284ElKD&Yp>Gi5M)s6PYHZYhzMV?Is$`^<@AehWNh08f zCZ3^(;WisgRl}Tf&QuD9&<(6i6O?O$HwLJ?pDKG{7B5=cwW^Qjp?lQ7cO0QJw!Cbz zduq_Ab`+MhW=Q+A<7W`6>DeBAoya^!nYU7=g8`A&S831nb({5Bd0p=`-!34SKd&)> z9j(MM0SR&UYI?pU4|zNuNJx$?upY4gQXgZLNmUtW%~??(3T8dU9 zugYkjg$Uvo(MYW+WR~ld7&TfqYg;|kaJ<2Y3a+C~BWastJ@oJho^z_lRjt#HXZ=;w z)>8k9aO?A$wohHvrP~BdW~3cd1YF313TE4_i}XF{qx9BswM@~RIG6~N@z@s=)>br` zKd-sEuZK?g`1-~<%Dhupk4liGzlem4rM%DO)TF5cde-SEQMg2^0%U}3Q`Vhz58xZ; z-$&3I=G#%HHOUR+<*}N1P0d9LpOB_rP@_KU%-}1@?jjMp5!q8~+h0BvhB+r$B(7I$ zY>=Q8~}s4jj0>Kd5vvj#H{q5_mmQpd|0#MZ~6pYpBA;B_$n&X5ozJWw5f_ zSefX#Kkuf`=T)*9xu4C*+h}KOG&cV@$FiN-ay9lnw{?(Sf`yu%Ub14!yqdbWehJDlfDHbx(OFtdSj_#sfwU`p!Vyr*) zj=qNxDrLEi2k!zm8C5k7MM(0#W_QCjW%D;YIYuV>n8LySk_I!L1zn3ldfF#DzLu9S z7sPu6((sNcv|_Ewo|t95vCM7bWXSSp`TMEK2^|#N1)0M4W<NUSGSoUIJs=-6 zR83|$%Y<0Vnl?<^448eyf^EvNxJ^A-gWgi|3;kPprmy|!I4+U4FQHVUx9>k)|5ycK z&Th%BD4ud!ph~+Y?E!FU#ve~sU-|X#Oy1uAu%8d4klL)jc?g)E#}uR*&t3Oj zTJ4kYUMBM?;LCO0XI(sj&?VFG9^bQ%(Q+C~#~iXNsR-mV&^s+$-5TFSlS+xG?1I~PoPh9ZZ!=Gv;}nAbW8fcZ~Z zL)$JY%A9}Ts!;rB3BkDRbRk5F9B8~B?^vq7@RTi5%2GYZ9_!E85mxhe`qqkJW|%qo zKG(}^D_5Z-@$tCZ-DRN3t45oKs(pq>!ZlpU+SOnD{n6$AvUTHj$2BO2Mie%V!eKpS zyiu>6v;ootcOTSjXk(rpKwq1~A0*zGB-S(Vm#r{aFOy06=km4ldY+0FgQO+S|A@J{ zdYxtDlpZmezu|SW7jHlRd9{(zc?@IU`XkkA-%HrTXt8tZzo=g_tonWTX8P^c|aGguq@Ea8{eGi7#Q3_tlP^6Rh< zSMg*t;1uOXw&Q6_6Jh^Z*v?r+lr^hK0!UfusGPR~zBRbRHE3KB|JY}M)2HSco42lh z-z71{FM>#dOM1UaV&!2sLuPjvr(6-_KN&M4!VZkLIcHAwtv|q__!!#|CiB^lAm+l? zYnR~H5}P~wf!@h4E`JOwN^;)YV`=O>IW1w&Ka?6SB4>F()hrJa|5oF=UcMV=pY|w* zM=)-(==km|bC~>6q?Tu;XU>-b(F9lxqdt}BSN>ow_Ebq!oE`^rNpOa@S^3uMJJK0_ zQ|6)ir>*Eq7P3$;QHsG<$$8SOU#)y{N#@)Ku*Y^?>gQ@TtaezyaD4e}Cl0vjqD~OJ z9xbmU5!5wZ7VvQv0NP#2VdH;F;rp6@ShGr2>z-#VzJk$oB|nZ3gMkJ&F`=tB7}CQ{>D)i9jy zm#sa77a+bh_&)*Xx*9)u{C(!-K#R(8MCqw48gd4P9Zy?D=eUPG6a(7Gbx3PaW2$Qp zr)xteRt;DqCD8$7uXz3`xazB7sFwUNk<6ki)t>lokH{}xrc_i)O5gtGwtW*!;u|L@ z4f|0qNq#9pvD;|fjoyTg#FHp;y2}U6sWix#;O845>8IyxjfZWx>fyJBg|LaKoSba% zeC?ovJG)%{$_g1{0QkNUo1e*_D7IJhOLMfeeD@GKE&7klj$=a(Un!STaW;FK`}r?GY1 z5e#y6>EY=5Ud(>WQ^cRXG0@7G$2|S`6GV;^Yc?`>%f6Jfq7!07rj>J$E6r#ergMty!r{oM zpA0}X%ZHBB664DuR3eJBd4>S)t9}qt6Zft5pfYEpkOH~;3<^sf%5L^Nc7PFD!k1F4 z(>koDdMtm4JVD#oEN9JP11{#8Ode#RPc*b81y|dLp7U}!I_2f^l71+H3tCzG%$H8< zVdF^asq=5$>fu{Nzm%ZETFM6!YD`N#9LKnjsqYs|Ldo_pboH9(@1M~8*rUVW=rO$; z?Y6)^R-#zElw>oWi3hK$;5^s|WI;Mte#`}5vz!o32bmtTGIe1*TppEX&^0vndn+_o zT$ikf@#UeJF4@NWwa{j=8HWg|=*SI!GzXY1uagCT?teIJ4g7r?C8dl-;HinmGn@kq>m4@(hH%$|nqC>-?U=S;0aE?k z+|-$!k+z$&EMH>0cD8^^y&tMWeu(!Jz!N_m%L5*+P-xZ@&l|SJ#PeYm*}ogo^x{M* zJ=R;LOEN8`mh$(6X)lAE0N2Dn_s>XLFAoXVjrFwDhw}->e06QzP}$|rMfsqV)_HzM zucq$HJxFxBDjwAseQw1{>5T%J+@@Q?f_N*Px~bGgHPm!e8@?)2+B~<*Nk_TAJllCk z+qzL|sA|8<(%%2!FZ%LzYT!=1)phh?!^HwLxE)&4Ld~RtnhRS)Tqw4-dM8CVcRopi zYJ|ll^3uLgo=|6&lE^30HlF(5Gpy@-3}v=219HTVVPeK8&R)1sS68M1#D(GpKdUJG z(-Vf+!X{dxZYE}#Hx#mhoBbQN89k$T%CBrw#&RTYS0(h=>XvHx+4Or?ayf4)MAv2`<7ET^4RDv$5EzSswIIz{K)~S3jB9(80M1$F zj9IJt0GrQtSy!yCQnIOw8_6pp9d0CPzNWx9pcU2S=VQxFNsoxzN1fOj4mgi(ZC3if z(p8k>Pb*?BA3L=_#kpfC-0v!w8E-v~LQQU*@zcLX@Ci&6Dko2wj-@_PDNON1M@h9^ z(jfLiFI+l~J^uy`?$N5CFb|3Io@>yuU4U)+^RfAToGSbZO>O952d~XZ_JU;Qgut#n zM*-M_E@XmgWb+Ba>jh_-ub(yt!_p2)&Gw;PIPZu)Jx=aFs%G*F*8HqL`4GJ9Yz?t~ z(ig#PLNmA0lKCl9`R__)dM75XE@fc+Q5zhhvt70?#>*uoyNa)Jf zdz|hJa`^#QQO^~Ey-mxuC9s}W|1hRwgEGVsta!La7qsBNqXgmitWq_sDoBv{`B`*D zpKUdOiZm1)RE<+^sg32K#HN0B514h)p6=+WveK^; zbpq#`{?7jXLA1U2j#2-oTrk7K-PTzgrdORk%bCH{dWD(W_GSyHhRK!{8uY|vB2B-^wm#|1;3(#o zPP7Wz%hp6+t#0)s+fFXzow(797Uv@k)ZavuhZ54uqkfX7d^V00er{jn=TOJW{TFk= zu$923Nb6b2YqAFx%N&@Iw8C3!>)XCoyb)Otn@6>^|$-`f&Z zkNdIlY`ifMD!f_EZ2h6+e@35bwE?*pyu0CS`_(sdsKEE{IE9#Z5 zi1vT}#0B$Z`jIY_(*n;Co1SX88iA;4MhNfs^kCYjvN5~1BO%@`G`eq|m$#dgC!3-J zccQIh3n(6D8ZrYEp?B7V%o~o)Ov*^d3Jm_4FHr_wG!|06OR2vZh~9Q9+6hEPnw&Gv zAdI_Uk`*l9pzlAoZoo+YXwQV_oLz4?5rY<*!Uh{%>DkVI0x1ai|7H_8S2i#{PaE=q2JTMonAa+EEzvN6t&&q-Y{Ss**{bKpT0J^9$N+QHJd( zQO5!ike7+R@)BbHL>REd6&hnV2Xt4;8=O&iLUMs$(sN#2GoNa2A6-z9tKVmCO4ca3 z_FYp!=x7dROd}ZGBD1oMyk>BfB&4!9Ph_Y=^OJ29v!Zfc>drI>lLQi0I>pLmr_q0w zTgDk5wsiXVsvpUk*I4ig^V~#4y#MMAik5=h7-vBwgnXorLUX5%KWQQyJstl4;jew# z&(VNfdm9Xi%R)52XpdKvnD&T`$n!S?ukv%cHl>leVi@yg$4V>5{Vsk3{x!3&^t5>tm>Q`yyoBu$=U4dsszN>=!J!qcm=){vMOT#r+f%qaUn`^;tffE zLf`xJ&mMI>AkL8zK?q2c5|P+#sVz{mJQuXUI?%|K&lE|ubS8@FYj51pKkp6*h1q2h z(WjySB@R8dg=M%i(u)-80fd_n@(0dAitM8I6*K1VGgtweXz{2cQJ*yxhV}9*Z+v{E z9@n_9r0fBD>z9dm?dmLY8jM80KCf!BDLJgY3Gv(gAb1$ZpWl_h61aW);Y;Q~VBu)G ztX8bFoenVm!@0zMyN9AylYHtYdBzxf>*RCT1Wn>}D_WrQ+K%YvV73OfI0FeEyD}eN zsv_B5RzMa11IsDWztY>hukGe2qaJTE(@Hp_)GIr4`G#G%kzON|DQB05N*pRq;Jq_~ z90ev0E{-$NFNSA`CY*~A9Z zP1U`#Zm%AJkdQ;}=cbl1=)mRQf)1ha0`vUV^_kw-nIokYz+~tvRe4VyE4VE+{H2KT zIeRxqZr{sy00wxi%Z4bwrNG1$Y4k*~2*)m!?P|cUny2X(TBuqUh{V_(96Aq%h0hQd zF*>G8lGCPpK-uGbfTcpuCB6ZsGmvj^ToP@0d)=OInk;s4mBMLgH0)|NsYKF@yJ9Gl zK_QFHArTl-m)!_5g8hWD$ynANmCJaI54xP@p1&52_dcM7~w@;S#P54aS`q^FFhK3 zcu_zkA5WD&AadWewRyvm5_nXWaG|ljUVm;|MEkbWxXb%#&GngOncCxElF^3geUdt*J_g;@20r~)5MByUE8qHn%1mUPiN0!YejZD*E@-dCz)*piL*hLj;2M~R zkYD!nS(U0f4j$?tzFCTSq-WWipADrA!ipNhE1ncSrdR#5R8Qw;&4?$#9X)vzT%J`isPp!VUER`3*?n^+0+VO_0Gob{ z^>^;Jye`GHp3iS4I>1Fu0H=fBFa8%CE_X`}EtkH`Bv;(gdt$Jsi65EdsdeR5EWpMaXv})rO+}F>}n#MKNeN#sxiKDWVQv6O}OYXtrWSsEB znDGiL$T~Pi_&4lr&qe#z9ruXs#x%2~s0!%m^T=6|?|jZyXl0WvmM{lc`?KrcQxp5T zboM_eHcq zzS}KUvUKj#>3*PN;QMahxtrm;-JtZ^ZpS|^9XJ&s$E zsZ&GV@rR{bW2>s=j-9W4_N(UN1=-n~>6E7Se{l(jFH!dJJel!vKUI(#Y}WC8j+Z{x zF8O)2F92N3_R^)AO$D)RnUk-Xw)Q_tOy|%Xve^$tSGARR2TySqPto~h`At2TZ z_KgNxL&dgV_XZrce;1Zx>fQU;%)736xim%Io?YD5pM`R!|9857ZD+9?&k1B~3deR% zFJ@Pl;micL*g}!_n%>m*Qk<up3S4K zBvFi45cvYUpri(X!|sA#N_pv7Z4`yd15 z4=iyt@Oj`)h?rXM2nb92FQVVxoWN;=>E*8qFj7Di7AL1)?R0`q9P7Eo_wEZ1LriT z-wbMe_!m+y5o%>rlxB@}%Ty=toF= z{ZowQs}q4Xq+VvlEI93Y=n`O-?kyx!^9`rHX`p2fF$Dzq(*v=sA!gW^(va^C^DV-)Ul% z*Umz3mix2adKsi>*kl^XNi6qe*Wmgze{Y^^uIi!#RvP^L-_uNsYu6K?Y&&hwpw&8k zO))}KGHCrV(>XOBQaUq1;T0;69HV@abi1D|+kKAb6>wAVt<;Wkuu%c2pZwg&$js%)1lv(p}hsc*3v0_%5Ih~Z=_a+?1()~c^kzS+f2$6m?F#$JQ6FXk-Ofhbf?$I2FcU|~|JoO>!gCI9eomnmc zehMn}qZ5YPQwSGqr2{UOc+gL=%*l|{flW<5{;-rOmr*c%(FzZX)+mxhj8=QbZca9b zyKsRw@1Ub;Nk>HCiYKv!W&DDxOJe`@xP6!8%-ucSKTE+klykTzMUdf!8Yx&zrH18; z_v)9~vyZu5y1)21QUZc(en&C7#>m3`GR4KbIPWx&$7?TuQtA}vD*E4r_5#00i=wSJ zY%W;khjK-Q*G=l+e>6y61&g!|!wPUh5PT}$C9VP_vz5Od-^B4~%L(xboKL9`kG`|% z`8ovbcS>s!PxPj0WmYyyT_OyBwn)}9rrx|pv1*+aV0w;3<-4(N`N@aYmY-X4+S{uN zS9l-WWLtBU<}5@1Xf^lQN0-m!O4f|VUC9bUprgTSor=4XzyL7CH~viUkYkH1`y5+P zH`&-?l2fiyxWe({V=l`abehatHu%reQlF?H9yDlBw7=7cDB%9a z^Ke7?U(5d~Aduwi<(Lk~sn$|fAB?g_?yb;Lyl`;g+{q@yFI#H*eRFd_B;5IrA2rQY zkk3n-=H6)PR^To0=go4@4GMz!H&`2tz~eq2^gKv1%n3|#aCom!R|trsIR&7re+I8( zo`80w(rw{GjwU_Rfu_Q^PDxJz|1Bq_m<;JFF}PI|$Dwa;@`{N$$ybKtqXZA}W+dC>_CT}rWQ#dO`)XDQ*)3r|+rG6Wf|IL-aqKWC*@s3AxXc-UB!IX2b= zesn9kYOG9&pQ~&cse&K+&<36pM7^i*tBuZiP}n!*UtGI)OK7H(LU17IWd298k-%dF zBS6X`x=dMTH1=Fz>TAJ>ZQzgJS7~K0@11Wq<=`Ke9U(+y*>k^g59ISV%wtyf=^@7r zzNg9D=8$Ut>$F2P^hEfQqoI9Z^?@&V;uRz?(5bZSP>MjbCqSyh^&r!=RPl^+2_-Lb z_f>TEYqA6H?ztdYT(@mMq4PpJ^<;dqznfqD7tsk+B_6U7tRPgBeSy7+W3k zS0lGKO<5}-O&b%)AK|!$nAX_S1HjY=b{+75G#B!a*W3il=bzI(U24JdH|q;q>DgH1 zLtA-ITdJ&IlQjg7Oj_FwU0>3l^aEp!7Y&=gzW@Pwa*=T2+DAy3;P#ME+&{0!PcI3) zmR(fCqX0AD0a9F-rKm@KK(IgZUk_qsbMzoeHF{<Hq`bR4fbtD(`B3T4KQ5yLWXVTx{6iVU=;M=~!IXig_xvZXjcYSG>B`hN zf?ZB%B(B0*W@Kn&U+5V!|4@SPG<)6=7b^PIl1BTS`49LpU2Ns#&3i;ymdM2Mo>$;3 zF}}IA8(@QJ>A1RV-eHWPRxA!#BhDNGD~_$p)~-*eYrn0NWUZ>y7kyvpp$RnQNvt4_ zIhE5unPT$TN}G28m9>E(Ae%8$j3CDMu&YdP{IqqnFu ze1m#mOFjtBk1Z6Jm1oW772gssx)NGGir&{3qa27vV=)ANs?LJ?Z-+Wdlt!O8X*z;@ znVmArlOXP+VgF1GU#X>*H_KafoRpHpMOoG`sscF+Tsb^F>}-S9Y3CWJ2dH8$Hy(HH zTQ~2_KB(vk2$iZh$(K=}quK0o%Y%1*m;q*9++`a}B7k+=pbNy2ZEf4)(-Jbk!c8Vc zz+r}47M0*Q;^tio1OhI4zZq=W?SthvawQz@a(ulq-l4ZFR+qNG7Eh?k1NJokQvJQP zOEi?#Qffe!v#(8BQYqg}ekS}#xz#oXSC=P|{l)u?YJ~0ZxTIhYRxu&ILV{2G zja0Rn$+X`bHa!hQw2nKWO0{%j;|e)N!IXzf3BNx#g<&-RTqy5Z`J zIQX!1F&sN+rWX)_JSrT>TC3?>t*oH?*u^{|rg@xGxgny6xI&9f_9Gwab@I>mZP z(r9?TU`~jHGAPS~2)18N2;X{KmDgC{i0OgRUlqp4-#-MX0Rq9R2ENz}IBUbaI-bX5 z+-PVfwR^qvV<|ehHoCFbRI0q*5BVhTYuq}8W?k9;eMHL3Qg?pKME93DdIGJ=!;Z25 zkBaK(QiV?ScirGy`mdw8Nb(K(>YTl30czZ3`I@h33jK9P3T3U|ZrUZ;hHs#DB5+0Q zuCfh;#_ski)1l8vPzi-iR-jAI(YM+RHD9OY`fiQ*Yu@;JZ*(t$2eq4uFkZWP>iccO zA?ssW*pma+;X3MxliJpOCJpzbSStj~JFQN?t!|MOqyA&CWYa!RX4F+~=EFc&Ti`Rp z?RNIkrE6$S@pTLkmHCRyKP$@aSxwca<)Nu<=(Gtjgh!w@5DFI8&5rR!leVav1u^%K zz7dgW=~M~}HQ_IPo4#`MJVBSmwQl5JTsI}aykCI?@E@b!O@m3pKXx}RUo~=jB^W7I z=Onj&gw3{S=;r2TDnqrm8&$dS)J$hPKmj` zSFlM9G=Ds^r5A1gig!B`aHG<_E+nh8e{P^pve-OaXItv<9gP@O%+fmH8l0>Z9%YAP z)x+A^CFLpRlr_Gkc%{mFbLR3v-=4dQ7suHm`Wn3RpNC1^s`hn`IsXZtmp-G1L7Aq* zd+>dm&)57pY-y?=-u_R{EDNu))u*KvvOB)Ejis>zf^$5Y^}Ic@UiBac1t&h>?D_LHXR?gs>_>S^%yIW8)S%dFd~ zDgMJlOcNA6AYmGK$zfwUW#oE^xT_ck8TTiAvphdF?bF^_ zEnPK82C zb*Le$-YWbk_hJ8ANKzPcj55fc!qB|KvPbmu4XU>Q^z`#EV1QD=1Oz%7K=*p{$bp$i z4xRJUX}QaVRNWqqbxCFmPpG?+ma4UXPnC=$V#e44SPPB_HZYFF~K0d#u@UDB%luIhYz>go? z{ed~iKFAdEL$*p2g-4IPV9G9q&{S9T@`^}^JNmN9d_maM>cq*Cb?BedcJEs;wkxP; z>rkM|35bEOjB)prDIxD#mGZhblVNc5st*`uhERk;PE)u7*7SB}-w|PCQT=sRj2S60 zpVYdR*9fk-Dr;6-uEnj8ZRA3ZpQuP|H9lyaV0q7Ol*y0Bonx-6B7D0NP%9kaBhr-|nA7i}0AHkl3(SjO9Z*r_9_;k;pVsIKF*3#@0V{N>SWHjzo^M zewEw>V7n{p5?o;|2mgW!WfxX4`W{23?ryJZp$a8-MR#UDL8GT@hV5lFn}L0R<~J2e zm7~@UEZJ=_(a&4&Pmh+NZmUz~T|-YO979&vA+JX~y?h_JJOw~@Z)BBl&*v~b2jkaI zR)v>W|H2KtGB4%PKhzBW_Wf+VG_69YW2)V+MH{Gb(Td9;OAMqNK%R<(7lj1wv8Ugk z#kaOip7BLn#kn;F2y7ASgNHkb0d3I~m+pPr9`=Ii{mzurSOR|5|Cv1s;n+~e) zBZ5L-xQKO)MyQkd%`9h(KgAYCHnTTM`jzHOVHB%$so~+`P(;sciouphiD$Mr?3RD> z+v@!YG7kucGa(Ta2M+{8(hUA3Vk|#pK+N_F`vN>&(~qdCNzkn(BQy$?HClpZg*YJf zJ^i^yXq|9`*E^r%^SB~eEt-;&9p^JhdtSa&u~>FbIiO`+S(Ud|M=mc4U66C=am;Np z%k@9Ca?Z=#f0WCR$)GkL^I~chZ$A{tKQQ&B{dZ{WE)Hj!bxQ^cx8E!otQGTEz5eqH z>dlhO)r<{QjBF%#FT*3+II8KkR{`&1!ec^f0l=OByms@5{DG>FHii}%)G_5nGDKF{ zkBE|tlOZ$otb9P$@%2xRS!?2kzsL%0H&kzaJdzkep8kboP4wj>Ly@A#hjDGCb;WVCDn<<$ zJBDFA5C|wu>>$8_GOQLkrx(9OPRPY*`~e|eK6p&O(f`$`niLo{D_)nJc@)52UzMSo z%QB~2w=UwZYoxa@_%jhW5D0fyDRt6?>N;c&Bq4Z&sc@|N*@E4nXs*2*uEZWOPakYd z-D;QhELnBFTMOCspO+1|eQUk+5cU?6;+o;n!*9V*uf!yChlAvzAPlGck(oTXjF`ea znN=+@gEDK>_b|KkqlzcFGwxYdS*wk8ix}A_QI=)BIN<45?3@@cY0oY(ej?2J#IKwX zB|iHvrE0vJ4s}nY>m4s#reENHpCwtsUe&3{6%bnnQpGoIZJb^oRZmJu-eN-|uwnN< zZT;T$+z3ITDp-SM_P{g?5B@(L#?B4#ykWU%@Qv*`qRcG-i@d4W^uM;O*6sc2TB%T$ zofZNHXq9ASo`!sy>3MF>!PM&?ANem_&U3Vo!~(X-BRbvKdK!FbML*u=;Y~>#xQ`%n z6|=*rWYcpgqu=j}j42`%Pg zIJqgqb>b*DjL=O~bhQB54Q>0(x_jgNSxgy7-;gK*fCl@U>=o=Weo01D7T>6LXJVFo z&+3ihxwlg1S4X4kXj$2}^vcDZ)N_1GJ}(ZjKX19~djlO_-rnKQ7hC)LIOIq4sgzh2 z0M4d9?&)TI_v}|)!4;3MRBXWR5bIXM`9hFf*gt5?xz5T5ZK=YpRVGZV8g?Bm#RR8WQM8AyA(7xO!l761(a=U0Mt?7wN+w3wp200o zHvsj9GoJpv5hp+Nsddp3nSQ3@48QxW%*2=H2c3luj3Cf}VTVT?Aov`R6D}oiA(gLq zs9u<50@%i!C4EOoOvZUXG@_;`cz?WnHGs-Sq;G$PppaeDGbNj$6+r^0!3+Mw_VmD# zE{^HF<|yFWKZMKn&h7UUS)V;(L9KS@$aS(rm-cTh&m#bUg9BF5m32;i`>B|Y#q(E# zF->nh($SJ4#I20B-x3=(mD7S5@!5q)tv8!Wv`&D}U?NpJ^Wc9aIkdjMs3wKJHvB#? zU(_`=tw%<<-Z%VZGIW3!KpXK!yN|$88TSymkvViC4)iI5xGeUokyhr_Wt?7?7I80< zH=4c64a*MdX%%4HSoWK9?rYYe%&}BsV$cge)&HbJ?W#a6{{Kx+61>L{T?Y1H97sO4 z>cBUSNEGqx{;k9o6UZh3md)BJdbWKsUJ}3UFy@iv=`)vbjW!OUyZsRvOvGHCtDrA{ z@W(G|mxsSgRGNyh?kB>Ht7NkfbAkbugd|~dfA%I?cxXI(j-*rXybe}>fO*hFk}}p5 zB)L7$0=Uxxi|S6bX%6bN)*F+XNO@?$m_8QiDz^YyDp6x9Oem_V2EA zo%aaM-z5!XT-!w-`7Zx4(~FSH@5JQgog`G<>1r{+TVi}1tyUiMa*8>q5ctj4M|eh= zq}Zq;HD}^4xx~HfU?Mej`MXtyNZ(e*O7Rxr{&^>l$}Sesfx>0%O|IxZ`5Ae8*d}l7 zxvHG<$Bdj7ey!hzDbcOw6y1UAo(}ZG`moCa-APX^2_%<<#q-O_MMGCW9)HfciDRk- zxns*_%-{hU=hvWv!-9@OI?xsMHn1;W#2X!aFUJ_OXc)l*P-PVrC4*T(!fkVq!Y_T= z!nwK#O-OSOng4|$3uDmG@aLWs-c(rI{82(jNlJvN8{dHTS_+~`yN6b$erJ&V zJ*a84SfP=TYg_nD{>ga3=kH9O0nD5XUo|fyzhzR+a3||U$#4@@892EKSQI; z1Xj=Rru5_Jy0pox0avL<+XHopB@J5xb4uxpwDfCFS83M|UR7cz(kn7R|2IBiylDD9 zf`<;?rX?%0@K6T$i{%WEw?+li{rnhj-0H36e;quVMm~BypRU(G6nCu6{i7nkxL$ z0ck7pm*Ybwll(<@{ zO(}`;LF*l@QR_9eVrJahLz@2J8EXG~YWw=y(l~4kkP;w{s_L%$_0o=7fxUt1Q^|0~ zh7ipg&L0`kLeju&psf!*fy2Q(RRg=K*a`z)lcs`>>D=lkB%*(ka-@EW(nuanm(~ge zH{9sslj%>Ok=xQ@kl0i#e@7@zQ)ug^a!o}9kb_mow_J_Xq5qG7tFcwQe0y5-HFVp_ zE))lzl^sXD$uCXo&8PZQ2<5PPI-(N%?O;j+P|Up?GC7Kt77xeiGpuNnNf$?Ehk_ZB zZ%DkGSW{q#6?!(^P6;D6z*Di*9WQ(~et3|%&suPc?+*ZIiGM-F;QF&(E*m(~M-d)c z+0>R@2@jNPzX&F3@%VyG?AlIDN^Ul?i?QxXe<-RwV_3%x|vY+l$xMf3xsS18!xHPfT5YF%l?o_o2kgCoUn;T5-?+z>I} z&9{_3{WkkOhVG_nHuRPPRK=zW(zQtF%a43r<=L;Bw%Ej2dx8W{C5Hw$U8;ShExc_8 z^A6tTrlWqcNbQedGt0*IOTs+rBYkB7Kg>qzV2vFjv+tihAsr05B}et_%n_}BD*Sjl z@VjB&Q&C2Hp_#gRPsn$~eKmAk3Hojv;?$mMoDte6|1)(fDUALe0&oJMPiG^69?vYk zkx#I?9j4x8P3EzbnpPPL9I>t#@2NisJ`1`XRUV*BX&tW6a0f8I@0@m}CN|s7YWJ6< zV+J+se_guZR7twN72P6 zzczQ%i=W!@a8eV84rIm#W>vh?rr?Q>>He-x|1Cxq6g-qm$~;fiy^qqb94K``nr2nJ zm0w5325~G!(#QI9tF?SLjCr|t`MLf!mi=Sc=g`2D24ANY+#G4!cybTITGY5Se(XPa zVq)fc(T}Xw_YJTK)&9D33XS*w50`NwkrV|hSDaD4(2?Q7Ht7To;&4V;xMGM=LmSyD z&pyKa*6FiV@vRWAyp`FqEzonVtcr;Cul$RL({|gPf6mk4JpwhjHB#^7##d=Ly z)HDuSeY}3%l<;J{;DTZp)WBS-)+<#Z;p)t92>-8 zNczvcGIRif#;%;KHHwc(1^@P{R?5@F?lu*4b;Y}L2b5~NSJhYt(K&tJb$&NPGK@O9 ztt8`Pl2~J`NQS465(qWw8ZnGii4}T(B;R&OO7U1lI?XCUo)ae|Ilg7o&shgIgPz!@ z*#Wytgl7j`pX6ta-VbVTz^JQAuv!JSRty?}0 za=6sV8mzQfECK)dcf(F8xD9Zty`xI(4;S;~V_vUsB#@0?krZ74_Nvz0=Cn4SM``YA zNZ;=M!z`ZQm(-a@?i)YG4zw_#RW_sFV@1iTO1v*wee`AxtgJ)R4;dlL=|vdhoaEs9 z>G!L4)i<}B*y#N)YFn)G^j5&It-}}?vjFb*(q?nouus$rA-x)d-wtmoXxVTkXMhm_ z6Ym#ImJ+O)I*NC{8m@M&9~cLWpy0aJmafeeW-XGoic%>e7Ibq{OF)*?u2!^FPK(Y|Eu+x)iH3*o;i=rb%i za=NgnJR_6%gux=OTr=YU=M&Cw-mPG0#486<@mPTM)(CU9N6)q+2vfet*cXE9TmQ>C zz;&~dy~n7UpSY3hVkzCQm%jy5ft`XJmR?dJ1qcA05KE;8N?)sva)C+RO*U67*iGd_Gh7OycIwrocH zTU4q21y4d2YXtGUoijch9JKzaA4n38K zbvK>tMq{?w(|_)J@ibnRs!*0q{j5(0E^^W|0M8T8laZM7 z!+EP8)M04!Jg23;hGz>DY?diL*?3V0p;HTh1mNAKTMnYKZuq(EEVF6;deE1JHw;fp z4Dosra?O&~p3o4s9nNP?pz~6pc zj@)3kj1G|8_P$`gq@E7lIDmS9m3<9Q?X?Sb!OZ40!oIopFGGgg_l>f%p`zyOdeiL> zrf5sp5A1B@MAik}kh)f=hA(=pw_=K+%;U z38+a9ot4Z1*KvTxPv$r&_Kc=k@Y%J(B6lE+CyO!)WXaNoAHgp#|0BT(+FcStebe>( z#6Nw(OH6C4D)z-eIs=+Mv)~_$?l)(7g7CL)U>wfcIec|^9or&s>$0bC$VlJ{6G+D` z*ED}j(FvVA&%M!EPEmI}w4Eo-6-QAR1u6V?& zm@wGR+>!uw>Fl{Y_`1CIJ1glF&eP@3y~uU_>B@O|JIUIG1BMRQkI0`)?ofUaYuTRQ zG6n12-^*uW%3bygCwB*4dJ2l~dm)h+HX?NCge(;~fIPL)RZuP~WD~n(QJ>EY5{0+b ziwqNzk7u+U7n%fcfzMFnX~Y;Dbjz`LvbJZ1qK+6^Hv*V$)9(&7x(iaLVsEEu=v_Ww z>t=uKv^}-+CI(!+`n$$;yQS^~cKYpnNj}^JJm8T28l;?L8kNE=pTbJN56iGn{fJMF z?!fDb)bkqBo$M_Q*)5o={iHNhG-b%%|M7^#F}~CL*Siz{&*|o7m$kbWIjt2jZ{!@+ zbySo#IbP`3<*qyY%*o?*l{)!wSED4%OvoFGsPH?$H9Bm9$n%ZtL~fNeg4c(hy^=Yz zzyB?UWf=S5W~9p_Cc~v-+KzF`){^l8ZS;6Rv*q*>j2P~`Df%W+og96$0>#Db=4)3w zzllDj1&GF%Jn(Y};1J}gRnsB(J(?zG;}1;qjtjYiH$3L7da$L~5mD7P1MTIO@-lm4o-Mqo~{aZ!pDn z#v*a4yh9@TU;Zjozvjh~y&rt(Vg7O+9${siBY?R5=9su{5{N)moeVwJ7EVnkB-Z4# zCX&Q~PzqTWS>Jc%A1p^yXf+Y9y6g|yqUA#FXz+3L}{&iUYa29P3>vRBH zdBu=>{QP+bQ^1gb*i({Wb81#Sn1QdorrbaGBwPJMc#~#19tB>|%N`LtV@p zz0+8{0mCDX85%|;q>Ui(hdn2!NO}u&E46mFUIzOib96S-lW%_n*NsL1PG82l5iw-3 zv4qf`=IVFotMPC!8Q=SK0bV_0y_ld}4ug zAldc%zZQc{Gy}#Eu_g@)p#2I{(4cx~nXb8h7Sw7`7r9QrkqE!ni-LN`I>M68vy^K~ z2C@@ca!tFAmw|Uv{stMYqg7Q#tS8~%)en~fLn~AKFjaNCe>FD_g9WfK(q=(p>H}?+ zt)2q8(MwkLPQjW>I<=br+BdoE;!XGYMEy+TvxjEJF+JNd2P#&sxwSSkoYF%F7DHl1 z>uFZih52lMZsI@KP1~(jY9d!?_I8R1s!+bpOazwc&Nl@-NzC|ClyK^I{dq3b6(Ln0 zq||SoisLB;;&R5N9o=mcpFmA609ltpDI=YEaA zO;>@pw!YL%@tz3-FV3msmpv}7A@^TSSKXv9P(ap}KR9fG2={8+SZf`9 zG32!IHtmwHcgkJ-GghBs_PpH|?}D{ib-+}0-lj=Ya*S7CT*=Vex6pIW*0vDuYl+WQ zI&37ND6--lAM$O2SaB)`)h_mw`2;>oq1)GQECeu=2T|NzYnHCwpv1B zP(qIX0Po%f+I_a6hPB@v`Dsya!=%f8d8yY$*L9%~1qDDzf`rr(9MgVg#Q{F+Ui7YP z5n?_rYhz)s|GjZ5gw}qu`(sd^C>ylypNzbQulJ+XkGWkYTW((>`_vRid%N=C?mR}3 zHU+^9U7tguV1~1FEkoA-ITGRRIeC9yAiz~^+*{?3M}_~Q@Lpwr8K>$4(!-}2gTs}J zChke}h(9jeYG~dESPM-qWI{q~t1KHjckeJh7kpeg{<(Ta4L!7T91|pHna(N7VkD>9 z{uL$Fhz4pZ5W%H+goii6)2`eVufB&B2&rG$oZ$Pe<=No`V9eub{_EcI>Q&vUiJN`R z^wlIhjENx96MoTO#3dJ~Z-&0%M1JzuGZ_SXd)0yll1SAu7lq>eb?sP<3}$oPuV9WQ z?_5@g0$jB;U)Me#P!A$tN9`Q^NgHs~)HI}CL@4ygK81wUJ1SmEV2X_M$1Ko2F*UXM z+jEp293!F}!bfU%*Pe->>F(z*$#)R{sr{l`B?A%7JYj@cNxGb&)kwLuM1fE=M`*23 zYHgK@WsL}n|ATq*UAkrZ21nWz?{XlZ^(h|m@@)CIW;=cK`b-Z0FK!Fe+o>n-(dqII ztu84sSVHFm+Jl{prt5Dlp&3~75)ArZ$B8A`U>Q;S(*se`N_HS>KUGv0*NlMy6@7|e zxN{EAQ|`6o7RNJ>tlhi4!QL6uJ_tX6H~WiU((SL2ZYA-9a{spkHIt@#;zh|!Dr$iF zQl;{40-X91m-#>~{=wvJf-RBx>5uw>!=d7K0Tj0%0+%9KXNd_Qzafcs_6r$_7sp1n z>EsPiA2qUX1}@EpQ&bJJsCvVTa!O&_~?0efY$exn(J-qqt$m$P%r8IZY~=sC*-&P*Kj|=R5F}sgxXxz)4m}UG_zTSPW1wu;VN#~slLANZ z$yiKAciB~CBVuSg*j^($fK%f*80ES=EDUw=xR`g!yNIa2bKZOvR6=P2Kg<kWF& zwY01xevjskMH6B39FyVMEwjghHSBFbG23l6g|bl%`FHcnM%1Gc`f@KX9f=Rw3@+FB z-#Zbyo9FlV?E^l!kvd%-)Wn7B<}*=d$`Tf3n4?j5WG&ATy}zCs%>r&v-+%aA_@3me=Ir{aM?M1WL1Twm7Fxrm=Q>YD7GwIsBS0z?kR5VS7bTb$sp2alnx& zr9UL61-)y)@GyiftD4OS4j@6HPN6WWe_t_&&l^=`%D&9$Q{3VH$la;uPp(I1ktQgI zy#Dongo;7D7p%}g4NNQve+;f>n*xcD8NYmE!8*IbO22#1(`L}{zS@=cloXyGaV&a< z#mgo<$*h;U2v7$M-@P+F%?uUdUTF=IIdh|iiCvi+auGGY@-~>nu#)qQWW~-%Hp4z6 z+*J~JQDF!B1;3aXk`i5c;y<{i%YFeWqbqGMY@L3qYJ6+=eeI|rJrO){F@hISJ|fyx zAn{tV$_L5lw6?BB`^328G-Rf`a+oMR^aD#I2gtY=Mbu*ktZGi&$ZMA9qA+FaB$tKb zt%F7uPy6`<*_c#&XcUI&SeIl+4P*TkGxswTMaE3EYMkg5_FwGZv>SR-3%Dk~WxZCJ zCW3O@4BB1zPAhx`LIpi9hbWU<4ENkIWuqRVV6NE)Lt4w^ADJRhLLV$M@>GbO}ng#=_X-#dM_L=E-xtB-o)ay?LPR2QQ8_%Ve-~0Z>d_%rTc3GjrAZjIYL6iz_xx_5 z%Vl0Oox839f;*5HNQU;}msy$B)O3LKcn3LBy^KzFOuJwvcs1-S|J-F+dP>POrqk$g zE&|wxTbp%oFMU^{9OL|X8N>ME4kg`pVL%W}H23Sf-#T`VEpVnhBBBnuB&Ja7yWltT z0iZ9`9p}loMBl2HpHfb5p;5)sSjDa6Qq|8eJxzb;@TjR+p77ZE4-H}8b<6o4=F}Gc zgod!wRI)sQKE(0YJ}=~wFSgx?QCV0|uaiN+=hyHa$6mc|HH)+AkH+8h7uoVbXBY8N#pUuxd;Rj_QG?=5Zi1M?}#ekX2|Hc=w_v4|v)-&A@1b{j{}H_#Xp# zm1f=4sBHo(b&O=*vfwUD)@ARNi+gep3}wX^SIRT3>ix;ccIl+aGgoXv%yRm-k>iDPg&30p zHFs=}Aa-+~f9%wIVb*c(o8U#eB}x1J^0HQ7oz6$><7<-jp(xRc2hEP8B(VEw#HlkJ3V>{CY8%M~HzTw4y_qt&njd*Sb+r$=xYbxx(Kjf09EmIB!?t*l z@?O{wtB812Y9#fJnc94kH^O$Gzd@WnsP+M?uSHvWy|eZX@X94T&19a19J}I{I?BGwdq%^K$ez^ib%TjSAkNes4zE~qjd8<7S3tggHMO+OA0NEaVTDXwN)n% z`oMJhWm}f6G4pkkhWV4Y^rfdMTi+!-k&`h1tOwH^G^$Aci;ph(f$h6VeEy-uP;xTmrER{lsd^MItxhzHclDHo)~)4 z{^^R<^D8C!Eiim0wL-fhW^;s3z@ileZ8W}_Q@Zf-PXY@g+|yZiOTsp2*A@AGz5PoG&Jy7SWdYv{rom%yve%0k}AlOGNZjmHI8Wv%2T zR4G@hu9wc9z(^JxYsPgwL88HuCV7DC8&m6nBiid->(u4Gu)cO6sC*Iq-WbXDFgW;@ zc)cgKvT}hoTRs%|4zLCafrzcgL#ZD2IXa_diS^}16c3RGRdn9DNfc7xWXS!OQ~RgB zfjxmdirIr*KsN?5nGHF`hvzYu8>78)!+b~cdY@QWrtx0wyRtOEaWnfG4Z|VmRUr3w zTL|}IbS+Wt3|xI28)%{FQO6#>A?CN`S5=XmRjQ<~HR|+TwgZruh%#Lehgw@RF>yWa zF}^1b?&!3no2cI&Y#i!^Y{AmE)#d6 zlIbGsI(o)&d6r8n{l}vpeUO{iY#Am)f6$<9`i~gys|0rk>S@@6?D|LyP46U1^O0Jd z!vsP@t7qYg$tlrf!{piU^5Pm&ZgT{xLRj6(cS2mU{8MjzF2@C)~s34 z_~X=nwi8}3#j<5YuD9BQ>-!D%!_GZ7--86-|1r%Rj{AG z`1{?(3lL_)l2>xY|M<+oI1vv0TE@k-DQF(vdnUN6ULj#&D=sgTIguy(-8QyCm->Yp1V+D-U%oK1e?y(2`@_$LQ)*SAPn_Ty#4ie;f zzp;FJV~xw~hC4&fnz+XEy-wDGJ^&^98q_<4DqvgkkQPPoj_>O93an=|fIEUSV=FRGpbt#C?69JyI_yT2R_ zfB@Jm9PapWoMXnY%`rRI?y{2FjiP+7?)ngx_iI?qy#KX(L8Y0oy&3IvB3>h`Q3vg1 z(~IF?N)kOV=l!FdJEvp0G7dH4(Ibp&fIOzCYJ6|VRT2f-Oqr*Bl$ z_S>wk;-44B8bMPPRBuY-d;dFBN3c?L1KTvyH1xFnR9s#+q$j>S`n-~6x-lxem3J? zY9g-xfd9Z4i=^#ZGvdRxmKw@Q!QA#*?-_+zu1MP;G&LH zJ=bLw3IkQoUG!;@!zn__1=4(5~pQ9giu>Nj7XRv z)*HAI=0*D;&x;L-d0%U?T7Rq5Fn@E((F0%L4#^{PREL@y3c18z($J}Wm0i6MtPM|( zYzfO|zRyA|mihht$w5{^#kTH+DPIG%6WZ(2_GfSZDE^c^OP06|2;#HzIrq3Xl;xOv zAU|z{t|WgnyS+s(*Ft9(+t&M>J&`Z3tz*5fSKXbyy$?!I0jGG%#T)JZ?lq6=VxtY3 zBAPa^$ZT%(ja;V-Mvh-~7f4;ykuQNx)J@8z!KN;*N;!Jy8L;@}_ETn7q z#>sGudipwmgfRT|>U~|<^mLYQ#%IJ|1hOZR4 zqrRX_e`pmDE{kERxRudGY@~|hst8pLv(_o!SqXOmH$~J}LdNnk$v;NQc+(Bp-AD!Z zV;Nhx#Un}&eX+N89)eucw{{3Vt>Cwy>A;rzdJLvOO-2ZLev)-nngLwrK^91tG`kvo%DWyg3}Dx=WUVc-rPmiX_p~_95zG9+lrL$7e}igO9#Y?f1&t zRwaTGzV)%?Z~h9boMN1urMk?`xZoKlPdiE%UORyX4vXvhrTayD6 zdPm&?vyXqS%<P3k`fP|IdMl^UU&@~r za+6d3Dg7$>R>k+-<5N*SQ?2FalOm&;)?pca zy6`Ic=T}e>EGnzIG{15&5j}r=N!Yrb)b2QVfHAjwJYj%b@KGO&;#IPzUDM`7LnVJu zagA*{98Wx!vy5LH79{e_^qYIPES^FLuL*w9@A2#A-Mi_fQZQh&=0(uX{4o8peXkQd zS-a))u`P|lrDyoL-}J=fu3jW{ zlw9#)5j3Im;M(~far=!d zb?17M5U^mTXnBT93x^%rjA-2v|6^GgGThFPTR z06FuFes-g`lra_Yi^Y!$RxYNCMFu)2-d^cDJYoA(gU;u|o`dGQU*bMy7vv_wY+^93dPs zwGcRs6DC8e{nzyG`g<_0V^pzn>*TZ#c!-Y^JQJ?P?DS65pWHi(!+^p6mC${n<)6e7 z)-IxJuv^hxchx*cKI~jHF_nVg)Xr#(peJOL3yKEQ^S@!b?V?5tb1pjn)98fq`hsVc zR~QV0J_;3>%Kx0uzYTvu+acN7;jqQkv6N@g?M_F$ua5WIou?Y)YmLS}bV&uQg;{!9GPLp4>YKc;E=VXi^RTg8vsD8rwfJW!~0_t(Nw37{`|fZ zQGkZ&g(58163~<(6p@5$^uht{ez(6&Z<6}&V!CkY_--d=X;!YxT~Q@U?}I|opC~2o zju%`v8(=@3pEzVH=Zzommb6QdpNlYCvWiA*mAh9}{v?CuSslf+?pxfl#)#Tr%#Zo+j_=sAyE_Ccx3ctqVy5LP&+22GRw2P znmpeP;W7}@@U}gMFZ`&f$M3(kye)I$MZ22oy}Zv_5P^=mcJn)0^jY!|K0;h$BqaPY zH0KW^QgxwzkA*5LN3!9>!QfEbN2r`ipS6x9h2rU`PL&rMW!&4nMQ3BByst5Fkn z{!V?(^^(Uq0=J`~#}BVAEXj1P54b$Ge~w=Zp`zPsaJnsd_EfO7fQx7(L4jTWOEL35M+HH>w~*y|{n#ytMrop#;#f0sJUYn|nkOSFG& z_qoy?7MqclfW_oziw8rSU%-(+nmcVohyts9a^K46IY>ijm8TCYs`uh`N&wl3blHJZ zGz4aL(C~;2a_gH06d|wj+5s*-eZ9%VBJD(uEecQZ!^uKktx23x%(34WM^KZm}bbKAf!kB#Tim(5JL=~ zYsmpqPUhwI0dUIK1T4f>FQPzb+TGK)P%3Bi3h05maRU7XBtATs&U%>fCLdH!D(9hN z(MuU+9r1h<59WRKDG)#B(`-}+|5|;Oy~*$dH?>MLTA%UZb)&N&r)kWkOdVaHit-vH zPnwJ;hx96)jDt#Ft+@F@)g%>`*)AOz+)AqR93!9J17C}D!xTLI?lr=;GH3672m}>3 zqbvRvn>{ojA@|9dULYYeevU`zrPLK%?!#T>wJzl@8Eq#b976e?WN z-Yq$NBJZ86g5svntYS6JmZtCM$~!PQy3v;SFLp;)Kftv3J6l~(!&oR7(XU))!0kF& zP+TSEfT@Y zxNU|rOFS^1I;cSLO6&V5k9N0=1?@)>`^yU51%wL)#J7{j z+mdnM{KhA}0l<-m=mMgVQ@3Hlzgcal-wSZ{#fD_jqi0BnDomi+OY~_>pj(V0A(NBS zptYEX)xkA>ES#SX0Bw%gX=hz9gbV7NI6nr`!do`<^c_9ig7E9R8m97_e@Sw}Ow6%S z7B-@Ub7+gSr67oso?j@$41tHC0HsN_}Ll(xzWkzg0$^V_7tgsKBA(ixfh%vDnfRU`AYMQ~S_; zQ@`FTna+fVjWvgS0v_$rqKi9B50Qz?_+JV9cEX2Bq5jLl`twxI>S-iS^gPwsX?QI) z0tK;d&er97%O$85^79YSo8h(KFJRkf7sTRb2dS=hOh-lK$r^no07DdWhx_@Zq~qF= z<5tA!Ms|`Q%6vP1xk~8Fv|>j>AqDNtru|t4kcIy!r=AgxeC6A?REW})jeF#B)I}M{ z3d7bf9XG7EkJW$uOaD}IeMbSo``kd@&wGU-Q`w*&-TV=o;C=ejf6M-3#vT^zJ(f!? zfXlF4atfPP?dda87r`yyfZKgK==?`Sl<6S`!Vfxf2eyRitl{QnW>Zn9fbuW2Ija!GK*(3jThWywhN30<5!rNw;gdoi=fhRF_`=8HSOE!w_A z8!HTSY{XcT?Tax-+3THfVHlqa(O6wG0Y1ZkC#kz~Fze++ug=dMJAtZbpX&tXX$&3w0z@(2mAJd&r6V9+}!WidbvpaN{ z+zj5;uylBbfDn-5uue?4J{d-PKWrn|ZxrLg#i1P;KZx;M`Hk9jGd^n8l;NsfJ)dY} zjD_*GT*xCia3+}M@#9HJbe*-rN^v$xt6r%dt=Z)S$Ku!+V(Z&v$Xz%bb&d; z`P#kqe#t=2uu%}acE)~CP-KwHTk1IakdR(Nqe8P=Vu=>KhhFzD*eIX`Tz=eE^b|J; zLaDXK=8POX*Ee!q^cpUy*D+l&S24lHmiIA&^*1(;Sajw|N!&hyDVUj7|t z>Vn{bF!Am2Y^MZjKX{4yYmWa4VRg+#eVrua`X|>jVOgyC zI_vNVEBn3k<%r8oKYJw>%0h5*O8t&T1|kcofGvR?@!rHcUIr757_ho?v=Sog+LqYx zKKv4CeFc*{S4&Q>jj7BTP5v*u;YvAV97{uNercD^+2mQ3FB3p z2b%#Djo)sfJA9`PDS%ejzS<0d=nmw+&#^qjoZT7w!QpZ;IA_NiVsOdN;h`Q6ESeAj zLl{9F+pAQ$x^~S}?b=^6t=-rRb7t`V-cHeA*&M-xr?;P}!*dKvwBf^?>St>NwFsyv zo?nR-UMGai*t>r740k(c2dyk+j(4Foc-ZO|JOq7-)k&dFF2>xQT>t(sEW&Va{!pE7 zJ0H-)*?KKjHm1+SJKnf#^Kb!Z@|-YFV?=d7*L`o7vr~I{;jDGyjR05oqqb`ly5+30 zQ?0(ogHi%dsl~tfXA}@wa(a=h4D!|y>FO~{JYIgZJ7=;J#=;m!@xmIPjmtPZrLfh6 z_?Xn(+k$tJC#|+_pCDJ|iQYlLDHi{OQ>a;!Tx!OvuvlgcP#Y6 z4TM~a(FrezS3sRuQ7(CK^*FkJ0DK{lcA6zDF_XqWytnIf9V0k zd!cJ0p~G3sC>(G(Hp1p2r|PdUsjdloC{UT}w!$NWiRT~rhQgWUJ)BIHAMea-mObS< zBIqM@d2*-JVOZ%?pB49q?>0_ZmLc}MXkA!bbZuPFZnwp&V5ow@vh1sjxhvHoB*An( zdC`{9Ivc|&r!q{ZTEVgg@eb4Ws(sLHOh+JE8K}6@g3udRgER_yC&~(wFCfsXXwW)1 zdy0AzJ+?;m7k`SU!pQ!=3_<_@pmYN8qHv9Y3Pyv>hELXqOy1zv9wECD_ zjx(gXrz1KVWLw#aD$tjF6A~Pof3tXCg8B!wHoGepzzjl#*6f(?%6O3#xwQ+9;Y))E@+Q zo+`VI?|syApJ>Mv<_Q_TMCZ?W@@F`_q#jaR*MI)v= ztq$4?K*pM@W-Z>-EZ>6m6A|qtU&QtoAQo*&CAbDH92!wPzEpBq4$UY&B)Pw99y6G@ zORQwfBP2o;CLj3f35w=Q@kGNtVu=kCn+PmDXYM-izAB(!eAE-4uH>sXx@MrL)Quik zmSE!_&@*w1?an8hx?@~Oy8h_%NKD!&b?rKIKup{S-mtS5h_t+d!9>j~Kzsh>DGf1$ zb?~JFQs?9sBx{KTS<^0!cg$MU=1;NtP}2CEHE(^9*;}&_DvzW?ET(auE=sk`#4HPXTBfESZe zDUa&A#oFF9_8z(xe0eY?61l|l_(rjD+LJv0+WqJIg-RM z(-8R&J(WI9MdJ~nKqaWL&*yE{%(n{~3d}ks^IINO@hTvCWp1%n@R9DaKHiN%^!Nf#lI-d@N+YGpY1b(n*WO(O~qA z>tz7Zn)<&CZH)l8QhaF{H{7yB4etMF(QNg1lJj$tZJ;hcb9F9I++0jE&s5cF4b1SN zm)pabQSx9meJNmyN1ytds{8I=aR>gw0;aO{-FArJsCk(>V8Qo02K73{;-ADpBdDC*nzN?Y0?tpL6va%D zwrPr*%Vw^bu7+0cvgVL$gXOEI#h&C%`>r+;iY|j+LH}Iq1`)7@|1_*a4Dawr?gOT_ zHJ00Gt>AO*_-X=kKa2y_X~;WC4Ts8da_KE{$QxUia3R^UK=vkt&3EV+W@@_A)xVdC zwr}^(X?EdOd9V574|>H`OB2J@9C#2ix?i}t1an4(9Li?2ql<&~!m81vt=%$P8gOW2 zOgBOVUt9Ly5AVmIUiU0n%hkP){j9`7x$?l~)^+ztg$eM7T;5N*WXgkLyt0fCb3lM) zPsIH@-fYw|1KK6?kUt;5?k9H4aZ76-HtfcknyTe)Dbtz~nXi|l=t>`&wSgyJe`s(` z3Izn6ba7j*|7!7aVwQAp5Gop{h!o}4+l$s-b8;ac&#y$KwNKpe8W<#MOo{sTyNTzn8jD`ZtWX4DKCPAh~K6d;~N^?vk;t0%*)KWwzX<_;}Th zRhvRpy^MJ|hxvTDLI9qD=%uR+)4H^@VLKlO=DONo`TcXS)QR4B#} z*|hPLI~|xLJ|wg8xk|UEy#n+(5eb{6zlWUF+%_-Y^1y`MtEwbj;`F(0o-X^1)X1Ao z-nBQ|U@%t-n*vEOfC)(h=G|7l?>hEzcdAn2S6iLhl~VTSjI1)VujiVh zSH6KUUV#{+B+k;rXbRtiELZ$$N6>pRewqG-&qrCl!S`!LjSTXd!}!(L!_~;5G1_`S zaV`ANV1clhrpT99vx3h*n+{WgIpOEZh_VzsM{%O68t>P7NBZvI9=L60R0`RC%e{JW z2H62h)lTw*I?PX^n6Gy&aqpZUJKo>2;P);P<7RRnkLxE44;pJWUh7wXa${zja^i} z_AR(UQMlhQrfZ#R9821|C(Rc3Dg}TGRTfmAmfSY%K4@v5*;>2dENg9YI;}U)^*j5< zIPOere;Q_%v2HXl?P=74|FSxD9gS$Z%z23@oj3E#{(j=xYK|d;pl>O+SYP{1ks3&{ z3)8GU?Rc${UO~I(#m;GuS-zBU>%V6lHVc#TT3<3kjwV0!(sQmK)cilo$kh5J+b+{u zXWJeYNV#dA5bx)HAud1oeA!apzy19-ie9|dIM6sJdi!hWF)iD|z%l+!GCy42Z-Sl+>ekayf) z?hAnVX8VBU;Bjr-`w$kQEJpWWeR2onJ|WJtyPv?WwTeRXe-~$qEhT5Xx($TeG8gT zyKVnXmBGdoh}LD^tEsNMuTY)&Y~c4*6ZDb2WQu7lu7szY04_6e;BfO;0gm$gsGBTs zjL;A+wMvX*GO1tA zU*7u3CLTM@M}Xf1Z@`e+-DhP|@>l5OukcL6WG$3v_E!<5$ja6jZuwU->Dt)~3_v?! zjEZbc&yPI?eDk5IDbWJCw}k)3Q;#Z>!vCIfndzTAtMcMK|ESqP*?W#_DK;}P?>NPzfWkt2~Yt5#~?spp4G3rR7L z6dVSU3*JRCCVJ74*lB$`rn6fcUN=*649o&yZz(^Fp^r%Ih8@Le}6z9 zuT%bNT^6T)8PLbPx?dm#Prr?nb21#;^F2X_RJD1*eo2)6y5*gs`3zzHX^ki0%x$jb zB8`jgO}%&rN&%db8CHs2tzV_;Gp?cae-rGzlJxp&u+?$~Y|ZWO{0+LzebFHK-5V{Bhyu;1RQyw_In0xY(56gqzDmq%{5U5K$bUs z$bWw3{DZSj0iv%F;VsK9MY|)`(`@WFzdjb;c)p|9SbaGXA4qG_`Tm@Z<8vX)v~vOj z7*W-POxf?Na78G8G9|0Zw&&N6|)kbB}V_bD}`G8Wn}n~;+hmk+C0seQV|tf|D!Qe_aPU#Us{o=0)EwtatN zqnSrhrK{Z)An7=j|42&6&o09lOFvVLf$|+6$1L~Qsb^+RY9~4;@ z1J9C}^t=0mfDaLD*q`q(U$P|;WVVkX+PP#fE=D3myfs=0IgL4>fbU21QXK2u)R5=% znt{&vpzn0TOY2PWqC08MU#1F+U4fikP`^)hT3t<({>TZ<=e$+I#|NoY>53TD{D4jh z>Sz|Id}B0opg3vlo+z!WG;E1WrcV`+7+Nxao-V#-4f~`ruM$DH~YeYLy*zdo_Y}9Tu zP7B>hX{=(|bK!dCPSAF?T13)h-mgHLWY`cjpP8_K+^Ic*-D(;3x&V32ALE>smHL%` ziELgm*kpAekQ4R_n!@SW@)f`B-YhF;);8a4h@5DIG7Bs;nFJOWTffopO3c&6YhU-* z?HTivWf?FnqNc_bQfu;}p3jpA33bSv>aE5|g~C9ca#xq5oOr*Qb0gW3YqhbGliGVj zg;o6mpzXhXrlwgNu(=4^v=`{b`^(R64+S*cRVX3|q71KQmOnh07^D}oJmCrfVqh60Ax--*XKYB zc|U!uPg<{ocStT7R-@zQw8odU{CL9*pP|$A~foD;%e~zgvCUXnrYXe4RXsj{a&2D1D+>EKEa*y2kt+S)IG10HuT-Gxh z))Fb;mx}#p#rb(X6TTTW#MQN%QKn0&SEU-zm}UA+rJ{Z%4*HpSmVd2Nf114c6oD!IzC$$=o{C%0ZT4g<~c9Jc}2<3bvbd1G#U?7*!?|>|*EI zxq=mhBFlSM=kL;LUdIcG839PS-4FFT&5_hT6_<*huozQLM!VjeR|-qOeo*&t?8gOF zN09)T&x|7mSc-Ust4*axQF#qaNkQ84jh?R-`Y2KokEHs~F_=tr((DnF4?9)VU2ouN z6?!jKi}J%|DwI1buu}S+69UnKy+9v0F=XwzLQ7w`jV%;rP2qSpoNxLE$j}XtN&GW6 zJ9Wk-g1m3(>SJA*=DgXbt`$c(WtR1<^h#H_YRH)swKCmhUid1ExMcLzR!+^T@-z`; zE8$p)O$Dxi^7tqJ)Qs5L!WB=%GhW$Dz!b$IX1N)DqzqQJrDh*jrI zUikSEH(}8nW4+C#DU-9NYLuCCeo+1_g71WJGN|3eR)h`JtG$>RJi0uDbIWEJf4wMHLSnH$Sf-XcsVoo(K z#tw0J8Kn`A_dK~i14YZ?I}Mb9J4qoH)2~n%@ibrTmGT0XiTr!hnTwgq*_5QkT~AW_ z(refGiN_Nwhv#m75{tFGsa47kQ@O$&R-j-C@QW+g!NpsElkeb}Ed6+5;B}`J%?j6nTw(?(*u&7-ELo6p}7Y>ow&%?l( zrnPPH1zVj|rWtYaDW`W51Mzd}s-?(&9b(1!Kx8FBHb?4Jsq-TWavHh6>WO_gSwTyY zZZeI&41D`Sc2+)&%ChS#CV?{rMMe~^u}jbt@Dm60{wISLgQ!E5TRP(^4stqfA1 zyp~5X-eFf_KcVeC+2f(WK|@1o{)cXU*#DY^UozW(;B_k|LrOS1ETjN`gY!BuRQkY3 z8-n(HnT u{01H^hw7)tTC*l0GTBI5zpccARqwKYmBYMIDIF<#ZN! zvs@?#R`0pV(Nq|)o#BT%Vl>5U;-v!kS9lirx${rX5exrbcDGDu6XmOu{~>DvcUsM~ ze3}>+Wrd{|SRS9QLb2lF)CE3RbDx$N$-&`Lj-NM1R~Q_v_0df~;N-1iG=FE&E}1!8 z>)nix){morn5&uPmuer5>2oH1P_v$>=h#@cG?00z*zbirsUuRnqa~jlaY>(Ue=vzy zuJc*mwTId6!V4a{G=A3U$qyMm_I3!Q?Njft)%&%Meb1Hey7wl8Lk`s%OnRo;tWHcb z!tn9%_;$FW<~iLQgDw~e362QgeODiZB~tHyf=-ws!zyxAZX{Cw7J9%x*$B5n*ymaRFccsuqtNh7gM!u-Uq=jpF4VJ2uy;t1GDvCV|>7&pZ zuZJ|?vy0canUrSM0-QR{nIt?dqRNd42X1{U5}*3jEtt{S)keAlYU_jSuFOF0wDJdY zl!1krh7(SnqKwgbDI(UY@kBZdF+aNlfg^d-f87mEUg-GKxPaYMQ#i5-B_sA^DSKDE ztxD=EUi&X;W5VzHm;{Eb+x9qII8CeHwO717On%2Y1u+E)rmC1&?I*q7f3d zE8>WSRcEBy*pI2)K0ZaHvU78ucIEH7oUnRIAz&kPr2g6%NO|?RY&ijcr_u#@7rgrG zBzMx(!fnv>on!*ZX`$Ku)yI<-fkt6}vDfLSD4jrJ`}NaWx8{NXI$B&Wa`N;a*_tB6 zmCg0H~A4QVh>8$jDYg0`d3B4 z1n&0u`?;{nI)7}9k82rf!8e|lzF&)dM@w0jM}m3(!rdgx9bOah5o_NXS7eUPnB+BA zeX>1SYhwrWuY;=KRU}OO@4<`B_MN5Yi2`0($7iRR$QlO+y|}v6>5~g86XRXiCwGau za7}KaOCk3M?n^H(!73H=%Sh3H3t=srl=igkftCr1kSF!ySMvMTnpP?#D@6Ciz;*G}lMP`o;@~fBv)nco-xjl$x zOaH(WNPv5Ac+F~2{A|5l2{~pw&)EN`5}Th&h>e+Xdv?%?QZu}dUeSz7qIR#K)3(l& zj3N)=8xm&96EFq8DVTgZbawT7S;^L%!TfNmynj0}>n5vOIjdoU%}1hCirXmrkO<;h zQCq;T%tXGiJ3^(e<2&mxa=VMT7uhx8F>Q+Vuo$H({0d?oyy5J|J!ewhqLdFC3WcdoxX&JtB&;#QH?KF(+9*SZt_z zV}b-Qc*4`vuZKX&y9VZ*-aT+cPgT9xUp{2-dg^BG`n!4Qk!z3&H1(~es%hbj&skD_ zM0w3q1%0KjIV7gi4P{crCi^oV*2mq#1bO%9|BKx6|9WOd7)@xV56qM36w2m@?6Q^b zNuR+Fb;Fxl?WcT}>zi9Irprm?biALn_^QRRa^`kz|K#hFS88h6Ch#VG)v!s(=xo0! z!X{vRkYTvzr9FEp4}c1jCgqlnNKBzVMXm3I!XGV*rfoDTv1-9DzEvD56i2EuK53o7~#=5nXG8SUjIcxohxy4lw?P06c7EiIjJM(W*Pc|U;` zg^8QW6Ow1Mx3D5NBhZEZZ}HVn`GAi*ni8Tiz*o)i2!7}w4@h=OgFZVfG>6 zt<4k?K3Hb&epWKfI&;cA+9}0ZKC17i509?P(eBNU&kFt7du!htA|6r-GTXx_&B5HQ zj&4aCw@xAsBhR5;Exex1;Kz>>m2R!qYg!d2w|%RIY!rl!^wG-SLuSRiuAOTxeIa(g zwXknpjsU_0hOhk$$0a1m(0X>yKflL$AQ_ULEsq!35%S)pSXdRh8o4be=J>C8&U*H7 z@tIsJI)UT1H-^6ZteDT~s2F>rFvzVvl#Qfl>m)t>UT-8D1eBLa5@>^bK{;ymhzkIn zp%OT@_#6v)dn9%}z_4@DnxxgG8zQKbi_CXo;0C3yJ^e~e$goZ;!)spqNQd}#6rkv> zIf)dH^L4|P0Y}KyCC>l(8M)TTQGp$+F26d$mS?^A8~q&k$y|s&^BnxSx=siDXMM=V z1Kp`gii?OgL59Mv0r@=2_uh@a#%z5jvkQY1Xc3=iyG?u0a1_*EqP^~ZP9(4C$bGyE zQh*aageIUKMqjOjgDs;$NwH+A7?WqZsbVP+(hFEm25F2sY{j9n+LTn8=s~(CE_i% z{k(D${{!HY95I{5YB&5-KNN&i_WS(Y+c{I@)@WuwpX% zDtkc0^&)Dq+CcOR^-!Nr?Duez>yc%8k#Gx23&8~Fu&{!Af|~W!O4g$o)=?WvNN_dG&87LEWlfs7YwS+cEtt z@5lS>%t$6Zq@L46dFVQkD?*+#xj13OZA*D_zOu*Vz<5yF7C#ujXcDm8;$113oy-yQ z%~NHHQzTFIgzuh#)^^Z*wN%eAD%-*{FQ{2Mcn!Ja=r zN}V%XRwX^b+ZD6Vo~D3&|B~8WN@J)!ebAKnY9@J9bYi2`wYTUbID^f{aNzWir2F~J z(H$aaUIEA_9%|f^ba}OcUGBwwb5pyv{e$>!Wm0U=oS(K^uF`&Xf@@RRY^Bzz;pyyS zgP7|Pj2)RL1?&|l(7xFcy6&FTcN=hdF{-f$I05~vh;aftThfdT$&*Sg zp!^}cwbMpdYYCN_PX$K*yeeT?9FP^M-SCdP{qk;lxCQ&k!bG3R@sKsrEx+;sj_M)W z%4Z_y#$qpy#*jSnSYpWBH(2h?Y3Pk+q-H&{7&<#Q_AdEWAftWPNb9x+%Dd^z!dcnt zlUI`??mIl*@v{2$@%0Ho_N&_cY|qOl(@Lf$6>2_A>nunmIqcyp zR+M5_Z2~kYC~93?=dxx)t>cUf5wIkj|Iai)CfrsXQ?^UGaw357cC?Rt^4I=#{r_b0 zMZSPbF@qr|!l8bjFc0=r_FeoO7)Ycsw?>dk1i9cp!8nxIfbjm4)Q85HVeg`fzM9)K z*#7nEEZ`!Lk2k{(7Il3vjuPRYm|@S#$o*RGse+Jc!=BMyu`UHxw3Xf7SGB`inj{fu zae~cmVP-U=%t=2@R6F;u@2qoXt`U%5>}(KB@s5VYZJ1_d0sF z4{Rxfx}*yF2yqR@WuRoRj-=Tcd}dDU`@H9pmgA>p#O?(xjHCO8BT+5oEsO#&rZkC< zr@=GIGP$~L*&t1sQyrF5sl1>jxR6t(b-sgJZL}7VQ}J&ZytZqP4NHr5ZN-U>QgY#; z(5{F^Qo!K7iw`*`Q5glzjKOCTG?0o1QZJL8^Y0leKIFYWl!wsz@m6sGUf~k{4-^66 zz4ysHlj%*37>lw1g_ZBfR0V3pc@EicxCGe5T>ys?4^M-vWyJUGI-1mClSN#K=SGL+ z%txn2J##V&n;2}+-|Fjo@7~w2OL4)K`FVxhu0C&(p0P=i5GL3uK{qt{2lSo-`gLf)je)r=(+N-riA7O2VOoEg?#63uTl^Zm)DC1J$5@nWtgIU`bP(mwAa z+2|S!p*q_E{dn_f{G{tG*HQC|Hjcbl05PuRXYhghz4zcbfA$}96{cX>)Aga+A6X(> z52RYwCSH4_NJ{%YJiw`Dd1DveyeMfRXqD{>J66id9j0E9N?}qpQKHWN>|AUIVYm3H zuQvY5J;r1B)_$UG<0FMA^0;q`$bRN3eR)xJv*+9 z*c=qVyBYHa9j*EEd%NcQvxmdCU5{)>b0;8A8ENN7w^6+Pj0Xuo4p(2nlz92cP8*n z+<3XVe@nX440v84Y>ZP1FQZVc7qjujffaAVw(L-mTpktq>G?*nIQU{ls3bfFZ7pDs zU{%uad}X4~>UFjQDvOplLGYJ(K-==Bcqa8;T}8Hhy9S}dkk{OivgRrpdWt%3!5@Yd0Y&VYTAnTInR@>zx({*o zONIFH6s|iCmtS@gkj$gSsDW9-t)Wm}TI7pXr5P?js_32R-s-hR$y_I-u4s=C|x zkTkGR!2B6xyOOC{^{bo1SZE%Wi<5w#Q3!peRv18h60M^!X{XMFN(W=x*@l6i#4~C3 zP_l-c{LPUSa9+VsImXPU@5qBYP9IzM7lPLkftVI2?H1F)mKVwTjn4ieo(O;qWs8uN zoWu4Qs%RNU&TjpRKK@oNxzYekmJ7$DO+|AGi{H7Y+|?J^&n7M)lIDrfnK?4%u@hQzVZ@r99(TA3U0OjBP{#bJC~RC)!N7 z`*-ZuU8;tW!~~?+5lO@z6UQM`4E#yz0zOmqO7>DcFS!O+8F5!$tjPE$FtjjP(W)pv z4dIjLA+SGNwZ3pWK)_R28e0CgoPC8Ignkd}!Ejhab*P!&ZDgoka+pn5v*VFrn@VyU zOk?G{XuIy=e4GDk%=FW_UfP7^a{~=59jD9LCKM@jSh>@5eluXRXXaCWC$&DVg{V^6{&wtM%`ADVs+|7r*n@sOl@P)Nkg?fUI~&>Z&aT}QiFE@Nl~D$_=X zr}x>HQ}I{%`w(N1QlqYcqcOK4npbHLNq)HAXao%yGLHhhGyJmp#m-65QnYktwkpyo zZs@J|%0vGC@%;AYNj_Di>3 zM|r2+cgTKIq0oYg5l0BQ*DRsDYT3~=S0apIwk0)pdJI3iy^>0q;*R%9HKIptKq{_Z z^h}gp2d?+N!uazpbk8q@W=K1d)owCr?G`hw(5#lN`ttF5#y%I>KSlX`KB=7H{PyLUrBb%1&a7P#zO@jFOGd|zTj|ao)eN;CdWvJ_WUw?b+K*4 zgk>(HwBeM#@l2!Rod&1N`cpY=$s4L4H<|!POX%O(i|%n#-R@e*>}lL$HM_eh=9m$q z>gW88-YZ=8Ci6A7`7Xg{CB+O~_uO!A9TR6^Z@#m>n}tRa?D^Yh%W{a8?ut=Y?>WD# z&R|t&a7Dg=cihErdHY$Iitw|ThQ7$>S2{-Cf2s?QTf23ihQ^=wSFAuOFzG<6|*5b_bq#r-t8ULx^pj~R@*-#&JNc0 z#tiz(!Wh4c>D7^*m@arvPP6>AASQql^RhfAu;#~ldJ$%tf z{awO!l2`gIr+%fQD9f&I^_jAIYk)F;RfKFZI-LxoP`c?}^goLyqGYHx_S?$D=JvCW zXSVrY)~m5w)0?{GzEiwJMuthvwph~&Pl_YT{jWSlz}@^hj4Srv2>|o^wCf|8t4T#Z z?O!`l#?q95E4b4NBTfkFJ5n#nKjvBkl-3f|iufWaMWPQceCx;-_kU&3jK*_c1uKIZENuj5(b(={z7v0&P1NA%; z=hAaJJ3+46Pt+jN>MS$oRFhOOHJmqh&{&h%!lgt%UU&o0oIBs-}}zy0KdoUJZYhX&D80qAFK{7<$uN?!V52VIqs&PLoC(@X z3smVSW3A6D225bts2c%wp8r`Sbdh<9y>4-P7je?4ZCCphOavYD!9JwB9+J%4qS`Q5 zd&Kb65+t;L^EII5vwqvOye;`s;qz_J11<8z_3@M6*35g@#}d>Bq5T8+VBz8Hdt;`!8CDr#p=z56YhoW+GdbW@5ZMdAP35m4deiO#6ppLU7(gd2BHj# zJMkI*Nt=9sblN6&Eoa-CgZ6&!-ntdU29OYgl_=_TmI)2qic3iKbvLvcPBHe-r6=lpxa$9W6r&ADFakXAC-Fv66h0%<^ zSjD5Ro_Q4qbWACSvpCPT z88W(sRq>p(7c)V5NwEH&+@-$HzaRx&g?Jr4m^3I1T%9dLP5AV9zd6UmdRL|Jv@B;} zEm&Jma`iI>K~zaqpr>`apS?Z=1}>gneHh2Y1&DGQ>rX1cT@2L*eB=D~Q`-(wspGVb z7k`Kr_4epH->i-5A){)DzupZ0nlp^#vMClmB>c$mW2A|oq&Jl0cArMW!kwDNVaE+8 z4coVTdSa0$$4E|6mqZlvFvO(4x&UMOwR8`+Sa4i<)9ef#V#}tywS40}*!;b)i6^rp z-KE1_(r@)ohFv+UjO?j^iZ#bUpt>+IKHlCKK3y?ki@a`NL0k9t8PzZ&!CRnddD(}s z!olMLlM~N0d&!8uSBYzfk=uoS{---16zH)`8(W&`ldWdtDNySu8O$lru=e{%90GsE z=PKHxQ3TtxVc;)lUt1UVtOWdUG@7_~HhFkZ+Q-9K;j>@vtnqB)yjfW*%_Kouy2(vU z-|9Pxwp_1-mC=+1JwZhT`6-ZV(I9=>}6!C_1p zOwG88WnvqtP2WF^E{|3?p2nI&4{cn91ZD7EGLH|??=Ajs6;;& zc654P9yfLlwAKBYEAjQPm?^2I$Os&4th(Y)@q);MswOEm>g~_Qc{+2BgSy2cCip;R z+#X}vbwlC+*m%OszHe#)W2mLprPmQOz!5i#Spk>KT{ zy$A4i;?QQjre)Sm(Kqyc4W9!c(R#qsLjY51kF&J`4|b05G$0kiOe8YmM_IzaCCjrQ zLua}hesZT(ou{f0a7h*UUeg?FnK^!-8s#}7gGtH+ai5r89GR|Iu_oaP#M59$MgmrH z+r>!>v?NJ{yjE5^@A^GsbekEq%GIhDkA1ot5cxEiI+VvXoW!J#X83yjsuet_YtVa3 zRTkJ+n~=^7v|0`#9e2mRaJN6!U2q9&tK12QLyqmoRO)kp~(LoUM-}m zY>F74yUJy-N=oTfxm^v4Rk!l`6p*A?->Mfx@}~Y}^h5P-qkNZJc`dP@tDP(S2f~_< zZ4*uu;~>zgSQ@ZUHf$$YfudM<8X@al`)7(ns?5-@KNs)*Cn@XCQ}VoFN-Y_gg4PCy0BH(|{PP1?l%@=CWwJ>R_@L=MuvtizeI)OeHxLG>3@^&_67Y2==-xm z?(S_H8fj0@cj?7q^e`7F)|b??<0~k?6t8=VkTZLOSsm$=sd>@*2DBx6>psQ`bJu;P z`OotyOt4CtYg-i3FGl`Y@_lK=UbgT3L?3OK`#Rrg&l^K$YsK<&8T2#Qw5{)C z!PbrB>FD`14$1ry1Sc=b+@)}QIkb%2H_!;St z5!z;_L1ZBRuQ2HmDX~Aouoam=9+gs9t+jfN<3V3 zw1(&MWKbmq<*gZK7pXrJgc9)b8);(UQ04!C4vo17W4v1OO^+yAV|83TGEnJ`i#g|( z%lX#xjSVZJW&9Qg_d7}td$sGcpy-ahmAQoDjLU%Lk5P{NqX9Jh2T9uPlb*z%vqtR$ zAK*f#BGTx6{NiA)Q-g`FG2f6&c?z67IqMHvjcxO7_`znLo@nV8R}2ruFX8UO&1P>p z#3)4cCf#r|lf~oW#<8CKf7X4yYQr*Kv}s{h!L;_*YH1s53?o>Olv2r)@bK{)Cdb25 z`6Ti2ql@?ALROw|aWF*=E5xt7na8V6~ zouIWg;Eeiar^|*AQkMFps@gj2YX{}&`RK2XUb%8~LZn5Cv1qIPYrJSoXB~TzxkC+U zR4SX@eo7em7|k1#f+f2kJtWkT>*%-UKtSD}3Qdl?6Te8q$0llO6wAlWj6U$} zns^sghu<0uQekJ&tKp)vE8UyWp0;Ph_1az8mca+4A=M#=I}R`A00h_wr%iEEJ8rX9V2;WsUFr`UU>*FcQ*t(A~+jH9qRKl~Lub7dMH&n%Z(6#}2IS|QOb ze}EN|fPGI5ZJw=9p83=g@ivO>5WrFYz0J9*YGn#2hmNNAyR4qSobqk2aqe()IfmZ0 zDJ!BrP2sBqS+H%Wy06gRBL#9kye)8?I_}i^V92mH({THqqig0A8dlHwbjJv3y zOwMAf=@|V_Dj4=Or}3((dr*?v@qyHdY4ayty|IsS?vbC?vQbmd4y3WQZuTiwlN>Eh z?tgfEjH7f8nk_i%h<|ZXBOMVnsizc zU}NYmd-1XKRcH3w_G;W5O4o!Q(cmV?&PN@DBrISW7dfV9xY6S~46YLsiikZJF(_swJQ6ocCYy;x<(2}AMeAcM?0cs|~=y_{VPcgN9 zLacTNmw3cm%?-E`FxeC35Tahjdv$h7?ho-vb&TPw(ikU)^2fzN;6kZqjUV}|F#7qj zspeXihRR;lm;`B7I6?T}DnzWx0|JTQO z`#o1J9TozwbBDPrp`8n9ZX@n$a+Yh8c8>G0qFy*1Xoj zF&)0-(B~sGc@H`OIJH=s*ih}%9GeXZJJM_-)|9CLLifPJRp4}YTc=1Ob5)hMz;+8# zpG@gCo|X|jpY%JhXBfW?xJEjrA7VBhkhg3Z(SF}g=>Y=7dGDGwjQ+ma!X$C#ZeRCg zgmN@g`y5s0URsCNG=j`n)>4U4G3^;J%#7{;#Tbryx*Hp5J%_T||4#I}$~-;iZ`g$Z z;e>-Yj5b&DPhln{*AO#ArwJkzV))xYh!97oYmo<7!*8x6P}S~R3iAgFjr-0Av7D%o|e6>gMOF+ZR3|TsMkA`YVXQzzqUu&5VU)r0=clNxIPh$VX@>L0rW`8Q|655XYMV5{A6)K2|yF`n44smb& z(tTi5VWlew)GD~qeQP9*tzbQ^;eqJvdp?3J?)BHcKGF#lk1q-kIvk_1%)XP(@EL+;2OO$zkGTX($a;khoa zh&k^@;nKh37#?fyC|0FBE+f^>UkET(hq1&zFfKL^X6fxU9R4|48!4?TZ&#fgJ_`0d z)ICpYy^v?`^e85zC`i8%R+veOQVqie*r{sRpufjv|9PNX3#DNG#nP5kUvj5V$ z_$Ow@b6vaMqoZOqu~D$pGv^e42S|ir+$|t^2=wqBC$MO*gH9c~wRwac@lGb5w#(O>H=H+b-uThHi3D$ekk|mzuGar!W;6{tt~%6%FT92*=6ZYaR%SDT6$Ttl z_&3+tDJ)#Ha)V=efRUCC>822TU<(~+?zzFOYu6IXZ19FKDTZHkGF4ZSO0o5%bfKuQQ@Ok-6n{=k#Xb99`%f}}U_CNme zkI=KztF9VxPY6TyUt7ZCXzL38TSPE!xh+ZJFq%q$T#ACpE|C* z>!oQE@Ykq_ULTceAqJC?^DOhEKC`HQs!z%XDs6G4$-kzuloQGVu2p)wop#x-T$EC| zyVx33(&=O$veeBP;)pp+kx5fD&n47!m2id=hb@USZO8y+`A}=!cIOb#a$j^&+vIbo z6A*T2jhvG@#yn;(e#a)d^&!lChxm0db8hUdIRXBk!)%8><`|GKDc^U5AQ#O-9K)d-bWX14-4fw8)zFsYV5T%7tMq+zYSI|F zwb)UpeyuXag`kn$vVTHQ>+Ii0$K$-e8=U)1%X_8<4S?&yLFK*XCU+7_DPjB!jc<$% z1$OmkAs_{k=;sFRy`9W@hbMa6m&Bk7WWn7Btj`Pt&)pqsCG97NUZju2klU?5-`i7>LZ zCKvG!2CAx#7-Ks1gpAz))+m5q?(=)RQO>wMz3|!j zv!01uX)l(EqavAd{|{wf71UPOK-&VPNO6av#VJtS9f~^?C{A&TJHcIw6e$kH-CY93 zo#5{7L4yRs%{OzO@11|nOWsdr?{$_c(@8xq9}##uN&scAo(zsFaSYn)JoSY%2EM60 zk2*7v7kj3;qvSB0x{ve7?&D*d#pJSVFOIhkY@p zZfLo&L`{v#A6$M0T8f4!Gh~Q@nG$|*YdIqMzBbxO`cWQ0S_XgNkTend1yr;?)S$UTg zsLbP+|GjxeKJsHtSK|d~e&CSQR7(%ue&_eARg}kzWxJVC$Bn~41}lyG7LD*HGg2ns zng$Kw#To4B5ivS@Q295Y0WJFu-S4@a3ydrZ?VNrHez9?%gPw-Fr@)=j-M}A<3 zmJ}(5YrF9wh(&h$l^}j}4%_$a(bFb`HYI83a*+AC{c2cxFr@aou>*NnCkmRYBq2r8 zlU4)j5IMhkb)Xo%YS}dv>ZkZiT^Sn$^1)AnB#AKwh@fb#*bh><<;@XS2fRk|JNrpK zxsRI}m3xa(Q?$`a*()Be_MO|#>{qnh1Sdyjp9{F{u%m`L@>EA=wO`sOY{QH_cF*z+ zwA;nJ}M>v;X+ohX<5>WcTuu8Sq>cO!hA01Z1nU&=@~`C;wNwABqb3cY#-o*m(nC zZ^iInrLK4nI-;-Bxtz9^T@L}qwTPR0b=r$WgV(Kk6uD^PKY>1Twp&0)$;94 zrjbEL0!1ok!spvWumed;yR`rxbmR=QJ7iF>nSO=PGUU_by_p&*T->nBAHVT7@{aq{ zzohF=`KQ}3;?kuUWWRzyViK+tdnoCKqo6tOz-7c8b-lx}i`htBVysef#*y~9Ziq%) zfm?fbZ5%w=`mv7%%vIAREiKIlUW0Qko*Nx9($eW!7shMzbEMmirEoGEGPt!}3p?(Es0n0oJQXDeVojZ~)4 zZd|}*lq)(tvh{b^ho^X0u>rM%nrAdE7YjTdfkio$`!WL0wYqf-D~?rUF8s`e?}y%a zLl|LaZBqKVk9dtDD6)nW@gey^!cct7mZ3(8bljRDYB$(N_nZ)V?o54+wdv3sTGsD- zlE8m2S9+C^aZ=h|6#Z>O07>4Ry3ZSF%8gOjd+@vul{N}VsJP;9UP4V-;jcChhdBZ; z5z0CWCdFJ%2D78D(r)LEhnIAl0cN)(!z@RX`B(d?60wXbv@%r$+`}Q$$7J z@Sh6^R3jEP8s0`_gLTbSzjD&&L9(oj9n)zyOZsMpS$U42LxGpm)LQ!#tvaB#s|M(0 zpXux|`EE4Ks(ajhdXt7G|Crbhe%w}*2Vyen9XES_Zps6-OMdIi$`AyIad{oZZ`&DBbcZ@7HP0JBN8SimM^ zIxXO|#(6ywgVTMO(1SAgH7@ku;-0@tRs)5-&d)Y11GyF7SJ5M%i9dcD zPFo4_f8vC* zOMgdDw`0)nX|f<7NO)C5RF4RSpbUK#3IQk$5tE}Hzk_`%&;5{~4G80zX%q?Ua zMr?bIq&}WqDEzo!zN;<^xS3Hb;7!CW`oc32Pbh~`+*|N2`9!0D{Z3RfFtqTmW|3Yh zstt{_GHMORslv`guq`kHi8c8W$joCJ36?((OR-Y@EUDjV1%gnJ>tf9gxq@>+wcz>>5vKX-P|igMXvl^G!z(u^Z`pc z35h2vyt%$r{^HWp8P$radEFWkZeev?avy!9I2ugr@KN+HNUIbeXpg$(lki?$X@$4J ztW%^OdU1O;NVIhr;aUUvh@K83#K4eHL<7rV_f9Yhm|BSBG&xfHcVG@Hx zRtuQ_s};~3ei3RG#p<%lJKMF&%&>6WjhmapR}g4hY)u2rry zwTUDvIROnbZRd?D#xG5d@P8{-*9*LDC&pSp+@lWU zxPE+DwO6Q~Rrv6DcXh2=$N2hWv`2iUK6BGtH07S5UX|FVrhMU(I}{q-zbDoqOsy=g zlsHfqN(dyIMyfTb4d+DNEUvdq;*n#Fzt&5_LljW7?UEy;EmwY4mpiF!VI~o$D9S=R z{K)9X!}%*;s?F@8V5RfJ=ITrF)56|fd$|za-%Zs=D{SAFN{)HD?5RVdXS2<99sA*x zVGeYNCvzi{$X7cM5x*z1Y7+s@zEtx68l6fBWgL43G0>M$Cn1>`lA6iVjh6cwCo#-O zf0R{mzOHq-*37m2@Xw=iOnFIY(F={AB4EdzuAek}LCtAxD2lIgB)XhW+aVREPI?mS z`;FsY2t#;^Y@Db;B``Vh7SX3SOLFEH3Pm}=zjp!*x&ukHI(HdIKF#O9@po{xHVfuT z=CcEIFkxhZG2rFx=oc05b4K>xv}uC@Iaj3YS`;EX(GW%rBVA^SW*vr|^cn2@Brjsr zt1^XZP6{U%m-T*rcHkx+L!5Vh^_}Ypu5Uj}-AakF80*WGrEm|q>IAJa(@1?ZUUpDM zGVB3v@rsE^?wufr-rIZo?<7vh&d^%LU&#GaV>YQcXh-vS1U2_`Hp|UyX+rfp&#`QA z4($5&P6HT4`o3#4g_jUa0-;fOI(sV=s`L0JXCjl`ccsvNBOoR+vg`Sz1Sm-KLdT8T zGO)smt>cnfyJb)WWLqabb?BD+DTedg$H77+H>Xw>dey@=b0WG0kVIOY-z#$&@6H(f zrB~F#97pR<$xwewHO)nmfalnC1z)2VX#?f_i2Y4xZn$g~JeHIw(l|vH<49nGaY+9ZK5RWdyATRz%67q9)*QF}AE;Mx&+}XFt z|A;vfMv?luGFboU08X%>DVy?bKeP9~e|s$ozgc#h7Q=IFiJS6;nF}k5w0li39k2d) z5$ER?lRzJcf&`T8Xs-3?Jz$BAy>6%^Va10^ z!S96x!uCP~^FUK%fcE)Fu<7k@6H1=aA<2l?8Dgg@AQ4k&4hR z)3H=^0fy9PmUT?>&UWYN1Lu%33dtY1K2d7qh0|gA-0bHDEw24HQ$5tFcDzW=Hk>`P zk1KuI_DRK)2R0}e$gU^&yZN)V_!0StD`ivgUX7K@p@6DiA4u0Ig4jDm2L z=?&sy2`23-)LUhCZqx9$KdSP9U4=ZLersbTIX*Y-Q%_$&<0hKQ;v2Tj>hV$YKRCag z`AEYaHm%AQ?%wMD=G5%p-O&HEwOQ{^`11K&03rKeoc?rhDBfYV+aD+1&w=lFw&*CS z_neOhVp%0yD)rXdsl(v;*3N*zu$cdYc*^+TS*(~KH)5FORK$yNvxUhwwTix%B8*<8 zAlQn79>T$e=q47nh;85zt)dgP4T?ZSBqO4{Q+St1u+{5!5O#L?e!Yy0h%LKb6YRr$ z{B2%}#Rbvfw`B_8{UzaH#lXHVY+vW6LPEsfYsTzgBP4R_r+?%Pn$$5peO)P6!U=(u z(?5gPxU2*R7t*`rJ6?`NXlU9WDQ5Tl&vpD$yK{q7z7cXWxhjwml2dt1eGsf(JQTe= zvtY}`en|Y)O&R|Yfik&&8)p%ifLeIqD%DlHpXAKi*z%#Vg@W_?4e>JE=-|i5o z%R^ztwqD2m>-@cvmi!k!D;8le1%=dowUhpE5#=^lXEtHY|WidLZ2}- zWFV_~{93DCB5+^eJq9`MSnd2Hc*3ntr1T5kC|$8;{4M>+t=8`RALst9MH0AUW#?I} zb>Q@2n;JAh_V-HVJ?1pi@5i3G+WR5lPhW6sVw0GIgNm`R+n`^s`HkO`_^`D>g_zk- zpwX%RTi>AqN|Kj3c?%GWeddNdnG;G6QrurI6!oIXeUO(-6wH*)tq06ITG2^YTRm|YlNG_dh^ z_v}Jpnnn%#x~XjdbV&rm>Kqw9a6vJ=l(ZPup=}YxtEY}**%B1Kw8|#h-NeA@I z?(Wf>ry}%J<&2k-HP1;yWF{O}trF@v>*d*9A4Ue=8jVBCSB2}m)zJ#7`CkVb_Bvb8 zHzM#p99W;hLgIrkg+9V_42T2uVS@4nzQ*jZ=>yjUs*Mi81AFWUPns*Ns{MmKR>G>K z^Ampz#m0;V9u@!VWIqrRI~44GVnU1NdmZ_%^_0~KeseXG5WVjCL^(k~r$nq8inj zUo>KKi$*D&x3c%-F$kjRHS}l8*CqWbZQ19=fY*j}HS!O3`2!H030GAtX|ywzc>_J~ zclbvPyzH<-i=hHBN`JYnj^7yEO@L-Mg zIIvMRQ8Nzht;FH`9K^TzNyYd!F3GZX9Pb4QmdmP@vmUA_n+x^6%1aGPxwtGBX+2O7 zxY&N*VP?4Gl`}MpdtS{l(19@?P{g%V-bnMYyO;a|5-QDW6ZC4{A=$4#I!R?~xJ6$c z>vwn4W~?L&c!$acM(H~kkPeUyl)yq&Qc1y_GEAJ(3`E`P)Qs{%PXRJ~UhhZI13r)l zl3r(_aOOEZKPArf=P=YO=cc(ZfrLO(THdT_4*9}Z1}Di7&g!gMi2S=K{eqKFUvd#9 zIc&9DmbxJ#czx|;RD@Q3F;Wzf=)3N3M}ZkGBuX(CWb>LY6Ga$nXd672jXWFd1%^qG zSx{}n`9Q<7r=S@q6S;Ht9t#o`S&9+wMx#iDZKW$hQE^AK5MW^wpg0ax4>z-|7FzPp zA1wporXxdKB_c}6Mw-E$mIFN z&&O)Ry>@>n&MeYbVwSN>LRzov^)LpFojo3c_%tOsPO497SL5dgagIznh>WQMox{#d z_E}bfGo^NAm92mQ}(e{I9~|x;g`L7cs#B6gJ97)9edb$ zgm-j)2_t~X^LF&}-7&S~Pi8dZfSC7Y8Ou+;5HtW8 z>?}4HF0@NC5|kbaoD?tD5=`qO6ruMQkURl8#unp(f{9ghH!FWuW;7OYn)Be)2LUbw z_X7JqL4uzLb(Zb!28fnUVNQdK(Jhs8W(~Cz;bZnj^gN~ke@a102jf10$QGCN+$wGw z*`?r2K1XMLHF>V71wkr;LgnhDRM6FZjiJs&wt63Z+ifHje2hg92{1%>0^!7v$_#Zz2Vr9mTk(= zHki27c0b-!anSPd#TUgaZz+$}D|k{udjzj- zGVu)4v(4`swIw$}qF?l52scM=d{*a!ksH$yPBt6MdcmhIh&33V2eq%(H(WaDNzxJZ z>~GMy<$to7ZQc|fDJ@JUO^ZmLZTg)qwKF=gqI8X-q1+PDymi$K9CLSm-Ox<(DC^-9 zm0XUvtE zJ^@&XcHtBERSx^cNV*WE9F!?!9QPQP9i)uCk-^GPGmH9S_q$&wYrtGW)K<8VrCFe} zCesd-R>NjsYG$)yp>HC%9oG=Li4{k2b-(MERE)a5VPo=3Qu}kwrAYta3@tg0Vgnus z+YE6Ra1m1wM_YcEdTsiX%b* zv@!&OT$z~zY&4sZe5a27!@6Bex-Cuo_m65aA&|cQ!OBGlt{hW|jbuQRf&)~sLYTtQ zQH<9H-aagN&$amsw{#sHaI`pMnyIEYmk#?_Rw+m)7iLA64T6?+w+}u4p1RtIaVxa6 zn9sx&SMIuSdAvN$nbQgF zX2Xs1{yOo9$IArVk2ZrMuYPAb-SY?!2t`Of5jMF5oOBq{A_j_Azvk8^b^d zS->9IZ1`?$QO!SjQIDv}G^B88%~bs7$PG-N z^ttN=0+*@U?>>~gn8lnPJrVd%+9&u%MZSUl?LngbGB@&oQ{vq?*56Rokh=}rISX^2 zqSW+eRa<7M$~VCS%ID7z&rlPjIkmN*}6)v)>8X~TpW0$90CrBjLt#? z(PRvBDmno3RrCRyJeQj19vV)nk&?!L2xz7xF(okudY(H2srG+HPT3SypR;s)F7X1Z zQHObPe_+Z{<@l}0ZrlmqmYiieE$*3G*+W`!d`r50chfm3vSzuiE(vaRy`}B(4EG=9 zM5?L{flVK+G{Gq3f?SBG`J#agNa7tOrepVmBF%3nO?pK-dY)La8)&e5wfdH8CdIjc z{!xbw#%q=@*O#c^?w^Jx`riIXPit$u?RmXBEKC6Pai&~Vj7Jdp`-~-O{ing4rc!j+ z5pK{N^j)2Hk$)IzZt}bw6Vq8IQXweR+(;Wxqyj-}h=}X_XX$^_u?bgpFWlf9@D9!7!fkMw(E=Fu>>)h2gn=cBZ>%(Hj2K)HA>Czv|p zua2b$jK#diX!*xN=9+d!6urdBxi^$g`VY=aZmG~WzF{j}K)^A}e+shLOJ4w-DTh0; zfH|fx44iB?qp&#Mp#ePX?3KwhWsZ$MPqi;~)ycq%Z!M>(o;^nXk_Lz04*LdO?ia*M(55+C+H4sopdM3UrV2&YWgTs0;RoNQaX z?%D7Z7N07swZ<2m98Z@M{SuKl#q;UsntWntW#|#hxXGp~YBodMs6LRc@W9jX_E23b z))1HR!RCwQ+@kyaExJVIwVW7IB=mJAgZsK+kK;>qzfdo~T4`E8#BQ;#H=y#$9FAwa za4fYIV#;df7(|HClCQcjW7S5;p6UgivlCD2b~FLEBi?zjNUD^GL*~(R?g+ghBL(j( z6_}J8(1hilB$-1RZ<+Y3lS!NMgYi2!(v*E~ZRx!4jx50% z38Le555;VnPejct<7j*P^GarBvzDyAj5{mq@_F>k$P6HxJsJp^sT@2AL# zY9gk!sIgZNFd=?$!L@$cXxC*gYY6bef5W7IfBB8NRoNl7#fPTh8W;UT*qVsvhbSNp zU=8>jrUMu9(-qf-0xq*Dy;~x zXU&Zg9!n&78_|S#JQ8Z4{bTh}jYC|DcO#k(`d7Yq8bR2I{YE&duvl$Ha$?F0IJGL| znZA`sLLP+v7faCobYNxj(($%q7j@H<Tfzk5S4=k>41v`Wv_2~g{4>QGY zW7y6Zyz4NeYXv_rFQdbND*E`xjyuy`#jsvj0kE(d<6Lc-K~k>G?@%F6_lwyhe9W_!Pp7YOcc8({!ub8f*D^L=bm&1?=z3J=# z-2^#(<}B$7Ls&Wup`G9B7W&(8PJa0k_U7w(wLCy8kRQn~`7f9*-!oKc#|xJsTDMd_ zA?*^{^Ksc1Of=J##tBHSwAzKknBC^h+t@7~b4lB5#Y4f9$G@G&{H9JjHAe_Kn^ z+lD0Y2nNe~O<~eD%8)I(2#kKnnI&#erS~|?X&ZK{7rp&K^h2&u9$DC+;F#^6i$N1&yv-qI3=-8s*mQr33kQu4xQ6XJ~j3mN)$S%We0;f^vwA2gGnP<{>ryDcbER0 zcGp8LC%iRB_bZ>@ty?>}S6U%r=d$0OCWp*9=9}2rDOx8u> zz&I&`D!CCxPKny$*;MZ{pE{>e4xQe4*#9S4P0xAK#D_NrmiY4|sEZ-k(~hfrT-SX0ZsB{~}>%Z((W|e07+%etg#rd4D7l=&bhpD?+`=pls ziOHr7RXpObsn9r}i||JT3QI!eUvTAAuKDf=KT!onP9Q3TF6pA4lx_|HW&hN2zZWRy zZmy}E4I?~n;S!)r;L)IlR87@h3CL#dVP46(C0ykpr#thTK%Kxi@p&Uo`V4sp4f98l z(A#UYQ!orov+sb>Gh^lHXV6;u*vEI7<%s%+SD2s%AuNiOmGQ@*F)F2M_XqHFT5bnc zyAI-yOf;bl3u`y=&JL%zMGPnvzo=jD{_0BO?eu;MLA#ejivRTi+>UbV^v`}qZvSy= zKpLiz9z%*5T?(s~2 zf|jxS;)T_D=%MM;XICi4z>S+1GByhIWjqm;e!*&Qn!tHBG$~CfpTd^MG^LTG&}yP{ zL@HL_h-$~*Z0-Nz{%fEax(4`Gif=16l7?qw`O;*DjSaVG&=xg#Qg03){v&M(Uutw> zISDD8ZsF&d$ou}JG5=dHqHREv!1}fU+t;~=i^$7(2T0bUwDL1*X#CAT?(~e@?#W%) zph!-HkK#hy(tC@mH?FQ7h@{kVwN?wM39=C;H<61Ih)csd>{qZgAMi&w#qKr!bb2)j zKbU#4+tW=GeRg?I+fS_?U@Xe>l&)4-lub?^>Fxs?Xs201j=+J<5b?Rb@6HEPjxKrF z--gNQinP>%9vR&4Ir~v~!FaWQ)OoXtV&{0qH}19j}NB7UxKA{j?p^8 zrPukRHA}lvYyMkoNa1N_*#yKyZP)m3v-lcTFCduTn|zj6+jx7`VeZkN4f zH@!iLd)04z7y8^pG_h_s@XN~k{u5x@3@n)XXJkje)KhGOCk0pYoR7hHXR`{$sM*Ar z%ZnYVYQ^{2AO|~02i%bfV5ND;y4}&k+m%eYp04_-XZ6^uJda%VNmiq1rUKj;X4@8c zT9j;8A2^dd=gUSkubw~H_4jD}=F)wOkYSl~{(jEkE_AiV_J+Tkj$vI2ay<6VhOkk` z(B>n-!}LXg^z{FPh=l)#1&97Acgh0VWT!~fkRLThnzU$GWwkvt^Vrr}WIJV*v17Yy zCCE^ntl&CJjbesfyd<>JNi0pev}w-Ym$VMU)uabCUqz55^->75{uO5a+bx-K50-WI2=@h?TBiTT1u{CytZCPBSa z_fH}b0q(ePUknLttGtaED&k>8yfc|$gn<0B^{136_YE(`XHj!W{&H+@Hd`KTVq;WQ z?G^OrosPU~CH{{RLkh!W#s+JRTfNF&K!pd+zd;zhYXi~c?dpss5&;aDn_Tjm3iaa) ze%qfS@!G8PyzZqfA8YcvEXyb@*Pz*eQ{($&JKs4R}MnfB7SII)vAfzZBij+oPNE zDWT8^8~0v)K>kQ*{ljlvR5g}5)`{=s$8Q9lUeNj5x1s_&weOR5Kb5Fx4GZ>#-`iQL zlP&S85*i+~j79mZ4#Ag&_-i~jcGcX)o?{&Geq(sj?%q5XV<65*4d=NkKCj0nOG!+n zNzuza(5BarV)Ay*J9uweAXk0nw@at|yz$*F!DKpBrxi;no+KXj05SCGz8)3m8nVm< zKkoHRJvTQF`W}m26rLlf7K)kzO$O7OA)TYl0QAgGk8cn~O1gv}4GO)imbn2uK2avT|LQ&(lLx6sBu9Dfj zVt-S)V6QsO4=WAI3w5~p7J?}pXMa=ZPRJyYS$SGtNXe@gaZM-cF(oH{&*yS}qop1B zxQ%-8sjyc85z;>umxq*xEL34Ig?de!mzIGtJ1g;?biDHImw%m~T7AnZJ_ssEaPhs@|fcltLiHxYq~k zBMZOiDZwJtmfAN+#t+n$D0z+b9%PU8e)iGMe^7!c(;cYBzv1O6k*NgO@ChcuP^4FlzrS02>1z@2-53?XROXaeibU>J96xBDDBH5yYy@yEPa zb*_3(Tr@vZ8o%D0FS|;;txIZYG=`x~KJ`QHUnEy8S=l^WMqF=n*z^2#*!~;00+}YI z-_nJuDAP8gY}(D$n#yFxvaJN3(hQOQAn}Gry`>a3gmwhIFEow0Y~r!h{{2Zt^J#~J zG3HYB1Kx4L-%$)qPa1=zhLA^(aJ$*`sV+{>QLitGWOaULH|CTBOKvFVmc3{rxGe4m zcUos+Vn3}h*S{Cn#zxs!ynSN*jlpVrKk|InrYGP7^_Wq|MsQ+lCwS2~uuRSyw}0%P zOr~iu)ueEAm1{XRSp~)WWuU$=f%L^(({q!YfhwlmCFxC{GD^GON~(j;Z(cfBDqC7` znr~sN-L)X8O%Z@IydQ#h(aT6zvULRKc6ILo+piB}7FqxOU3>fFy%$UdGYE)bcxApA zelV87dcwx8-tyk??W$Yw6|gN_aI`jDzb?;Q>>dM?{r=;L=;nc%V7$XKoZNi5@)S6G zyvN4;6Ir^v?;+GM{$hrdX)k=}41u(~!fVaRpPwq=p!jq(L2e+gF{)e4YH?m$#6i-h z!XklO@W>9GaNDv*eqD^?CZ*%PXeNV4dxD~+g<#)NvW$^)TO?4rX!^9{azX2;WYj;B zRYwmf2eIr63N3B_H$@Z{O!jDM-pQHDu-QyslJdYG^EpWY_Nt-3`6Lf(U+gZdY(wmw zgm`rtwEL_-LoPW^tLBSC=gmc2VV_rt0H2obF@!8Nk5UWZ4P5b;o`a&vcXw-(En_T| z9YROBV^us|gr-}(raDS_LYUdLyEAF33~~5jeh`eNfzZ$Mpu) zkaLgY<ZE2e)2`Xou)6Ng8td?a#1sMzWmQWyOMvFUF|w1!K#ExaSq-@z}|0wV)*

    AA{9sYF7HN2tZ4bQSHr7n9A{pcF+gA&zUj3iheHSvX6{(|Kk*A8ePE*MO=#J z;KjQr(U*v%jRWbzfPA&be`-es0{q(8W~^4dl~JWQu1^lFgmjbN7>Z=5XVda=C`8UffPG&yNOFU-h~GQRbRb5J#fG z(T6!33+tjxej4%WghiU&HVVnSjPk$6m}VqhNmSDl80w}6MlD9S75iI1tvOx>ND<5A2LvxV#!cL zA>w1Dwxis5J+%%2iTsCUHoQ+o*x!>U#J8*Ho2MVqUyX-Hq#d*GR39cH^7q+axgnSy z^knNZf{v}8L^Jku!~lQBu<|3+zD8CKt%s09(uB8mG|-XiX)PR^=dP+JV-*tO%7k~u zJKrLxdrlPk9sf67aeE{RIP^OO!O|il|2)~-e$X66h;;xi;*XU11x@fWANITq(VzF2 z#6f$)5g+rkjM#t~^j473I zc{HZqPnDqYV5MlsXGNb&8EI_VNq1?oe75NZc(%bT2RS?3E-IkC5ItDO$B zee#d{1n{bS8#$;ZkU4^RR9zspd7?t?&BRTn*(sDaQb;F8*(6+t8DA_9{`4reeYTv$ zOXef2Havk3cc|A4ZGdKf({(CsU#*-5Ngk}nTYHTgHAQrEv^Gqf66b7asy&g~U#!k< zqj*=}^fJu8B{Q5--ct7W8g8!(eDBo0=l1z(iw8pWBz~+pMyf)gua{KMorhrFgm2W{ zMswZj+BQ{r>$YNtiu%rjEcwR7#717R0)FwhU7gU)VTf7%x-!yZ|9uy&m?Ft_z?uy7 z8iSWZZN$QRykFqHm&d08x<-~!_Fd5i=@_8YQrg^X*=#^rt91s`ZqfV@Y3c-@?l9)36%amPUg%jYaxV zQ_T1@vC!Wh`zm+~c$*yvPIX?RExMDne+d$`3&LE|J!q7fO^**GKHKlwAned&L_D8U zMl{4k8*quJX$$yI+!P^qHUf!2z2TO8;+5tvKQ z%hvSpR5>isWml=6`!0<6 zhp*K@5~k=v&9zi$_K8pYX%%swFKnWJtDy6zI#GY=2#46c_4vKl0a|=n0qQC9cX(S7 zZ>_=RnN!XaQ5y60&e$s<{H}!9z4F4fUdK%i8~@v<|HzOFeWkjm)d28+=G;E=V*M9@ z@xGw^#zTNpu$BK}p*=)mTH)E>ahy{Mse;Wxqv3TsW`jtnbfcOViJ{x>A?MEawXwZH zEyVZw`rPsCbLgk?iKhB%U^xnS+SXWpS_5IK%p@xK9!u^02`|eT`N?AR)6R-W8P$Mb z){$Gs%6@MJk#MYB3Imd(Lb=Q!R#`iPXY)Kk2bh!O^2v&_*)#kR?A6~6KGUO6yr%@G zag(cM2#M6aGXaErWLEm&iJDL$@*!P_YzZ%e>O398f5Yo(s*rrb4*-sR|5GPx(*(Fc z9zx4Qmd3q|`wB77bf1E}O+9?G>~%`MK(NSmdE--7gnHiBIaV8Y7Ifg_B%ELPTOGm0 zaFvAeTv&#JzYbgKkSnKq;DR7i{HWT14%Yd-bRgn!JtmP#2b6%^TyQ2}%7)V+c)#!? z4f^|)9`bq8xD8(Ag%!|)4+I)2P74v60%3X!=Q`EEVO3etP~!B__62o*+%{T1b=+Ey zzBOJcX!A!>i1nNNr12KXsXtA;KVgy!4wGs2+L(w)A^o-iHqR972EGs@7X*go5H6_%FK;`_D2t z^i9%;0-~jbp2hiljTD3O`}%oibnG{FM!CuG0ZiKVxhJ4n8XG>_W(0fGeRwMyh_p@1 z{*LxGNmI{1+KD{v2GL?EXG_uUCmG&bMzwe!O*u`$^RWf-ms0jv@8Ww-1n=@1w{G1M zn`?zn+5p3_Q0*r^jPKu4?p4)A9ipU5{_o<1Lh}Fnhwly?KZ$;ok5v7WGB}I43H2g= zOpMG*=x2_VBe|`;R2BcjBL)zo=NbCQ!XSp2TAE9EC8+da?~;0Q1#si{JlhYsJPN+? zaTlX=XGkGumwU7;xJ-_2gd-2FEm=@>Nw59Nkl9znu7GQ3WhNmG|jlkcC)eFn@2 zAMJWuRl5pNwr+kcRzHMxrI@XA<>zxww@KX<)Wtnfk{*$(>_UbOWW&J0kC;6(e6e-oRqB5jTH0HN`r>cpo+)+Be6fA7&H8sek$`+KLzEQBUqQ2y1 zR38B7Y}Qg-=A&EF=E7VP{H9!6ZHEHQzAcVS@5|<5=Xg59nmw0pfUD=) zC(@edjYIweeP6be65y1Xyrk1YQ33SQE1T#fr~3XkxGk}ClW3r)8n$;z07A?UN4DW#d8`W#xwW|#^n;_Ts z5^rQnP6`N8c+pw&mfJgi&7B$%H^=UsE{IT4^ntDLBo(g`3Z{#JwTJU1u&DOmTAitE z+LvAyi?ns`@kj`{4&E3}gbG;I&G12G&;rX4XKx1TKN*$P#?&pr%grNYBsE68_J2eE7E z1`No!NT3y^!D2C0uZ>r_72Ol`VaA}wNS#AB&a0F4?i$~{&TL?RPQL4sXkXp#ev}~N z7J+bBJ*$MU&-FvyBK^f~oCFRth6m;yKW@!QLe*|SP6$BY)D)c9(%w84cYiMNT_oJFJ*`X9sx@_WP z&g1*={Nv{Q!m4Tg;sKU#MM>ZMgWmI>2&WHceWHCUM3FI-%f!h2uJcA7me@QYl{oh- zbeTeeZPs%6JY`)U%SFj)Pn}DVMk}P6&go>a8v~~c>}&E;9-#SKE)al0*Y;MFywHYU z;PscQ{TYkm%*O4v0XK#hV^z&fpT35vnjLve8BbTsFMp+w0G=*C`iUm<4yG}y#s3vZ z6IEN`O$(BC_xk6@+JMeUQ*ZQSVe#B?Hv+PwX3xCTc)fLHhs#46tH-$w)GG!k&c3hT zCf(sq;~A2MTW4XDJie8q`~0L2%S8KU^q9+diGbE&0YuQ6=Fqv0z^W)Azc z-tDDidDhX&iES0w)2MQ**yP-Afsw78kgscw??a>xmuIj-9~eBUXh!)3H!j@6Y}ATq z$o@=zWHra7&Zmff&$zh+s2-~&644Iys0(_mj>=S$s2+`G)@BJIPflDye)f#^Ao%E1 z;AlfEvUhJC*@k+bNydqGO=m|H;l$_>t#rDJv*`Zk`suWnZW8(;qUg1}K{ng-rGyIz zH(&V(Zq)%!nc}Ndv-^B%qI~Sz8_?sYCqq}85qk$Jd;A=e$FkrVamQCSyo?R~Lk>97 zdHHXmk3O;(c(s}pzxfK{w>LY4N-x(9^77asLz++C&LqN&1E@`*y6%{A^Arhsvqcs> zv30=xE>nefDLi-uu0j>n+}rsXL!+4A2Nb(0$P=_YkcrN`=jSSloQG@V_c1RFf%}K~ z0*{6E^~|C)51=W67(L~ZaP0oXY&|D< z&MRU0if_QPs4h$*Tk+*ZU~z-boZ=Bf&?>koS?!j0!3)bmuz9WvpsJTU{M{{5xT|Sm zf9a(5-1R1i?m@*xh23Mry8j;T!1hahFI(vv@Qj(X({=l(n%?+n9PsI^kFHf#f@wcl zL;iZ%M)K(TYlypHxL+K?eTJ!M*64TUmXuG)CCHGsZbG9OJg%PtB5mjZ6V`}jI#Me0 z!~WHBuWujDA5*;?Z><8xZ4C9Pvg`f3UN`wJxsdxyt!jmZ{maU1ZuX6;o&HF0WqSud|*TusM~b zE2xsC{Z`n$ko_wxDMe~h1?SfPYhZ*u23+O3W_~=I{>gjy_P3?uY6)r-CZR^E5X`bP z1R1iTaeJ(|SOX6)16P$M1H5kx{z^WJ#FQ^2`3ZJ7$Q6QVyRxf|?ATU{MZ=JcuXCK@ zPmDaz$JNY#|D!qwyH=OkrI>`>g+9?sS)PGIW1+4oy9Y+M3ET+^}G==w7!BVHU@k(M>fGVlb`@M;TL1W>oz_sAp4#VQ(UZ zE-dQKd^%9`MT@18DoAcNRO3$A)e#Wxjh2t+zWCsnchYpJ+6`di6sH-tyd(^koyr7v zDoRU_{YAMGr`cIu^!_%dT?!TUD&y5y@wsO6yXY0ffv>ZefjTuY1NZz2%Zlo=VG@ty zKB%HzmywZ?nDI-iBr5B3!?dEpi=L}xiJz#{FsG5z^F*Rp{7(FC50z40(PEjkI32{U zYVpcJP@IubIxoVQ#b(dZ`bMWUbNrhP`! zT)TTDf*P%&{O|iHj`Z$IcPrEFbafEM#uW|(=X_OXp}$k>dJUMb$fd>ZPAM*TUamF4 z?xrPoeIRVR@XGBvoT-7o+Ws3F%3?l$r>VU8NhFsSAqz>g@y_f;t*ySJFWq7{pC4xC zcXbww=71pNa|gHP{Cs#mD&AC>!a08wVL{})30$sXjz z!o>qtZgB+@T*}JI#&?EhnFRef6})ejFxo1<2m(GZQ?kn8iC4H!+MMg?o(P0l0V>`_ zA7#*y(34?^?~O+CpImVKidXHA%4GueU(Usw-##+RxGpYGCf`AK20o$C4AgEjE8R)*1qVYgsdvQP3kR;=L>95; z=8=`1^xc$^DrbsDb=Awl?(z!MqLunMy>6Pa zfV3T{A#i75hFHOzA*Drz9i)%mUT_b*0;(G@Rz`)sXU;kbMI;gYz?ibxhKoZLQ4AR; zKz#9MeL&n$n{vcrSQ|iSO5aTXYi&$NAjGF*V|IAW&`3m2733D zlkB9?_Kw+!iBu=gUq8PuU9jVvy|V74FB3kGDcpM((zIVy6&}WTDwd6P_iXdCTlO*b ztOy~wGC2Igy3bK&5|>iEXnrN{5Rx-Ot04S(mI5vFnQGLC`#t_nAM%UW+@0 zdFQQu7uQjuPPi(L*1qnj)#Qg=Slwhztd3fh9v2X{dc1nMoXCI_O-0zrr;--ot?pv& zIbl?9f|Mufk2w!!X~;jPQQ4>UlK_i~%2n&^gY-IvIkbIB`eK&i)lgOHfQ}TAmoQ=bXgs&k+1+eZwo&2;X4dCpbq+bq zt@j-i2%f-IZug%jqSMdVS-N4_9yCe9uBuQzyy@v4$($v6eA--&g~P-P@<%x?yeE}R zOn_!U^pcm`SfX1$oxC-0!3#%0#2>Y^j5JlMcUEDmOmxcG#IIM7HAeE(zi#z&bKfME z-tvhLjhiP%m^b5&EhK)~EgJ(?_O+4bHQrp-G7M*Z{ zUY=XVH-t8yTfe?nNk3j%w@`w%W)Xe93MS9XA__Whu~5*Pe}l|$`an%zFNnf*&qbBq zG;2-L0vc;3v2PtkqrFb3gs&EVtl7Iu(Lr4krvu~IfEHi0sLlA|mgJKP+ZPN07xaH- zhH7`cD`N8>dje)=MZCn%A#gue~d22i;Xf z-is~mwov2CUtaX1kxSeN$Ll1W^5`xjH^AA2bA7gEwSce#fXQ%8U(@3?7s``)aKUwc zZzNh$>(G-VM*;_QCO}Yn0+&uZ2V~%|D+8)D9>9I~5R@QLms!(`9qq;9_9O}>eTtthlgg><9CNayF!}4su7m@pmDW09ONyzL1CGg%o-qL14p~8OKlz-@>e_+lRqPKby(`)*8R!;|em{IqDM&1v3Y8d< zE>_xWu@z6RD|Lb}*nZhjvG5@*z&6w+jIu`apjFihR;^1%cmFVE<2UQ+PCbuJeX}&A zqUHVBshgboOu0T zu`S8EiaQLAZHhWv7Bx9a8Khnq!qnwCwZBX_w>y793cC-~0W^#@!`_rmbol5Con6Dj zPe;^`=BN;Y$M$QK@Ff@)cHaEj^s6A=mfi05mlu{DGlP5MNchu_j=MxIlv;XwO0fMq zYlnr^XK{t&VWks0?pdvo-)sH?i%&N0S7z3H)m*aBpQHOPOfl(+lyvbt*j-k+mRWN_ zp@uh`&*$y1*R_bc(V>uq*uU++*?6=Ci;(n1(NHW|SuL7h5tP2SQW%-et%vDt7w-Ew zPIc5LXz?9puv>{#XW<6VyJpE`)RkkwQGL(UA7SHNw4D+Z$qoPGXkE2V#N)4@Ns9oz|~UR}qX z&1c~n3b|YG&MHGI*=M=D(g_umF#+ABDNg^D{!t7v#DG4|{}ZI3 z>OO1au@pGG(z!mwDe#U7Gxj|Df$8Z7YR(^nA{sx(?VfhaFAayFqExe27+S~DOzsLp z3set+Kr59tnglf7QM{Y|Afw9ur_HAwm6;F8rgwW-M(qQk-2QjuyZcA4jR$(>hPHEl zQFc0``w%}$3slK#j!ieN?KDU*&ovoQpJP`B04GXg2m7o8@3(NFi(m0RXd&F7!O5$b z*@8dDoXGq_K=lQ@OC21cw-)S{UeYOL?~MGL08bK(7BTXeiEZP;%kU$4tuJbphdp_-g)hx}_ztc(X0>IS540d1BBzGeYbxbjio>7&Tj!z&4) z+wS29Ps>Dn+UuD9Y~&?W-oW`ie-f%94ZI1ywL_i6^5MX}IT*5U9+f7_ewYULU4_XI zwYD}G8d#zJCHGd|J|#}j67}VU#>jGQSdM|uo_xPeN%*_~JqPwz`912PB25O+zH3>G z^qt5e@n2W?;HPEO+j4dIQFtHZjh)5$3~k%yw#g%|tH(&V?o9lSQPyAan^Y(&8Y6jo z4Mm~uxZ1k8s7&-~uY}Xi{E$6Qi%z)`dKkOGl%Hcz6y)1vFfvII#MiT~N}Sa5WbjQ@ z)D7@U!h6Krq}ysp8Fh1j{ZCV>#N`J5JjT`=&>s!FG^O`wr1tU4C)a5)Ceo)pIYTzN z?ONwYQwaT=?=w}v;^t2#NSqx#_Q*bLY3yp)CumR&|M+$EKlA@+l*8Q;+5BH3JhUOB z=xA?twX??Q8Vrsof&-1YS_-Q>8Yk%RW6@8vjEe6VmNjy#?HDWla-rp+%N!C3pE#bJ zjSe6Rs485SuAyhoemql@mDalMi4U)=rB!)EQ$s2n_+PVjQ*z0Wy2a|&W_jW_hKuw) z#L#Y8p)H3Pp{zJ>KscJ0CW81xeShkV=?C!fz`|TV^e2vkXp=8cWiLI6^(ZMR!Q6;P zUU)TGn}>8b*GTx+R{$9PxDPEbc?5yebu!T!^I3MEn%P!NDzmKo7`P(0KaP`NjGz-E z00@xeR?Y2LMJsBHNR^8>KiAmidL;kYs^=I3e)h|50+y4ZKsuYV&&z1pNjq87613} zt6-HY3>0I?XLBKJ-$F=@Cn2%n;!iAMjeAci2Z8eZTR)#(xJ@3mv?PlM z--kjCj7nN(kIFC{ji@CW#MXfe`@GBn?TL?0e%Z(!@a=D%`Lvi6+p4){a2{U7+%~gI zU(o9Ktg$@u6}Iv>H^40`9I?c!#1H4pXq&D7boC<{c={H>4pQ?TMO=@2jS6txBFrHq z;KKm%%X2Ec^Wup&8zZJSW{=4aj(+>@MHaSEe0_82i^BH^#1T!qU}pzWAB^Yns>&|_ zKj2|21a}(oPvY>F^E$e($)soG0uvPF`;b`$o+}W4!WnmJ#CKt~`0tKwKRe;@;pEz% zx~ov)Ulw;O4;m3AI!6w{f&Dv##e{mWL2_>X+@oHsu|<6L2br>FmzTXugdV?yU`^&r z9iepaG!ozV?C&4B-!~$WFn*hUqOms)W*O@fQD){1nFRZf z5>*ak_Gc~4Xrg`|Bj$I|yU-^Vlm#sEX%dEN964zbm$iju?t7}FK5^IBJ&ElKw{$-L zu3?w*=kh8QG{NFF(f@Smk0)|>&%^yJFg_a3#=)m0NYzYj2AZ#UaL(M)GvjHUYyueh z?OE}L>8oIir;j8tcn0$zjl>PNnwji z>-3W#O13Gu=9=2lG?iZ&*WZnV?e1P$1dAKgr0t5+?#5>o-Pig+mvL^xPCX-w<6ifu_Z@u-Bl}hPZqpx$~dB zVqZz(29W}{GP?&No&Fev$|?>=vQB<#Qi6J_z!9C%eI*W^QO8uO&Pca09{PY|+zE4T zA~YtidOtdu5E5MN3%?pS6f1Rg=YnR?)|>^qe94tamy8;l#pq`ZJ+$q>ZwLT)D!$GB zMAX!0`14iS*-oses6)&@OG2d-ir`IZa;54v5B$E=GOPWB@sj09<{1hHS4-|gg-oPUq+ zQIVD1By2pk7s8p~oPQs8dkOcor`id>LPG0%C~k;nc9)2r=6GKcJvsCJ z91%tCfV{f_kVE_|4+bX*k`v!AAp(@g=w@YLO#xlPy=)eo9F)p193rtoH9D+GskIc6R1Q3X}MK+Qj zGk$|%yL?K*O>pXQ6PQJW(o!{7>FZkBS!rafRa=|U^2+J?$y_m|1fkjx8!`ORuw>c~+IKO@07y9ao5GkOyjAEx2f zjNZY&S-THf+pcx~i$?il+qXd>8-nIwpT>`TSg#jU@`yFsn3K_Xc79A78r$oZ^-+cN zhMZ!W>l~4t6=jNs7W5*%4iHVB#i$asjuHFq5KCW6t$tnoN1A76$0iV6`0!U;eN603 z@SGRUpslE=p%HLxAUbRjnqTZuNv9nT_z>T-WtPwg^4br$V=g{0t!<;;PHFjuJ87s*U#1K+3Ur?4uxetT_0-;E@C?!h@a z9z2%Pcwi#SW2EDbfNM)SdN?ib;_L-F221foB!1R{j4AYt0-T7Vfr$5D@Fq|66aB(K z695WyYElwqjL^eebLJ&~WPRQ2S6W}5E!dSzt)etgMRIVB{lX3GnD1Kepj{hrBcBV& z`1i^WoVqM~2{v{6v?G}f;Nq@}bW&~6^-t`%R-ydv0B};)#*xc);dDncqH#AG^6kG1#${+6$$Cop@9C*+~uaE!~Ml=Sf+ zI5WXcqS4PM31LB*+o*ugtn?&xe;?vU3*2XaGDy?1wiHsc#2aGdke7cak6kLikm(#| z&41d~K>5~VX`He}10zhu{LNZ>SXdE|%0yJ?-;Bv-koniCFL)po1-(LGla{d=IZ+@P z#@v41m$x&{^8%W})_6;}gFmH(_qy=2)`c~9UtJI?sQ%%K1z=IML=C2!%j^KQ;z+$v z|N3=cW@1{r2gb_xm>{-Tkv<>~ZOfU^{y+7iwyo{F-{A(LFjK!pqd$;93xn$h=Wj$U zhQ>*6tDi>5%hoAh5~UUFrG|s6=S3jGHat|K^U^Sqsq`7Ah@i+nL@7}Y6#v>7N4K}D zDL+$4?QYOaDb0&$8@4;6417_I)Vap7I@hsVIc_r7eD85Jl~zydD;Oj$8AzH)D_y~l zBWzr0^qx--1~Ug&)eHl^7M61!~u0Cnw1f_Uz#|P$;@c7++#6n26qF+&okx(EdKEa zE^Yp40M2%etc{rjrPphHnU;fepmFdw?hS_LTc8@a~!jxwRL0eTv-(L*CI z#42^E&U5pQnZ)F_rFw&T=iY*U_|;6VNV2mX8ZAd=1PKp`m0eP}l*D4cZ$0{}dmD4M zDv3ai-jOb&64v?PTP7Gv+=3yOxKjBRISh6fVo2z%}M#69z^^>4uf~A$)ZLVDCiuB8_+LKE_I^7tZFiJJ$Iryg zEa7Ko0NHZ9g``HZ=DDHP)JvFnTx+Az%dE{^$Fa!g=%j*?^Rvm)%UO7Y_n(_EYIu6IT#-!Ug~0WKs7$y z4J+O!LqGjrtTnRXME{fL<6DP{fKlfs$nq7BWR#5rSFgvRu@j?Bdm zT>|Eytie8%`*uNU{rp3R`IRe`nk09{P_{3PGm>rDb^}WHkRp63#dbK~qax@9M;=0b zWBzv`X)~4Ty__leuft;v{{<#<29TwV+69-;i2Y$N6UQP#Ynnch8haPdzcr1GM7(Pz zIHN((cw9TW3=j{+Swz2a?EzsWDh$ZH$)NLwVr+gW3*?jlQxp-WdT58j<6kvan=67U zU;UxpQPRHGWZwC6m2rOIILLg0OC+a($t{IU`)Ir2^0Eqj-u!RIKxk-i#z8;v`75gT zSW^lqj7q(a-X});!9(#TO0(2xYiJE9yQSCJ2&bkA;#GdeevO&g;HExp4a7?(Vod8x z!@2v8wGOcw-4%HF0e&&%6P=9J=BJW1T4ZW@qyRIzh`;A4gHq<s$)9)Fq5xr7r~~=Sgc?U{z8R$ z+mDn0wXe3hOdESa;-;n8@Qt$*??MU|*DR^ZR+Mj^jH-U)ZG=gk!BO?tnKL1^^#Z6l+C_9Fu=By2d% zrN2yqJBNCe3((m#HJKngx5+U|l-HXZD$HCT(Of9xVmZfx& z`u4HH*$J_gI7sT6vt9HgCP1Rf~u?N8s@D744WWR3F$U^dMOu=vXJ7{4Zs$ z#Uuf@nTMW27LzCDcop2h%LN?2-_LMA*qw>{U{-wHxGA*sKd~^gQTIGK6#|{T!kY(O zy*^xG>5dwaR%^MifE6qX%YkFmBRFEDK3ZYNZm-KU1dKT@ev|=U2|l5an5#{V^0Kl< z6S4FpP8gdX*(x$;WT7cIdb?@r6hl8yl+F5bUBS_Z=3z)V?>&y+l3t>6>vrKnv)S)J z^+1n=$_4AM9Ng4clff5lHC?6xjoE9`Yszrr2RP%oQ;N)(Q+VxIc~mq`2xJdH`{7pL znRl+6?3Xb{3}!B7*I-!VPprnS=ATw7Q|RX(pYPKLbL6=Pi6#x-5jbGy#rty6Gff@? zu$&W4Ft?Zwds&SKI*fKgdiin>AX{3uEmhCUCaxnidF4 zgF;Bk43n;6NRdddPWoClE?)PVmwJruZXqLjj9ZWj{)brC#p`9!t+VBmigShuljc-B z0v+`!5xx?@UiH$T-Ze%Xgj{iF)G|(5Vi&TJRsojTRAIe^>Tk1X4hl^n3X zb2b!eSq^rBiG|;A#JwTmDJl@1K4DPRcCOO#-3x-as0S2fAgYCDK3p=+m0-E`YJlHx z{Dp$|d9wvQp3vt3TF(jH-{Pw9KDb=73{7=xpCtC?u}`9Yt7M>l%e?mUj^ z-))Xp$VC2`cB3dCyd5U_f9oQ;sN%CqM)~Fo_UqbH(|yUs_uKOb5)`N10TclRHj1|I z<@hz`{GG3>tk1;XKBOi5%!0#t=hj%N8+9pmP9P6^2=*2_tf^8>6BKt%Ws^S zN&FR)>9okVtrc&+%Kt_%9x!~;)9cio|CjhUF7@`RtfzzGOlF6HF+;;0H~E_>qMMD< z%*|^=Yl>wc$e_JL5$GMX+uKMTkYurEU7AcSSasf;$Ns>jMca#>y6xe=_d#r_ILqAN zvLB9VnNa1o$$1!{CRu$sNm_YYFL-k1~tO@1>X0*c`2TkLc z;X&!tr#Z%5s9n0DXEt(0S0&BUf522K_*Uqhv!78X&=Srzeck>6Fn1|n68`zgSeP+#h17wn2A|VCGc`mjeQj-x{RpEb2tsG0AUn{qq`McSE2=ISy>eJe;tkDjWXVIQL*%g04 zr+d)pF8{4UlGLd@pQfwqZtDB^IV;Oct4wUj*z#PWdw+j~(;owvX1K`rvr4B#8(2{0TBG^mqoHNnjWuP&m%}2!v zki2B2Qi9&z+bVyNuAf$>`Y=SVNGJN(F$2>KEKf7(4Oe`;jbxE(@6YL8iYv)hrf|tJ z;;g@lo&sC1wc}lvbir_i(m|o2>4sB79TGnP=tJpdpW|n<<6!F&baaR3tUqL`xn=r# z_jDXIZ2F&372zGn(a%<~t>zWgatN&&3c3zS$z2L2^7ak2mgD?dY$4QVT+c{Q{BEvz zh_DS**zmGW_oqAlU_1c$GchmBz)JiiC<7mAJ6w6URTTB9nA|7!!PvyVLSy>1N|ld@ zA!ufwUOF=cQZ*}xWrNPr8h(*k7Jt!{tgJQ|tp4pl@qpfwdY7Q6oa%iKTf@jLmD5U- zw5+VvxMQx5A8Ufay#CGp>zE_A);VQQ9<%Y)!S(0cwR+q19vTKVwD8=&eydz<1%A|d zm&tDPcNya5PB1fgBNJlz8fl$`LnX&iS3Dyn@m$!-Y!Dx-gn>ukXLqqAzX2e+^Qtm5 z?XKACd|0gahBETs*>W`lY~?FTlv{7l)YJ_wSUb1?j#Yeo_3cIUzA8qRCv#8xqj|gs zA1YMKUQ?Xpm12+==at)xe;Mwulr>?DQcdXZ&G6v$THce3%4pK#%3!=&K0e=Q5I-eP zcX1Xd1lsc`AeicW83{A1I$w6`=y6YQ|D0wT)W1sUz%{O{lC1-D+n9sEP$o-9Vub}~ zo{|LkKPphIiu9*N?*XbDdC)_E%VcAM04;978YL(*;YDkm{9q(sJ|otpP@ zwNOHAIs4qpns%J5ZO4df9ET(VM=N47OkBOOF}3L20D7ll#1Nukwu>eXDiiKM#=j>g zvkqw>oKP%%TJ|0DZgUA*Zkarxi5|-^>kQ->`f1c zrKtkfDM@C6Kj>AMYJ=lfJjRSc7u*M)2%%tF84 z?X1^kGe5X>+XNeKOK|l+{td|pWYyY{$YdP%1BI}eEcq%GC;D=_Ga3(w+H+v^>Gg6>bpcI{|M9q@EElYM%pC8!4Mbb<9myn&H}RNTM46>NLdpm z8ftM8pD$w$r;Sf1PcsD^A1iePn^u>^)h|y$qFqqeWhS1>VeTCTviQ4^n^O*HR+oL2 zG}&Z3QFh&i%;o1wHP3S>r1}Wc)F@gSnU9*XY4>r~kXGZhR*11{BWQNhX6FJphn_#p zOEqY!&IS{Gs)yW2SUz@CTocsPT}P{!0Df4d#lwH{vPiYz#7l!L5RYE5I(z4Y25iM0-R z`BFq-hiLy}JLj_gxKVr5J$k)8YLD&bO?EW|#TsRbmB_jqXQES*l8kq3MBM%t;yJ}h z-kl=zKM5ds)n=J;fYPEpjTv8(M(g3 zV^m?=bgi4@l27STy3|c=-2s@TEp>>$+*Y~Y{cP`A3JTJ$_RffSEhTABl98;}on8D7 z>1C@wHyDu>7ucZ*$hO!U)-#*ecmwy;n;&}n+J3ga9v30@@b#VFi-?7U3xT(EDSAC3 zkFOloy8Yw}B?SezLyWzz-ozJ88*SRDGx7C{p_=k0|0^vyIx1Z(e+^#J+ zJgeC&>YA!%ja7=4k_unFipDt4>0y7IDy>cp-z&qZ;v%Ezg{x`EdHwRlytt^4Wut9JkinLkdkEtb|>%cS7b6+1I(@Neub~?|of~Gj#iGT$$`#cLf z$yvMJ*C&UPyD%#cyw;Y#7e|`v>5aj15s$SiIM`0FcD7+t9uKQrgXYuRTb8S*E88gE z(_ZHCXF2gc3*ayAYxw~-!pWx%_yZn_$^=_vpvx1LY({PNG;6G+gv3I|U>HaA5y*sef2iYZ3i5wmo2(F>JS4fSK?8%L%7mNbtC+~g(6P$iEd$S?}tr4>v z4P4*%1VLXhhzK1F&6ncUtK+*(elt|#4^O=x&aoY)BAi=7wXb>`k$6GB=$b}E?SRQT zd~}!Z9-Q{tDe(~kGMA5MTS5Afmm4j{V?u7+)$tcw~TOBrAA~RkzGx4QA$$cAUQVl}1j0$^F zIRJS{MBkaqP0G^7S=8dnOmL`C)9v@*%q848y^kFt^o3Z`n4d3v9jBsxY-W>C+8!Y_ zBMir3TR{+UIVox>Kbhoe1|2GE?Qz(S6?^ATC!**_(M^iIjCG8WfPelq%Qv97vh@8 z90td|MPvqWWJ5N;8d$#c>VdGvvJZW8CFnob{kva2B8P5Z59KvYjVn7jgKOYM#xYam ztADkS_Ll_iw<)&PcjdC5vzTu~&kn(v@gy8|xbve!e{kFDz`k4c(Z6oA_R%TO7whQ= z@wnqp`N%2*96M9i1WiN3PGHiQr5BVs@HM}a9$~lNG^@cmCn4C!v{B((Qh`L*;~)DZ z51qr(d1@cetp^^R4iDa-l2;#I>P4J!noe7^DL@(itZQ2sFD!1i*nSwj<2`Ij{%M}n zJlrpquHHSh@%*y!F{%x`N01tv4<~xVs4pb%`hWR49cOl^!aImm@Z9)K_iNmHlJut`24aFj^2@W3GqpL`kSA zD-lt!I`QnJW4cP-u-v1(7{0y7d@>3@_aXfT7(-7ZsVc6P-m_yYTw(}RX6n%dS@k4X znND{4Xmo;hA$Eo&BIFNSE@lXOlI`xwJr1x>{wTZJfGZtK<9mMgLuNgqg9US*W@hGC zUchbDZOnab-~AEv%lp?_D=-~3Fg-#aB~cPPn{GC@4fV+hP#MqyB_2oVP=*v8WT$> z0vLra9LnrZwYqCWu9w6VZ9dkDySXR2s|DcxNJaI#o9Z%LVt1EBIv6uyYR4(cn4M2JKbrIJ9RADx zE=i}!QI~+c6raNSRqk4?02p>up2~;M+psJuK6cZ!#!(qh8=7{IX$}(QUH7TLOZX_N zSUUIayMg+gh~r-J=~^zXvP?(Q7ZeN4fI-A);&eu?88#n3(eVc__R~-r{BAT2n?UqHRIFpLOrna)TUHg8bwx5Dvu z6pP9;R}(J2#zdFLcsZmI>OPap3xC|;tTKUKWKyH@LskCA*cs8AXiDVbJhbhr&B7C$ z{=j{4&0C7lEH1WVLS zEv`&+`~$I6-Y<58}Y_p+v!4oT*t*g%?=eV z?hZZ20v^JI-=W7t^!X0-4*|s*N>|?N{_aNaG~P3EJG-C0mo)-u`=1?qASlV6?G=x8 zINC$Bn1+I2zdW}QqOY3)Xwz4$?QT#E) z`!Vy$KF*e6CBs4PR4qlW$s)-`#H!l!E2FL7V|P=?^3Qc+lLA%AHp=Lj31(_5KkRCO zHSRBo4&O5~U2SVgwlTX3Rxk?hYwkbC7pt(F#ecK=r(9pY!GQV2mqLdXRy;xfLdI!P9!H;e9`emcdnp$NC$+hh8bt@++82CRX9w48O7m-I;mL93kZ!3r) zEZ9$|osFoej&fCY*2Gs3BumdUsjfEO9D8F888TlycWc>u*=+R!-o;lcp_}|?pfGED z?bWPe2%=v71|XcfNO@&ir2=8)rvTYNFuC6cw*9dk#C-Ip-hPI)mEwN9hByBH1A#zM zi1p^eOO-h`6#^)_Jlag;FC*3TaWuICp}{df*5Hvszz>&0%_ZccLR#QUi;{P#x;Iaf z*GRFsTKZOa?^ydyV~5|McjC}f_V^#Gt;)|7@|cwhngnODLGXjJN`_h*~0Y ztY@KHgVW2Rg$fxW9eX3Mdc&JsBxv6oWqo*wI*bx&B?PMrv8qF)zS^AXC66i3r)1z* zYW={|OwRb8JHb9A5NV4(WQeDsElj!`G~HC+WxlA^{=kkJriQqXf3UHY{w?xa6>11k zzX{D8{Tt<(wHr)ecC>*18qW<7ERtpZ`C_=B6f)4`Jw_n+jIAG|JRZIVb?Uk7%kW&5 z$2lyZhMw)BzQ;SUT{!ha9~ecVTLXJp_i(aCc>xob_qSrE>u?lcJZ-@ss`XEQJYCsI z@JqQ=WPixl&r2xp>qacG%NFa~i#w?g<``HpQ_#v@q0>CQ;rR~m^nTayTx=;c$1d}8 zQ@J1~&v^|_0;{kh>G+f2B3HY!j5CsK1 z9pVex$ACOj&YKckpy2n9KE^?Sl#7et2Q5S$+hnNH8xhf8V98XqW2e+TI??x7y5*F| z&o<>DLu|CYY3`S>kn_KR2jSCpR-CoRrb-iA-!8OD8iz2~!{L%5F7A>+CkBDy^v_<_ zxb((DEB#vICI4Pi;Y-^|J?b^(OPWjjP7SeLCTgn>MoEWJ^z^X?@?beo$UAg;GUwFD z)A(Fze&)E{5rk6BBs)w49t=)_(Vj*qJLOS5-;M{j;fBW-DmbuXQo{eVFWMnxl%KKt zDl`Lmm$1C#)_u&=?yKm3B!+U~!hn~LhxiAQ5qGD+xm z=%91IR>J-ntxS~8VpQt*LP)u3?Txs&fbpqQmC*_cUAkM9v(hK#u}$M)S?xU_)bf^a zC;l~eKGt$qS&@D+@P_6%lJV`WKvEvR0<4DC%x=s@U)^r8*b@NPQT%YC${3 z<*t;DT(h+4r;8pJrm}Mvi7({Vj@F~+BDbc0G;Dw8Y?oSGpdHV*p@_Zd^d|BP6mdnG z^m(p@fW^d4#MUe!k3Uu)NdM>fuW>1WXmB>!1a)T33`GbiM4efp9a51teq~x)c^*Ec znz4Ks&0z~MKG)f&b8TspORF@rh`UT}Oj){o=FupL13reep*99wVm+I8q$c0)M>k>= z`I#othbLhDyyIhkYoGQ7Q`B#kicL_T-PBL2T`b?$165Y~SjbWJu8=yE>BW|jAL~~P ztcx}M#;AsP=h6AG$Fo`jT+98w#(479YjzL5fjU`Q1f3@?%uFbDpkh~o) z=YZLZdj7eTa3+3%wI=H^&u-Qjsg};0cI5r8!+_J%`hU5I9gq`hi~?qV-HNH8TsV=&bKRk(=_cLBur7WHkg)ukF6_@JV1sv0Q{Dc~t0StPW^ECM^^@Jp= zNv7uDw`tAwCtqzI3;u!|Er-8mrft4$H76{QY+;3ojeW9|%sfB2tGj_#K=wSd5B`WQ zGTXr_*MOE0-{9BsxAia^sb1o(Do;5?7}#kV$^SFdt8MiKVca|Z=r=rrYH~!AEQ)dT z|1XbhFGbnn=r1^g{Hfscf*2-Wo!BE=oF0Ant4|UULRLaf{dnUMZ8rVO?VGrwYUZN5 zZwgCPVr+;lmyklyMdNOTrEIh7UkY;t4K9VIaFmK^tm!rDMp%)_(tk{@OO z7{Fky>@O{x)A5cBy(b_#b~@lT%F?`UUbRWeoCUN`>~=T8ou(m%M|Ui=v)+xVG5n`? zBX-gror1LO^mdSuH*v2Agv4X?qM!9vrOB^3a#B54^X|8Ejb8nFa*Rjn>1fkh(Gs@D ztU@!?eO^Z{-3DrVz>1Tij5r6Jtiua4%(FO_X+D6^n;3-^>7}(NElvh7(XFPS?vH3F zs90lrNL@rRmj@KXjgZ(7s6tji7Q=Uc8nb*+^4f1(Zo+jAl%bg->LgsqwTSKWBkby@ zx};LfGPN_=YKtEe=0Wx$dzKlOcs+`sqbAYZb@RiPPv5kvdU9a)&Y*E2zjDod-1K=w zc(KBlA5sCXSDLJ{lxKKri)h@~RR2DB#Urj7Yr(S7A7rZZIxc&CVxZ)~Q`9vWXPIc% z?7q&18=jh%Uxn> z$cc;NPjSiOoTFd;fL|~4Sh4%f>GEErM3Nsrt@$yE_#tPL1Iy0afx&;w^#wewd%kJ^HxqPk zMniArTswjAyi>KF7&qf0m9K7L=Y!q0I4@K1;7?zGrnEsvRK`?V~Bd z)md~Dl5jCzp?f3tQSI%+(es0icd~hrDvW~hD3pdlbcPYZGzM2DP01$;4)!I$HwsGrsh6*JGudVa&dB45gNe+QsHpGFD`9!# z;|_0)_5T8)Z{K&pg2Qyp$}8=X@oE+ej4k{%a^crG=E0l-XMF}=HX;d^4Lf=eCOcA8 zWnb+1b6qQQsyHK?ak846vkqTc^4z#V_7(tb50lprPCosOv!|{O?09}d>TK`0Qhl^v zEQRa7H|N@QuS!u_%db31bWw}m5n@me2YdBjE>=S0K%l1RsmsdqcFY99y+EHKOL~V^ zy#&7H)x!OiSs0OmB!FE1pD^#lq7p3w4ZbL7jMMmA8yT*&Lv?0ds7Ii0lH&^7q{Mdy z`#zk<{N5&~tJLDD=^!-@V_gI8}d2gvl!Y0FdhXx3O0%i zm_)P<_Wz*ltGe21yJ#ywaW76N?oeoPcZyS>I23m%u7Tnn9E!VJaSdMF-5ml153VQg zIe*|gSGmc^-g{*1XRS5Yl^ev_%x{T}rmlP1u zIUVBGR-Tf_?l6(F3EpfdvmV6oVSB>qg>GGL6sGL_6fy!0FV-SV1C%7?8D0+Z*KxhM z)+%Hq!dY3woTda*F2FoD`fH&8abi_TB%73mnFHjvTTikZglveB&lTvXtiHK|#)nGP zcy9eW8?*h!l1Di^o-yrRDb3md(Il9GY3-+8+ZV|MU(4Mb|S6bltk5$k7mQuGm z(S@lp^O~*G<|od;S#bi8a>GXBMP31RrUkvUAm}!^WkUFR8OA*-u<=3(ry=L6vH!H& z*$jKUrab2K`&KQr9RH*ppO(19cqTjBI%ku;-*TSqlW^VCR4?j&v8UX5!3q~au5_N8 zQBf_o08`)&^w%Z^ox@`NWZq%tByPi`IgzjP3#rFfeMxoo8F*ZHfcK+=l_KW53_eCn z?&@h+yIu&xjA}Q*es$jR2rF_`kXq@F+OJKf{FJcYCCDUYDqYVF=ry<2i}Euj073#H z!{Bj&ca+TI3pkgitl^jigHQa(-x6w(XiW3SOwy)iiC)v5t40XzgxT96N!=FnB#(8U zt7LC#K~OL9{t2&q9j~H?a~JNy+A_ za#_|gh@4)?MtserkO=)=}k(*SJ=?d;jQ#Ae!O|w;SyuI}A!r z=3(WlxfHLnJ(tjmh9ROIoJ`ZqIMj!Of{XRi2=MG;c0iO=m(l~d>HJbE6;!E`a8if< z&-mvm_koWM4#J3MB~JrxiLzIfO$~2XQSGtie@(~aEjKB|s1dLVY@GPq-PRXD<%0ff zkkbvxu!bKb{!i`Aw|M1tn!K3-R&9dgPxPqn3XSesq3dWAA(lp^6wRO3_dNf4lXMPM zof8B}&nOzNvu!onEmbZ_HhS<_H-WE5t>Oe*g=Azio9u2amd6s~IC~uag;L2J);bW1 z4Fvxn<5%2Xx|%xu`n9q0pWB|!rCjXv%)ir`q_L)X<~*?TTF8*X6%Qlcg=u}d%X6L9 zT!_A+1?PkGnS*@TG~k1Nmd5UKCNy-5c!bT){?-NU-Aw;vpWm&Y&GVdCT$tWSEr|P> zh`)C)H$B^U5N>F`SDJ4}X5F)9L;iB~xdP`*qa`k<4 zu;bhXRGpa2GGXOwf?2Ota;p*O`N1#v!hhZG5zYxoQzk5VU+*~aXah{D)(7|OW|IXW zko+yK!6pF}Rgu}B{-*m4xekg#oWQ5d3Hy-fhjec_c=D6m#GwxLy0I|=1`#9Y%~G=a zNx)l5*+!@8jWC&P4?8Te0Nzwba>3?_f|QRQwoYkxb!j2HQ57G)i}x=;&O1oh zR)LWju(}W8{Xdhko9cVkD?Z91d8*`OoPW{P<8G>6+dhLd1_*|+UG<`#91qdgC;PqD-%C zltbVFhc>b@=jk@zc|Xg8y^keBL8dl^T5g|UNKJd}g{W5K-whbfh6Y(3Q+DUdNP5;8Y-koFinwu z-d2e2>3XqPhgMu%nBCBYAgdeB@x6a|wC)S43X}Bv4mWdRGxZwx>j$J6oql10$}N2C zL9AY!rh#w$UVIM92q$-(?=>V`#sf{}b@MeqHlO!}!3;u~>N!zd4c($KT3&xPiUbDH z$|QD&_hE$}1f0JIXI=4}a!6ec=0_rDT6%RM1H;06_cVR8;2g!*RYJJi3nX@+ zxj%pE>PPd~c!-|w*{ab)f6K>F*zP@`vM{t_9Ml4o^RuteE}|C@{)lmlx+dN8!}T0| z*=|<;UC`=++_Z`>i@HGZ0>Cb)^PQa#S8qqgs8kB^Kt&zh?$0~Bl4Qts7RyLjEg*?V zVqWY8+KWV03u?Uj1<}!32#%s143rTZ{;(RNIo|@Npr{#J-n?hF5o|>6X1x{q$vlOa z=VGRWy5iw=OdklN&pMgLRMGp0%t`B;Ezjrum4s1@GWDBCwP`ex!TNV|Ny$25mrb%( z2ejGb5zRY+lJ_6`@BL+N+!~~lq>%QHnj|0u+##TbYBtS z1?odfF^S`5#jk4!gQpQ`;~wLU#OZS6Kdfbvlo#?UMZVZ-QVKaibN)R}e$T;cjlCzJ z!_;Kc?fzF$Qn;fz+W6y80E{C&g@JVOV@VV-g9_Hojja~t&LHn6i9bg&4+-cu1;Dl@3y)nXKK2b9qUZ*jTC1Rqgw zj_<6ulP?z7Iryyq_Ba0GPIUD**%i>kLsI}mhECe35JZ+#C6HD`#0s0RXzMPiQzE^g zNFytp-&E2?gVzlSmaJf{KMG5~I8Ps}MqPEb9i>t->^73PuB!fOyZ6P!5-xzoqx`x{y3%TK{QwK=z>m|A zpzUmx4%*>NTH)+)?3HN0`WW5hG5-AY#g-oYLJ|X|IR4ww;y1W6J0C%se|F;h5EC~q z;uCnX+Bru$IW-(RUQu)6=dybo#&KLTU+X;(85*@5y=;k^o@clxCKJk9Jnu@zC|lWv zZ_DY}1pLoKrfkrq*m3xS6)LpBz{941JNPf* zPm`-47giceyFkQy6oKN7!W%YZuo|E71}Dd~LPmnS{hx8YSMJAg@jGmzy%$4c0j{NZ-sur$7BP|W;D-KTLD z+#;#<>472y%B$tHQGwub8aHj|nV?Qma)5?7(a|E`iliG;JV@!JBgXE#T}6|)tP2j7sABO@ zfY5LZLzG}V_ebRg;rY9c`Ck?mk(9Y^YM~P|Jo4Huc;&vA@eOgZIG($Q^&P!&vD5_} zf+FEn5Z(yoKaj>0Y{5t&_HJp~PO!h=P1kvaX8!W2m3QijlARaC2hRt?4-H_#-ppjV z5KK2~O3n&X?~-((_jRdzX4EQ;)tOb2+COP-98CID)qh0jXTc|YVPYqA)2n}%>Q3ij z^S;Ry{Pt~6BVUI9X$x=o3vSFC{ax`)rgxl~*qlLfxpI>2`*r66#kx?qlisvf@1H@; z8|jn8rsr;ZCBg~nTR}Knf(6xUj~^y6fc1W4M-TDzerYSn;E(8}}v#C|W6zYg^rG4qCYF$&-P zN*Ecxmbmcv_?opz1ZU>4b#0F2_U8|32}2S zZyhq69_)LpU9fPdX7x~sQR&b)LDm*|Wj^*7((73?j3C6hZQA>ILw9t&3Tp?%4CG}J z7%f+7cBH6J+4a6{Ur-^uy=}obR$elJ%`q!4f2LS9R#ul;PY_Re+7}~V-B@cd`WJ{T zO3(j+JT7t}BhKxxeNG0r3yg9L^U~3Ix1^xjewk%6!}&r6IDzlcJ^CiJb){cpIhMbfMf2vQX_O@*$ryhkHer?Zl2$o zYpt>VUgHVPHM3|#4wltn11BWyF{IU_`)DdBa(n5%r^9*2`(Vm} zkpm}PW7;lU#IpFYEo0t&WADOs%M)e)%Y2N;%W3C-1fG;d<`=&wk*8ZYNt3&W1Uo=3 zMzW=~`^3i`0yisJYrBW@e}&pYUN}U=Q$5qjtpxb^#5{vtMV1tDG_EF0sW)P~zu3v%0mgCHE`1LvN+% zQy3g57I1Op3UMVNW9IbD$30=sX81Ttg7s4LqZSH@I58fE1?VNIi_CiTdReYJmR~V! zD}+z^+WPKW{`TLmiv&b3V0{zz^$lXsqKZx+j(H!72guG6hECsYYn)D~skkCZuni#1 zR<#M}$>ej$ba=T9g;b{hYEKeovQ`%jNiE)4nK20x^Q)f3GG|Ed9>ggK;gf0Z=)UK3 zPxgcMR{25#c@B@{H4nPfaK%dn({d@2^|JH$KuYD@F4Y2&gTa(1KRh zd8cAM{`SrfG}pymXg;(Q^FE48*@(w)zIpI->~dz{K#b^MR<3y)gi3j%Vjpf-yS^=_ z*MDd|XvOOXdi;Bkx55L@QBc)ZJl9*GU|Id(NYv}9s+r@T7d;1Pv73Za8-5}*#^mq& zla&7?`P%G6cO>DyK(z2Ey1V8L{cnqG6uGjqgf_AG`Abwj^{9v`xNDsCa`I0(&?jP4 z=5w;T^Z|B8Xzi{Wr-7SudXbf->YU5rum;=*`K447zQZ6Dd4l6WB zTN3;*TjDAv5%*W|*I3oF++#`~_lpAS>_lqqSUQW|jLIO>6G43P)x;F-KTt!^3^KY` zsh~g-_W2f#ca)76a2Y4A{hGOfE=`0gT+B_EChL5r^0jHh;lOLgh6~h_AXRmAtt2$x z+=Kl>FQ&kW@DA8WUw$5j?_83jkDR04UaW%Y$0Uu4t6>W*$XPSFaw&=PJxN*r; zF`g2Z7B-i-oFBH&NIpSI+>uyOjlF9f77|GdCq4^nFqAVM`%n_p{T!PsVw_FM`@-@u zDJ)HHI+_FLCUEp^#r03S&z&MAvoc{%zFq-GZ*T_2-##2&JDO4!JOjE*CS-xy!-;u? z3|p{@_ zLYwp|km5qm(d!oO7dkgkOP4Uz{@qgA_q!rAEhYE|pFH1% zv-p~gcmrPWiI$LE_$9f+#Jkq!pzbsb2E`(=4$)unP<8Km&Q$7eKDEBg(D>*I=X=(# zdP8Hg0u$&k%J%|e9%noSO+*jpP@Wj()Y7%5@B0y`3#UpPn-hXse=(UCx)_D0g4cq&Y7y2@Yb1bESC`8k>WyfqCP=A$DyAqcBgkZomand{)@y__$ZKi zK(yY5&R708b0**5*rFI+v{E+SXEi=d>3{5m?)&7a_@9&Hyqj``-CKd^t_LV_!MfCY zRW}a!^hEf>SQ2jNkYTj}axvnSq_DM&ccm)npl5Pe!}TsQEH|dPem0>im}XRSohkhW zcD%1}0n%`xOvr59`7$bFqg%`mxvSS*{z@%1aF0wg@&&rI6~QAu_z>A=XQgmwkFWZP zWH19DvwM8Kx>j-NZ)~T3aVC`ceRn)`LWjd*U_?~6P_Ph*~9%oH);*R4EakE?r=PfR;i)i7MSWc&9SW-q{>w$q>1tpa> zWJN|4S8S%-aQ1>J>+$nl>;RP5+7lEP8TCdIty(I=m6>)CM?AMrzoQpwI{1&rX1oslh z?HmFaE9YoE%fo{n-79BE-#e1E#G&$dtvgjRVQi~}6Sc@MkmN*t_=j6`tQt*G*bE>MO)&L+l9 zy75NW5z8v^s)57zPPSr^^-|&L3r*|leJ%?Z~*}way!Z2<7 z66CJvwh2R-A(9q&^j7>${Q!v2L8UN*=GZ8X+5DqT^9L)kt3Yq5Z0>p9U;N_3FYE8e zCm#CwFVXnBjQ!O;O=U0U)dr=DvkUXu1{8$8Lb*TkzA?(cdDq=5H1C;INZ*}MN3c>r z8F-^gSt%7t5kb4+p+CPr@jWHT4cQtEMJ!Y*%wAG*&)Dh6nZ^WI4Md${oahUTSef>D z3w*~ul7OQ2fxwvufTCglm4u2#+hfw-%GBZ$A_{KyznPG0p_OBLo6h4Z1q z6Q4fs#1KCzZd?sQ2U-eyu0f~~j#Rv>=>Wb8jlYvFpw56JnQeDQxbFpT+Wf#wu4uz6 zr|_fp#F>Xky<7XjdnvzhRlgZx$a5u+AN**;I^&3@gC{pNZ5W{@q+V#M&=Ae43=4JM&HyiAz}oJBCvoZ!u3 z?1(9|e(PVJ$Sp2$$?PxHljln!LrZd2xdT*5BD%<)E+GJ;w4dMYCdswC+&^NQeEY#4 zZ&b7SSw5#VGqGc!R6bNi!|lxXr(d<`!Z2s9R*!%%X7KC8^Xpwq_4Eya{y| z?ihS3NiiAqkpLeZ&Vu3uGv7~N1>Ua+yhklZ;K(g<^BY7>rT;~gtDsFv-WmECPuoK5 zHAF}sKVxDF+sKBvSKlyAlkD{!EQok{*>-rZeGT$*@xUh&ASAr$rtP2emE@wiBj#dz z>~`rCxX+|UJs-Fw=e-=FNjNPkGybEYkF#b=h2Z1#ss#VT$O!V$!>QRM;t$h@z)RAA z?S`6G@oeCp=R=*%cvaR|?#vgZ5foJKAK@px7iTB6!q~cLgZ_SLayXgiR+l(cZA$4H zc`5fg!F=khSEQ5;UMBt?|02oLO~wVpQ&%8gs-tCzCe}*zJi+S5c+S&UF z;2!KLlS0BBE;G!yVWs0U6N0bzoYH3LgKg-w7xJvsd#)9Eo-Y@cXP@LchX0u1GY(KQ z=;(GWr{>z3afK;6Smx>iYJ5p6#9_Y529oRn02w&MRCE z6T^FK(wMS~D z$BFF7XrmEqx7L6YMnXtSC2ZVm@QMY$M?c&?4*|9u{xLxb^B}FXQpt>1Jg%OMN@Pxw1ro= zosb}K-}BVZ@Rc7grOMDR29D|Z?zyrtXG;gSL@#nX;dZ}sd!C|9c|Jm2!O4%aSqbDS znq2R=`492&c(Hn#P8r^=pI?_`iK*rr(i5G(3|1hWL`WKU);Yci=LA{O(MZ*JQrQ%` zMa@sBLUGq0LiN#b;u9A8lSUH|G(tHU!L@OCm@HH9gi%QF?AO(bX}Uc|3?yzkhD$ma zU0m|d*D0LLQDb|U8RX8o%Hc7zBq|KFa7IIZQ31X&MbRrlIkQt0ApPim-gn-8Q#&dF zM#+vEJHp4cacDJ>i_Oyd7F?{yn@MSPl~`32#hoWp`L-;JbZ8@g{aI$#d_;N_K>aH! z%M4K5Nq7J48x=q8|JK*+;;~!htNm}xoo~Vy@t~^5X4<;f$$Ze_MIoMxn~sWWeOk^Y z2^OEG|J9E-SoEF9G;C*G??SAwudE02ZI^viab=BYZ}%zblmoO@+x+?xKLI`#X(Zez zu@(_D)e9KLGZtnEu#aMhP^2|7TMf;|NS#!#e8rQq7GXOoD(DDztlLVr#nS@sg ziz)Vl5>cnhFm=gdp!GJ|1FA-<)+Xr8YxhJ+e`E?OcSO_9TaKK5E2y)`N9(#b5L&IU zW>li==tg+vRYts->_-;ur}ES+vFlo0WDy&!h?wRKWwBCwkjIIX2@nu|@i6AVL?wLS7Tw z-u`9%D(jnzwSqZ5PTKfR?cq`HySf6Nl)sR%#(Oht->w@KycEj&)JK!~8|{ET@fKFg zt$TNU;rY_qF7k6(j0qnqA3vgE9=pusEL&wA ziplT?-b*nM7oNi9_-Wt(gCRkNsBE@Z#MGGfN$h@$P*Lp4_}T}bpt&vd0n*$xTL;@; zSx9Vtip0j2ikfyFf`*aK$rtoku12&nP^~sPOi8Q`$H2&(JFruN$<~A32j&qUTgmE) z32mKysNV_1w||ZT1gv1@%R@E`=Jnz=1_`!R*o%{!9`iEXOSMieJ*<~ZPwZ-8_V13w zNnyDW^K^P9#}t=FK}Vc+iI(sRV%b!Xs?sIgR-Y|<|1e+XO@;%Tz93#b^+m!p%i>b+N zxbj{YhzJ^t1T@(ZZ{eBfZwPElgYIi(po3GtZ-|D^wM6hOvHO$3WRwVIS}AA`=eT^* zMLP_*eB#qtZ=!ByV3$0-tbt-BJ12UWGK;CfB5t=su{9=F9>FmMMB%~$T^9&(MUEaW zzxgxspYGNp( zhUpr)s znmQ7h#n`L%R?l0k<)(dKoBH^TjQ=-o+ehu~`lLeUi8WFmy*`hm7*Q*x#@8s0#MBVZ z-Quc!v4^m*kP#o2&0*Z8(!(JMC4ts-a@tEY?op4fR*Tnh*A9Bfoy>?0L&C6d_Q-I9 z^1bd=TK&vWxIh)UNV5oS#ax1szWR;U2R_hv@Ja6J9zzu>Pz_|C#KBgsmp=aQDs;UB zJ5$9R@g~HMqhD%an{2ly*8Aho6Y4djYc=*=2A!cuGR*_> z1+B<+$Qf-9i(G}pN4;^g=Sj3)E3&PUB=jB3H15ir7ZBDBd^c(LPo!UAzv$*269I*> zvbUWMC^t@?dWyYd0ujVEEbY?^CgrhP#3LIsIiVcI+O-t6dVRsc|6#GivMV*_+FtVO zE8Dmn0cqoT%m~ph!S`e$^f!fMbM08^P^bggEYN4)wQ(c`)VzvxfF-fG$+_M_UElsf z56x(%f$b54tVnY(9-!}wD6NO1?!4P>o*l*r@pE(92zeGT+}d#; zZ|`fo)P22dg11&<0)jDGOPh{6hhQM-{xq{+U^d#`38)t|QQDL6>q?SOP;Qt!pFjZh z8#%3bZsqa5*1F)bOMxPnmLGWZhMq58iX8e;SjfYvNpM~J$5Arqy7gxbrJlSqU6$&? ziZjM7*jp;^%T#Jd1qkhCc(khg=pQbS<`2IxQ}Y0l24qEwQ2shCg&&g*&=CJ?oI>dP zl))iC`)71K`7*mqa>$&lFKpDtjtiQ@tSlrUDG3v3x_fwBt#0bCu)thMw*B)#X7a6D z84e&tx(owhNOg`*WT-73)wwjq&}RwB^Yw)XZWD$tfSv8&a~le8p$aY7;GobK&3mG% z6=(N?zZLJ%IS8;~_&Ot{#9WhR+^gyoe_74#ImBM@YO=u=<6@TPWAE*5c-b+Qt96V; zK3s5-J2UZQr#wXen<-(QOz~_3o8KI06A$1>u)_3w2Hq#pqN|2v&6#AB@d0ppp{RkVHXy=kKw%!bos;uf}4b>K6yG%9tc`NiMH&Sr?B zg>B%hrA_wZ(|;&e%*&=B{HEc2Ex341gREgp>h}xMV_p1hlewV;9z?b1`&=^l2X_phusmfKtkq^_=jf|ynY+V zSk0}k(`=d-h0Vs}5dXJFqF*M_Tl_vCvK@;FO?PgmqIv7SQ)lSsOYCX|9k=i(G-K*P zXEU-WvS1tG)_iE%QU%Z@Gc#sL|EMy@>oueYvqww6`Y32nmwx`b5UQ1={RascRKP&b zx4g1+(WqFOf22TtMtY@1KwJ*{Y*JJxAec#WZ4SX*4oQ@axPfunxevQ?4fd@=En-yd zE1T2Rs%Yc6-hX*FgE&cHBGX^=~ns1f~3-RUffuiu-5rS&_{ewU;=!389GdQ@YFMR`07yKj(6smjX=zTyipCY(ig zN>F4?ZmU{~*Cwp(QFv5{-iBHDQ>nKoPq`aZ?rw*_XD7U{j_cFKnsuWdsr}oP;p?1; zB?A0DGWazQ!n@BU(nM0zG&BeU5S|@MGibIPH$pzEc_eV3$7U&H(%+2(Z_IrUQ|aNa z(ho`ci|@lg+(2e6DyQ9|UIDTc*0{l~bI4eBW`5gW z7P9{xxZ5jFu^mL}i$H&74wX^x_f@@;toG<5yC}dV9SLfc<%6hgVFbPJYib{r3`uW; zPhu`#jU1Zjv%KP=`(1N}@7<>XvbtzctC(8c7&di1zyXbYFZDrJQjJH^g-kGi>bSnH z?%KP(_xz;{G}+Vco0VAcVmpUWL|J6|fsAalmE%gL)^B8uKGi&HMG7Nz-wqG|`fsO9 zX3>!bu0lO|x3W;zZQ9xttPZY&ZQo{6Y9)=T(3#new1ySW`CbpbWwPU>$gBYy(h?Z;2ACvyxCY;!#*mPdjo?MUz%50`yo77^&wI)j5vSuPHHz0JS9JO>cOYuSTO1=?Mx>1v4S<}lN~pr8C^|EI6|Zu9;a|q?ukqWe|{EyRs=)frj#-jJo}T^(FZyzJp{&h z_kGgxyb{1+AN~Put^Y-fZuj9yq=~J@G6E|A={+dVOQH^^{50Z9{H8MPyQU{gWa=-J5Tpr-O>Hv_}s)4x#y24(H!IA40Z73K+@hqk=RrI(*V(!jDGS}{eK zt|5!;)4oqNYQ}LjWrGsr*%&lJAg_e(NKY?>ygxF=gI>Whx8jc%ba{a|Dcwl@;owYC zeA)4W;yD=T;H$uPYXxK#FyC~?GeupPSbfq~WqTw&%>YBprBdvLnB$nt9bqJb3+?>b z5SI0)+}(aEhiP3t>Dj)W!VuqedXSnoLEduT`hCVP3P>-O*W%Ht{JN)-(8cB^>e zb0NxaBvxz&`T9>+$>1XdLb{!X>YDY)j6CJ&@PyG z4>(3gIP|mv`}Mf$M)74cGvwFwGRA7p?)oDhBJU`K*N?`=d_Tf6S?GOK*s)}Shy67Q zx1TcCQxKb2>)n0}(dL$X&dvHcAj@5#uLP;W3THZqjMfUtzbe_h!&1_^wae1Io-XNE z5cq((@=a86qVV*-8#o!4JYbx?C45*%SiSg{XZ^!{RR+R@>$CWZj$Nztd(>G|%rwH| z!YqVJ@C5;loT%xE@eTT(1@_Ge6eJrTy#Y6{nE>CY>DhluXT@kv>Ek zykqdYq@I^zHYpO*|4h1yWL|}px!M7zme?rUQ}*VHSsq)g)EUe~ueFz3t*w-aMxvGIldY8;fSf=MC4offU<1;V-|zdjPke{1CU_{Q zWVM`69&AHh<@Fq=1KP?iNf}YUyGbT8RBI}Itmt8#l-Yl>e!h?p!*L;D%z_IlPenEI zlxgiee`QnnVIp20+x#cX3IzXW=y07ju<@mkdKh`^;w^)7^k^`vHXTd3mbYCc>Byhx zml||VxZ_l+D*)zjMt=XT=oX~q@G^w80q1gOKN2fF-gM-<%;zZUuWjE6zeZ-mfA;k< z8yJX5h$c_*47)vB{44@vSuy&6b+>%^5mR@Ua!Q}a|C1y6eRP2B@oI_)sW)!e6ASmZ zUE&xmEOzw_NstfILIp;!7k;{4Scc-sJ}+&5SvRLGue>D6%8u>P@nmJ4MS#cN7w16B z*o{9fT~$h8KDC{eoN~EEDPxDAXG(P2w7d7uElpEi@>4!h8=;Cs#gl2bQ%Z(DFK{Z` z!+!QN2mFoR^!9@*VGLjH4eO1_3Z#xTQ_GF*$lbPvP!_~Gj+aj!QtRLc@5#!l4Cp5_ z=6G(WnF2TL)1$iVqs{S8TE=e8N%6|s>xEUW8tF1g+t!;04RhtXzlA|(;_9g3Uxb5a zJJ@Szq#D+j^Ta((Y9=jhuF0&jlXrJNf+Bck&~)g`0|&{yY*m3;S%#k6Et$WQu2jDX zWw$*X(8z?7=O6JTtETkkTnYEBSe-rhGX~K6&cHVI4!J@qS&%1mUxq^ z&jmT+;_QiIq_`q`BPF3yPq>E2(|64rxVzSXKW??P+(f=0Q;vQ;xf|VKSf>$Tgp05K zM;^1!HZ4x(3o4EGZm?QUBi2QupV!M^H|uGIypIQfvms+915JZ+wP9(1ZMb9Y5a8!_ z{$`1lDNDKAmmkdhHHuO*YfN~Irp}3cuup%kKHvGM>&ANK4&&1!5g6MCgmZTcj1t>|er{@zE8 zv2(u7S=Rd1=-U|)XhF2u8N7C;0996$pSBWO15&N`D|{_zU2yrg$fi7F|2rnG@f-mC zXeo5&A`yY0@%))EBGMxdlJy|~m{Fu>l+x)jy?`6)_tG$#Eq?ZPC7D_PYUj-`i|M(? z`19*^;Gow@*g|e0*WgmO=RBs#j@pSzrZ>4wCy1r{uv%4`Hsn&wfowPY3}-tQ9^!(1 zB*i!(wS4Bg$?yTV>%faZ{w`}oyPUiMM(+}1-oMUOmk*?(B0*6tle(s^?rhK#n{$4e zQi^6Iclnys{y7=bIPse4I&rQt{l97Hm!IJt^=vk<+3TJrWQ}p*U*PRx-PtKl`!)_R z*z4HSV(@lTI@tP)A4@K^Lawdx%Hk=7wKtzZvV#e|A?)G67+%6K^- zC;C;3v^wYbe&0D|apV+Da0;(hBC7(XC(K|x~O_R9^ZbkwpzcVF9 zdl*g#k*wYjcxUkB*rJPKVzWfy8>g=_bfGa>%qt7sC*I+Iw_pm)@X<*4d!X1>gm*8C{=2=y=f_FWif@O#cCG3vHF zTedh-oeNR1VFg&paq94sQ&s}5p9BYvT~*fS=E(WaRy*>ON-iC#EgukiP?J zFBxxYTs-=W%BO=XRbLS=GmJ(_ko7NPXKqHnC@+0}?S4J-gUe`5CQ-0{Rx4}`35aE8 z8|uR+yW0)mOvrOWb?v~p!xJaoGr-_gpUvBYY}jI>ocSVIf0VZpO~ox@3kf2#@-bM3 zkb@FfzxOpP+d0OP(xpk5q`!b*IyDwaOqsFpMNA(<4H_t zYA2-X7T=4V3qa6zcpfU8hlAILdN0Ynfu+Zhm17$VzZPn_STR`3BIG7Ql9{RtCkflXF76bI~vkGR55)0?>Ps#h*2ZAT~A694|?Qh7h81&fH!9PZ5ql z&+s#$RTG{5J&Wu*Bj?3sP{`s<(Y^(5O(m(3so=++hv8|WdueUY^;e7WUn?!%%EO;B z{%Ww<_6lN|Rg?og$k-wo~lb_kQE5wqzc%!%%G@7Ti-%K{KYX73lSc5#{f1d-r99gN)r!xE z^y!V{BBAi@7w+A0@*?GDi_Yu+rukAxHoPrbF#H)Y4}&Ph{&3)OOmH=LOO=mZOQtHE zL3Ef@lOwcPiy2<0ZOT^Yn)xvIr3>gJgSSpSQA2KcOtT?iaFF=vlc=5#?nRmCl`86mtFatL}M$#k5D{9^8Rk7f)klR0{d9d`i`1DTDrwNJy@f$*zjo; zZVamad_mzv_C98u&ph*sp=inok@yy@;sF#}5%n-qe>D>S~-UBto$&H!q8%qbLe+p?5X!${Cb=XUt}^@cNq8DW`ZlGgBmc(%bTmS zMq893vZ%e;uok%uNG{WsPhGR{vIa;<&9oqw!%Zr)0D0DUF5LS>DRBQBSRdJvzhApe zeJ`o4f_9lh4q2W^^F#-;VV8cK1?w&IzolQj^saMo@bQJ!rA&`Y5; z`dzG_!-b48OOdwyOMoKnnfKovYDexl+|YT*MUVhktW@thhUl~+{E+sT zEWmD_n;Fx=8F(@MK7G?4y(T2@Fe@qaG|Hb+&tqoX4RllDKF<}4RtfUF&KUmy$QE7O z+_84FWl>x(dy*1OT)y1itw~e-pc{_;kLR3)LsUDeYF%|&tW$YRigjOTeE6qrrrS5;MeSZ^l;)7gZuw>{X)+}WT2`;ME?E-;&{u@ z;t~QLW6RuwjEioZgTO^YQ7}jEl$pifLbrHR5gT#5(RNh=&W-rw#FT#PAl zUbU^?Zx8l78oM%YCp>cwvltDfyqnMl{N-6IVK2bGX?!R&e1X5+I?F$&)pn*LIk7`3 zWN_NIob}H9yT0G`gQgLqYilHx<-dCaxGFloqF1dw{1*C}l3PBX+$?-X-ps8i9+<=L zk>$fabym*8g2nd!#SX!tk8FJx?GTIDy9-{rczAetg{Oqx=T3^oP@ZTo)}zW4H@o{$ z-2UeOl=v4l%dN%3%F_ksM7+@MEo+?lj_tb>Bm7*kt)_hHqVD4}f9n9$a#EG4zQ<^i z^z~tUCjR=jRv7ECiS)J|a0@H0x)kbsW?#~MDLwhv7hJ|^w^3V*>-15?!md8L z@e_9zcBY;dCI6mV2S8i?6V*=3t9%D+tcgj=v9wj~~=UBt`84gacu^HlC!#Hzi0a+h@Ifr#0|v2eZtg5cCsqM5g+jxCN?E6j1qB zCE9LVKB#YBm@-(JK>+hrw)^bm>lkj$(Ro`eN%S=ndwcPa4#q$e7Q5dR7)UJe!9>qJ zYZD7_>U@uJ-&AfP*7gojanKNL76nHYg?v%eFXQ+NSIJvPW0UZKHC&g*QRd#8>97OV zD~A`?5f9i3yjj_^(1Hlv&ho(}$o1V5U&Ot%-0`c81EDz_!@gp#^9XK+x)5v1o&&k5 ztlQm6LMvN2!tPI65lpk0oStfqyB$V!L0@Kr^(C<5OVI1{puk$GfyG%JYEXs$;jV?g z@OII2)11kcAZ6qHyj)%pX$I2;r~7Q)0OoWny9DAQ%?rp>&OxGr5Vqk6=v>SCjNbHZudO>-)x;ZujN zlM}AAlH~i?_rVMdttE~1j5Xx6mO<@#11mG@s(*e}49;fsepiYEEv;6vVut+b$t9$6@ah4gRm5M*n9Vu|#<14R%6OjjPu$|F?fhO-!5TWG#uYkfzirX_Q-I1!6>$0C^%59Qm z1E4@Y2d(zHcGjw3mBPzk?iCr|R)5O4?K$*~(okHk#(r{L78_fp&Po4;Pt8%XQ9(F- zD4CgEKs2L;GzyUXZuDt~ZfY%jZHTrbRBk#?DIUMSj14%J(Mj!YLtEtmR4)WuI-=qBaJ%Epl& zFUL(!NAhDyjoaSym4%J_w)xcyO6k;BCVMAqCV8H}xmcaFW5+^f5f2Oan!8Yj?d-!I z8)fWzgcFOuH@<yz%zX&UZB)VKY~=gVtI@BR;EXTj9g_jc{J6lrm{;Ki-D1-Aml zihC(g9EwYjwz#`Pa47C>MT)xxclRI(&YR!7U*P$FfHRYvnSJ)&>t5?xqHl14l^H@H zI*Rie;?pB5oWL8}GZBwJ>W&<9vW2CV5RKy*il4V~EuN=x;Z zofUp5fNZ*j=2~P7Ml~(;Ytp9hHRIX@1+8fQHR!YKY&A)YDTC*4|Oi!+bt;#UaC(tEcdC6+Q#U1I3nP3mKE z@2Lx#>dWR|8YJ$y#z+qGgAql7)yYD)_8|)~_Li5`juDxLQ!P(TGL?s&!71|j`6;Z; zD2}6MnbpxC{qHmTG1ES7UZja-Qm*(1F4T-@X_28;W?4gA52&C0Nh_-IpCy<_dIaBd zo~&WPyP_H_X0vhdWU`qd%2fwhjH!`G@l=H(?N#wJjT+xR-Mwqyp3*7Ss0_fXPqtf- zPy6(|F{i_ujJE&hy^W#35*TK;{W(-6(34BsfHtf^-OftKU+RmO=ES>>GJ54r$8V0| z@;2I5Tj*1lB$VybA>_FP!5^@*uNf@FGk#>8{!*-~2ljhh=MqLgpo)7h2a5uQv9?$% z7|TaRWBu3b)U1fVG;Ix8i6TY`tU1?4N~@OxH_0u9p(^udk&`HPywqmDP^=C$__4=T zhU@T{Mre54fbj%u-2D&iV3p`|7?;eCH#z3kBs5gX~|t+ZqeWjr@Xk zD66~yaN+)LMKoF$c~@?}K@zFTSbjtFB#di<>xQYnQ=eZw=4ut3o-lysJ1@7&5MM6G zm;QBxhbBe*CLU8G3HUusERM_K{O9t-UJ&E0$R}-oSi|{JwaM+>1mfz}*0kvEeGxnJ zJX%z5%2BsOC#;Z-gSvExo3g&7{Rv*eHaA%3QaG_=D#F*=;qBcT=Y(n|OYh?AWSD&G zLSxwi)5{TM+xt|`=OX>&oNm<_a4ljMSgq{^zjW-SX(A4AO5t{hfv-KkHYpCnoaw!7 z>2#yCV3$P>kByY)R+$|?uC1Yn^*8X;BqsjR{zdO+g_C3+wNEWFkp~M!(wfNBOHr>1$o~V-`;7FE}Eie+eZ+ml%fYM zZUtv7Be-<9VFvlgJK9sVAbN^M+%x;Z+31&8iV%6hn>h8>t7n>&ZE{DRlI^sVG#p-I z%B7Dk3zAZ|Z0gZBQlY__+1%79A-2SFgOLXwBesB-2N9|tfEL!tDVCV10qj}tpR%eO z-V?SnZ{F0}+Fdg9;z#@QO0-l8X0c)mx&-f|%THRm;m61JSnJPp_Jzr;nvJpr)^FmD zp9mACC{*Ey1ow`rSBh4#bD*~n>=ZfrWDTh(vD&p6xBNiVxPGrDMKONvLt!TlrHT>n zX|^1;FIYX~$_tJxu>)1v(vUfmla$x4wn;3ZipnpwH>0!;a4!Q>P=Fo=zsGd#e(luX zkivO!7;5`f157Gck7L;1DB2noL`ZB(ExIo$;9mB>lf~nE->@}b0i?IWRHD%w8Vi!a z12SIS2b63%2C0u={RRBLUnx9L;Bxuytr|@@d@hhwDZTX~pt#PR^WUEj=U}{mc zNE_DspA&Q#7q9WWJuW|DRH7B4zb`k#G%|vi7jMkN;?J2U(6>EOwvXpYvxuxISGM=! zDJ_}MSq%<^`R1j;x7Wvrg0Q+a+ul*~M#f@#xKXa(`Db%B?Scqh{@spn`t}gtCg?$b zd_Tm*^k}rB${&H}APSWp40BxHb9yQBhwby9C{2jV%E+{ZV26cT@w&Qv=?dJZ4B899 zmK<8%fLe73BLo`KL6vQEp!P6;8oM<%(QE;WFHAJYM)Vs)#&T_VVm?FaA;j)f+-}=C z`v)G(F}H=^Sa(WDYW;*=_XWGg!TkYiW*Z{;cTeJ*WAO1G_fGjuvihot>-3JZ{hAZ& z-VWKQhGYF4Ezk#(HV3&Ic?7dUC-o*wN3Rh z@B$*=TY3;jutY5p39{n#=}o8vjl@X0?(U_>&%5L4f0hV;K|lHDyDZTizNT+!?;;j! z$srb}QiHW=`gOcEpGSN$P+h($2{hV&{*x102eWhTa94*+ohSd@*`2`4vP=EpM+yqF zx77_Ga{lq^)z4Q7GLo8n4Dy{xPCAS4C6$A(D){dv$l=_DNIM|P{_|k9>_>oC%yR*d9y^R8eD4b-oD_5%h@x0wE6EgAr^SQ1MbV}|#uzdK0`Ka} zYBxPZ-a!t-7c7!7D%V#3r3Z?IDKbxvE+w0aV}R|~i^)Aq;$vk0SGJ!XZSk(0N;S+Q zWScHxVB5se>ob`fJ?w9#%R&XJfAdu<)ZI@zc^*$>eQEhAwP8CYtGgDdEhH<=_w5ng znctrKI##)Wu>V8_qbRTf2R`Z%pt=0FY<~C5sMI0AuNgG+$Eb{p6Q{#P43E`!_S;b~ z*@;!t+D`Y~WO24$c9xX>P?AWLJ-^$J43>zC$d&oCZ=2S)yg_U$bG8Ii3J1pB(dLV3 ztngt6!`-1jCCc4=9hin%21NGErg!Q@F}?86ANFkJ=xx%s^_cs^==oFjOGnWToaOG1 z6vonN{`$40`1og!9U7?j%bp{-F6KSdo`JQ5CRo!cYUaxK>g;FOL%m>$GX!S`ewK&q+V$m247(HWuA7`%4ut28-Y1;^lSLU(0yCr zRF7BpBuO{MHc!aR_Sic?M2w$$*6-;%F_c;>3wc1-DEQtr=3WOT)ZUgKUDsYnhn1#j zTWKJ&L5<(rt9?C@#C!(r;a{_lw|4hATvpj`y)6u%((G`O4Tu_*XuO5#cL^fZCgvq9 zN`rubgA6&OS<5TV)_|WZw5~*+BbH2`bo?K6Ca#`4{X;rTIZZZi(-BP=o|Q2EI=5w* z9Kmt}jp(zt@LF`76U0iS=zhPFjvX|RIp4a)eE@Iv=cTvOzgR2moT00X8C)PO8k1>_ zNX$4$A0oJ>Ra)C_E)TKTZ0LTxw*ERgGU}T6>p*!* z-q(XQsLW_}KB5?W0pt<%;2&Vk^-SppKe@4l|1PRC3p6GB_cbg`#VriR?E$tF`a>x- zE-JiNv$JC!{L!$J@YAP+G|<}fnsn09q%9xnt}V!RX3Yr(Sf;d`|8GP$EcQoD zaRs-3>}+gz=p7a{I4-Aa)bRr7qe@Cg#OA-~aid!^rJ_L?Xi zp}&r2ieD?^R0mRSeJb>{n{TWsa6Guvb=ZH7>1P!brjgGw`&?mx0jJa@0D=jn8Jx99 zLb1+Pr2vc-A6btr@7{+BNwK-9ZO1ySc*-yyTSPjSDasR}XK%lsjaQqRzyNkBhhQEP z$CVom`s8ZPSz2Ouw`*^0iWdz4gFmY-7*pK{QfS32TZjtPNOD$S#cCHZkM0As(K6F= z!hC)coN(4{zyv~0g{AZHHHw*+6EKbR-8_^Qwv{*UxoavbHw)N-wvd%hW-SqfbqBH%4re>wecFzEl{_{4&Xo8=#Tb2q;8H<%() z(nD%7@lQgp^qFJZ0|3&(6Wza@8eCdbgn^zx{|Ox__eYNMF7@2p&eB4E5Mx;ApHwFy zEFGceZy6L|n|{n9pfLmTqZ|yu+Jqv8JNQBPac#NNDrK?*9 z;f5rDux^zR5l5|I+));Ieh}x}D_t>HO(l(twa$uX{%YwXMHEErwACcv?wR3poe?L- z;Eux>>qx}BA>$f^GKN>uW(7em!%dFt#L-Ojjx>e{S>P7irfD&XwcY}j1kb!oMZZJ; z9)S{@aMx%GloDlCk1%cdIenk^?NYZp{&W8zyRN)FH4XRbff5KyF$LLI2FkOlD+Ghj zETTvC*#+0oiM{NWj4krUP7}D9(Dkw(?%`|IrcI5ArDJ9B*V_}H-&}kfeCpZ6L4%2w z3pwL5z2wnJi}b$uIS}+Le7%@@lM1yWS@ouGrz;=|Iwu~b%R>X3GSgCQu`D3h2+J1^ zRW5#wdhN>xca8rlY&)7}6Dt#=_zZjty&wKp#u56YX>DI9D(r$?Ny5j_WI*I~9x$u$ zmg1Z*uwF@qx7T~y6X=jcE^m50^O!@|`2=8IxzEG~^M%Sw`pbS?%9b%NN)g@ulHj(% zbf zyV$X~>K100id+Na&r=?!feXVn#3cM57aIl)I~Q=$|golJ|o3KB-c@wWSD8>j!CUmUncZuSlHQ&@U-y8P!iDbo(R^Z-W_{Aqz(T zrirB9|AgXY?6!7F2?wo`lBvZDA8DQ%^LsP8Ul`~**vD!v2gs0_n>|$1zAdSLusG(| zEu*;814ii?iKK?S>;1I2ub6VXJ8MHkHvjGMGO<1_XY{6WCDbKqKMl`&Zcu2MefQXi zw?ZbU#364E(8vzqtS?SALABX$9#$)AcOYBeCc4q!laeB(0bQ6k8jFJAHTC#VT{&d- zzB;6}d&s(_&D7CwDJE-QeJfrJ?&1C=kOKnV|0hik0*}KM@ZEq+kEKx8N`ks#le`6b z#(5rE2~x3P^85^pS@*B?x(MiTD=6aK8xS_U{Ssq2AmI4oMjh9Es|E5ST8YN#*TvTk z(qK;J65vCBTYp6g^-#;b*K<)+ zF>tGVX6ln3r3#h+l!l7d`Q1U%cItiOnDN|@CQ5;J$C*?#K0!}nAp+*u#$d0rxfaca z%Sh&O9kKRBp0k$`Ux;PNUZ>Xs7U=H$>?7AkNmsW_v4?{(!iMquw+u;W%kU4uRyXoi zIKAgW&A+hvhfQwa+SDGAivuTp`#nE|!s*{);GZs9w)}o?^Q)WTt5_ky1;oRu{^6o) zLBroVZu`mx%Oq$%@hbXT4gM50SZjL6X8mO2xIdJpx@qrYPr=%0R9*~yId*0ivZNaL+ngrJt=bMpjXaO^a5c`%)kcGC)%}f z?z8!%%Rxh{Q*J#TuWN1e(kZ9~1?J{<|mkP+p9Bq2iWF6h|bpXQO+ z>!6nq^Xecdvu|mPcbSUdi}>?+CFT{@aNS$_Mrt*36+tTcqi>r?7L(fKN;KP#iIcl6 zv4_#_w^x1Y*Zlnah%0hBj%!6kTWsvIZKPaWrnzA}A0cEtSEs{k;g!2fm^2V_mpQ^2AVw-hj5*1G)!`?Wl#C@}XB)PBF_k!S z)pf7)*&Q+6ed2q5n#Siip$t__CK)$n2r=A)J2-WKjr_ZJL%4^PO%IdY9gw`0f*P}K zbnMVF_FtQbz-b2{kwWKV+%uv_loJz|!*yCgWO+wr_W%0k9h3(I2$kkxF=zU8zQBh= z-abV^F44Vn6G{`% zP7S)mt$mAs0HQ1C-Ei0Wx6sH7F=Sb6O zv@Ux3Fj*#q%DmICq(Qfahk|S17?)(fHgljM#l-Sx^t8&4*vZ+Xls#=u^jv=37eV9| zy8=vfKpyPO48=^Q`j=AOql-e9v$GM5j+4WHck3?JgHTR~juE)%gLm1<%_wg~$L*FT z$e&fXt_*OOznx&X%x#LZOu0-_L&R6u5NK_0nHB}A=!3W5S_E-O4L5u}+Go)pBn z$?Pc-llB-XD(jq2($JoQz_iXPsnW@>NF*|A#C#JQCWBQqzq8~z?AF=dcUs6#VX^yS zz0NbZ^bYM`s==#>p2=P6m7m#~7s(R)|yoj5!7law=dA#Zc zv4N2N#A>ac^&F+)fiD?;^+7T;5Pv|_xfngbsQ$CgWbfXOHVtq%)s*1H%{(IdytTEzmv!}2Ejl6VB$|#tDcfzoii+#__G{3nc=_>dU#wG6(3wYETW>AY{|n6f zVHep=7LwMu@NrqOoZ!o?%Bi}ek=@#mKcax6r`GD*mgy0&9TJ~;!5k%#^)t^wsy@nF zE%3#RJV`O1-nMi?!)_3Et{`UfKiPThT^0XtxuzjTNXI3lU>|Bp1+=SjA_Frq_L@Q=>zqVDJu{Err`><3hN#+q3 zKH8}=KK!#MSL=5*Lo`$^MwibPA>Zt0kv$%No$VX>LR9@9Jd1EdjLPUv1jSALW5eri zCl1n5W%MjQ*(MvhVVJd&dlX%Cs#w;G1V1K~2}2k=|NU4J#uOIdr|>$dtgaB^b`0Hv zO;u_;S`Qb~+ca|J$WdS)_{HZF_PVFbE~Nu@>w$0QwWHfoBLOK#6hWHo&7wYgE|EGfTNBT`CdD|LnatNh#8QJ7O%t+dggx#8XUz&daZJt_ znH0o3vyoy;Z=yL!VJk=}7t3oLR7N^CKRyrWiE-G#r2F+b_t&`8xe5PrQN`m4k(v%I zsS0{mI8PWDC**gND0Ti-r_D3@jzHku_a|f4Nvy|m4_=B5D-SD1t8clEwbSYC3BGr< z7@epXMm{6VsPugd6GIz4oWBr^9-X&*8Eub=FXU{Ss4HTP^%PY?A_Xj<{!^H1%5NT zwMr$8{*pSjS|dm$ps)Y&yan)&&0^Of77wn7R;V4=Iv}CCy#2RMYCvwAQeB*JxD=m& zHDpzPx0Z`OWwG29?Qy~%rhzyP!TqnU45Q0dipC?=;eraK0z2nQq8|0Ly3tc*EghV@ z<(4SE^#+kf!GNu<^ct~}N%@`TmDWI`m~9!JNUk+zR~ShlCC483r+hWGvGub3_x4RP z`l=Yk*7g5Y?wtE1#FS^8KxHm9n^vvw(Y=pWY3?%7-QFkq;z&PzM1>!AXM-)z z1)y{`(zF>jqa9Enh6!2-;bA{jy3Iy|z>${7_lr3jkEiF`g3UDdOs+r94ueLIwkL_2 zvV#B~`(WQ;*Ppe({O;7_hIAM5tF}zZ4AEwPc^i3W#4k`n44 zMuvru=KYqNPzE*~1xNE}v;7HY^H2b1;C-Fb@P%4423cYapo7^xhuxXx9OTV5V=Lu( zRdQY*Mf4Jlo+1nB!s4F0{}R^90rDaehPcztggoZnFU<#NMr zzMT;_#6^yj%3H9}!{Q{mDRV=2|Gjr<%r?EO#}4}Q$}fFAPkG*vk{Zzhub;xYau1wk z!7yyr(*5y%7K`?O>S9WK@Kx0FnlVmcE_sS1@R(UK_pKp;b9wB7r(n9>=CI6?e6(}v zS6k&D*63xsf7|bP~{jBqHM}HF4O9@SX5H2}%Ntx*k#lh08Q< zjXo0kRauO(^ylf~0uAD|DYqzLV>I|+haP3+_B||uDU5A|`S@l9*Na=FBq8qG?jML7 z&)m8hsZCW@#)fw_c)2w8B9t$M(#MfPd?%?vyQjjedBst$%U_Vsnz{(sTtD>xzyYK18MK;(R|})evzZum#eVO{=FM&!L zje9e%!moYn1*g1p^oY?FH||%54-B+NCuRRwv1PS1dOrHG`lkZ_T0LpaG0tpHnB_RG z>(DLW)=A)M9iaJ= zB=onRM;m~Xa@X|rcW;tyUBD?Tk6cwH;&(}(I?cQE{`5v|0FAQxIYM(sK4m9IZ z{|{iC1kSL7YaQxn&p>SdtL!zW)!h=jMOS8#CU&OYv#&|(%j%@~XBT#}M4vlw=Q6iy zroYw7xX)S+SNvo8t!yo|BoA(3X#LyRE_OzAE(+zQ*qIka_>oWig5b@Yw=C~P)htpR z@jWLZKn9SrT@o$U_G$O{_g61*XLS7i-fCn}oKoK=JtzFctozcnR`(N)jJ_F`uux*v zB6r#*@i{CzXYer5UP6ey;f&*Bm&JZpp%SeybtEs-eHx8~^by@D&Ic{BIJOibustm};iZSC~RV~1XzrlyZ5E6A59{b4l+ z#8fM-3NnbEy|l7JFkt9c2vi8 zFb;b&CF8&ejp(bnuj(~A@Zm{yuCrVfs$KDol&P`_BZMcBa!D3>qKm9%Wnue#pb))* z8?O|Fc=jH~A1*w5*Ew&eBY$w?xEw|iy5wDFPk9J!Sp8OB6_R&l;U%Y+?8P5)Rlh1W zV)01+GQPgcP4!z)&q*(IKUMu6G1R~5!@b7@DmvrEu)=}+Muk>V2aZB$WJt02-kmAb z)NkOF)s}ld(mDooAPZ&Xz`ai4ivwEGNjH{~8E&5wwLCdI)(Iw(ifRu;FWi&wYbklH zOBY4YlnVRG<&V?a=mtc$iRYzf=d1o3NtTp59VLOEiHpY0_gao#OCixK{ldG?pB~$Z zk{<5W>36zofq~U~diP=WMY(g-K&=~sb;%gqH&hmy`4qgEa2IILX;?>|J%_kbl6lCo zd=z&q?>m}*-jCier78bW>#s6lp;2?vMrhqq!%kkvn&74StvG1tBvxTG*)FoOjOMk} zQR0F%Uw=z}0)F6}v3_)TZP$n!7of%ufaP@p_=&*{5LO+_?=_p1RG^Ca1pdd`Wmcd; zS!Ot&3uP)u6B|^_Qz{LjQ^wE%&5pRR6j0}S2urm9t8a>1G4)oQ%OPs`YBZ_}z8`H?78H03io%S_nZv~|j-tZqCPD9m5lA?ui?X^}hs%o!Ty6rEo zA~jpzt@!!_z`fo6=Ic^i(-VN+UJou__;nJ49WfVE$fFRMQ|DfeEoR7yJP*zL?^25{ z7G@>RTg>bSG->FcQonM{*}J6{G@U1jL-?s1Pa%QlvP-dLRrsrL}-@!Yx*-GHFj5&UOcN zoll%c^>X^Bp6{Let2YF(JRBFQM<&D=F+;>Zh&QN32KF3)Edl*~d$TXGUJ(mlJ9=hX z|6I`=M3s>!f!n>45WOzm$Lxt=^3{i#Q~%xx`!%uEj0*@z$-f_H!yRVeTs71kMN31X z;```iPR2@gxIC*k<{$l&Ik^T! zT3Y!!Egj{a79-(_L&0=EJHfx?Fux7uXZ=`gQ?NRsyO&ZdGh_VlPEn-x`QY=t;4ZbC zt_^NWV$>2Cq#?5fzTQjJD=UO~h*2AA9EJylvJrx3J(YH5ekHCJ8ueK`Z<&1Y9Tc=6 z0YXTso^u`w*e$(Rwf6wYjr&XPANPo5%PLO|fs3zCBi zQj#4^d-iIyr7XaOi%&z<81?eD% z+&vRFE+?&(3N};%jt^rdEmwDh&j+x!l$rxcRP*hV8!;Onx`!f14j&x5dUxGZ6hu=v zxiO&u8NlygX3pi0tQn66CVPt9(aS!9iInyDy4{ycfK24m zyPn;^h(6h?|F~2ZqexFoM7rjsER#Z9s!bn?H4en|Az{`oZ}qQMAKJkWI|%4>XgSg& z=w;160wDpZzU;q{Ba8-z0-cDcced{-p9=P$>)yDGe3jg`eWvR|x5n2f#9)Nc$QF`% zQ19zBBYNJ0oG2Qz{RV1#jGs2*Wxh%|k&WEDIGUb zFzds4s_Q2$-eUY@{aleZ4^Ku>cSendvGQTEiw?u!&_nAAYkeCbAn&j9n)97m;jV)P zpihgr54W?WN}_U_n~oIgn6j0$oU(b_-e;M;d|O9_rT;Y?b@EN$fUZu1Ke4HuNJU7a zUKaOgp_xRer_}}Wy{JR|w{o-*Se(5nR-5)l&PcxHjh@7KJ!~s!b<=lc72gs0*n)xb zf+GM43dVo`3YesH+|8tbAN$VKbdEG~`Cg!K=v2SbCUz;%p0YTTSFOY8i95vs}u?UJ~d|2&@g-%F}w^5tcn@mySIWw%YiehyM9sD3* z0898FJQ-q>vYq_2x*WslPdj#%AdQ%H-Ob0Szse!=QdG!fea)4}wX%hNy@^aKsz+T8 zx3ezUiWB_}zj{Sb)FJKne6&=Go^U0)mD|O7gS_?6b$CtD`Rr*l-&XlM4PUMjzx=rE zLE6ZPQ++BGitN+H&*d>x5p*q2nd9Tn`b^0S`Hq5n6DZboydTg+FM|W-w?ps*fOkNuPV_WEe{eFjr+Qb?=<0K=>$mRYV%Jc`$ za^wnWCheD`m4MhSklf=UowgdzXa-n3{ni#ue~)o5$xZQ58ni*K{eE8$!WJtI{rdJFEBa0G`H)GkS;;F?NhUg^W5m5nYfu!NKz;Kw z`|e}%pU9RVwQho32Wzj$OF3U}P2|HmOfjAXPDIgS1`y7yGF+YLq|gJPq$mN(7?ysW zQ4q&(%d0FnF$|r%;X{z#Ra(~eTq+syWhI|K6!r!*7fw971`_a=IdYS>y|dVDAH1S1 zW}7HUanfUxFcM)cAcg|r*9!<>^%lnr7DTDY%D&1aV;R`{VX%&P0pzye(U-KkhRCa> zW2CCQuEt2Rs`A2b)S;Dcx8)5|xYWo|)*B9!ms1NgHWLx^*G-S#e{!6B1%odpbfStJ z-19ZsQ?8f_ZxQ?5=m@D=xyZTj!!qqz(#}qT4WpV1+TTB+ma-}Q zAbBjviqA4SpCFf7ZbsRx#&(33?r{ArehVunjS^1zPAh}MEPrjGK#Uvrb42l=wRP*w z%E|`9eKS)kdX$m%nmkh7w@+kiACU6|pX5Lax64f-vKWnbJjgDD41T0a5i<`gLVcg- zSs)O&?`5WFCh8&dgrB&NCFtnZkTbMNd1p1BmYTu`hhwjSP%S3z#@_oyYibSBe4*@Z z9G2$J7N>o8+ElX?;*T#ifFrCEiXs#JRv}8QP$uTn%l<^6h2PrRrUC!S$Z^$=cIs1h zhClKmRY~sKC0%?NI zP7i=}mmYW6TMOvykKW)#abUsF*m3}ciTX(w4KTy`I9D!itv#`PMWscKe0jsf9R4d@^<&VOCN}U)p zxC_Fm0$AED;$1Mve^mpW&o56Y2xZ0rY5O#D;EFDWo3&n_Mw;7e9 zOVEmEUi#eAhVCdOAXpqrEpRX|)Vm$k^m zz^o(h!N8yc53eml;Bg~F9D%>FrS6GF+y%~le|_3uz$dGlLU=V7cc9ltghfCjzu!Yq zw#(Enxz>8M(W>#&rSfTQUIpui9tf(HN|K4p;joV-^6Yt;j@Q!(w%-dJp~w~c9bF;* zFl?((o8nqhpH|8F3sfMO>WM^#amp8R{;}ffv9OLmH1<|NGQ#(!q!{tYn81G=o;F7p zil@hk$2W+Y25gFd&c12OXNW#}qcsJwr|Ag8D*sDFVaICM_NR<|Ok)!x-%Blye4;q@ zPv@pkJfV&_v(@GmWIo^MN5$t67)Y%4xHylzXJR43tOGpFaM`r3&O~U%GwGl&_ixcR z=9v=wg?3vd^>H+lGK6YkTbI(`lq=2hCD1IXfkSis{b}Jxe|GXRkYKo$oSK|59-WCR z#WDQx)N!>9zt!ZxRX>>Dta!40N85Hebc~As_so~G0&N8SJ-`(kRr#ScY~?bpijDz_ z0MGp222~3GAHc^NJCAksLxi5glrfJ!HqgmDu8x|gVY}ri(_No?H_BAA{St83;o!*Y zX6auhSUX6hG2;v>pf+w2(Q8-*AtCZPL zNZ^&Frbv)|T;C<}8QjfMH)Oq|;=w__a>P+jO)Htrq?TO!!1(%^n>m1=DW3z#x$R;&dIvQ zqb9qZp}}~ZYJORdWw<{`-Kd_x7V!wE=pB|;`)1FF^U;HMzXr_n^mVBJA z!?7Oe;N?VESgU_6zFE`0cy4vc=un=YPo{Ij4Zrq)mUBuzrBR+NfV4N0&iY?BWG}%6 zCL>}w-8^*rP?u_;Q!L zr~}ggBLXZ>Hr@a-glzpdn-NG(PW?GeUK^4iNw)e4&s#qTFIvDprpEnyp!xje_nP&> zZ1gci5@a}HuIU#yt^Vku*}Y4)e|PX5c^6DTZ6GJYT&nxsa+$9~Bzr!^`wD?d&q^=v zqIVCWh2w-YQ_QGtKY`o|m@z{EzLixC_LUiU;GAAAG=d;H|1hLfNzla9_f0DY-|@G< z4>0}fYkR;s^r2iXYT<#cNLKh2>>^ct$b)j*xcf%;nkY{UyE-}m$kRiU{emSRq!DiP(RC9t8NWlJ=1km96ySncKJ`;!XL44N~g1X^O8 zzbw8^S^a*tICvKV_c;93_#s=Y1|foN{X05F zV)P5;7{K0YV4m=}h`BxR!B;H^*t6)vk3Q^zF+F9+k9kRWPxrk0?@x`olG&-3<2cP^ z3`;$QO~yWO#>!I`yrLKh!h$J%4IfCXf04W_No-raI!p^Di96P2=o! zs{2aCS1U7T<$4mrJrU$ZnZ4(g5 z{*gMu#Hz^Gm3F+)q;expU+u+lnPfSpL#khF3&(Klk0g`B?~livX=FHxrBNm)I)3Tu z#M8tce*Ee+_HTR_G|W$=7@l9#U>}R;D~%RV0FgF7+Z-d8K}ECAsV1oZ=(2tgi5Frs`4bY*T)c=Fc??k%|u5UCeO6q8rQk^zWx>RWGH3#m8FYX zw#~tq)O7@%@^zhheSs{amc-{V#&MJq3yj`Y6>X>^^3lq)yp7*;wfk(SF`a$Xc~%dK z(9qWyZNj+(y7Z~|GV$4)txY#tT4BE*BSq5_F*UZbV(J9$Icmg(##dMYi9k-XhlqO9 zz96ST$joK&3D_L9f=pe$v&x-9i9r8)5{y-vw7i?0`CcyAXur(L8k5=AON*3i~@HKada} zO*MMpiP_gTGWko?p^AqFV|c*=sHjH~pK*leTNra^f<@kFeaxc-(MBJLo?MsJ^90;| zL{GNiNO?leSC7}*vL{JHbSE5&Wwj7?EY&{*M5qif9$#+)xDAs-V_&zUrZ4o(vv^sc ze%Bi~KfQrQRy(X&wMw#ydi!eaN>?-?ig%{%bZ^ci63TvGVstgFIWm!H;Y1kWj|Vh= zD^@w+cKmhEV}W}Aj;r)hpY&`zrN{)0T@x+4Xum%mP~Z>%wIlSt4C3^OMyOwRGyfen zigPWoh#fLlg_r}_EGf=)9{CwA#_-^1X_t>)3~!zeI{wRmvu1DK#59TK&D4aS22ga? zcGfFK)aK$|FQnZNlB0~oxLVjERxm><()p-R7yOrpXkB-g$+DaK%@NT|VRCRLTn-Hq z6Yxsoc*{O3SE*ki!Z05~fuv!W)&J9-PNo}wl>U5u%lQN{zSq*+fBJ2oGG&?T%y$bo zlRmtSI7zj(oinL{P$A7HRW3gHQyvJ_t%TU~`DVK8KN+sYWj~H1+b_T0{wDfw{hVS3 zNy6r)MyYzUn#l{*gk~H`$d`5L#O`c^zSaRbD$)U>Q zT)bYg(s)D2QD__Lu70_s+_?dY!4|6Ue+IRWyY9ss5c?cj`Ui!EzAt~rUVY}Z#{yZ$ zoSZuAc>0A|=iU?4=AJf^_q$>xpyQP3W;R~#pv0_5YHn`XXSK3Lp|gYR&zy+FbSs|^ z-1_$$!uw)x$C82W&^&%+`KXdgf>$W2q&!m4?Bb1thJ@Tb{laG?<_g=AkDUk}VW^xF)A|l(C6AS9fi7VHRPh8;60>Tnf#`oS2P5Fim zO`c~Jb4)4r1l6;Q5?OgX+X0SHcbSK&sK#I_W|7N<>}#U9@J5a|>UJJB%Q1Po{JDx7 z_0wLNpx%8MAFCxNSDXU<`VSg^1Xp6d7)vc$5h@cczoBScb#GjDm`A`5S>8LPT1{Gw zYh_Q-Z)r@OjPC#=Wd$ruJb0C*BNj9N$WGx^na48z@ZXrSQ&4BP9rH#(lN~Ax=r7`0 zsj#0-_9eGeW7u@CJKZp6bNUCb9Pix^Cw3dLHKII^)2aRVq&>i*>ai}{?_Io9ookui zY-rJl**dUG9Zx|0eReC(j2x}lUcH5%A^NiJ9mscdL!kjh@!zr|SIOo{i+#bw)vM`f zhd))6)6E_cqFUa@WE68K)(JTUvPUen>#e<}Bd+y2oUIO)u^R1w?-$&i(6a|7)lTEB zn58SIzSQ@St-uHnvFC*XA;X733I|H;#cRCt{gT-sGJNo5-m0al%El&oc(__l@=m5_ zA6MGgp_A+&C#Tr)c)7UHBKEMYWp;L*M~}tFfc>Y->4o4SN$2#T5@LA2MFf#H&sFFT$%fz)VhPH$4Za z11p0DYxIxIuBDrkhe>g2`mr@)mun-tZ3j40K^!O7Bu{|ZKz5uI=L7cK2aJ$PIyN>S z){c?{Im*Rw_VPZ>m@$>U+~TZ+ud<{wSExC!dEV@gjZl>Y=9wbx&3BNTT3ecI2{^}O zO6971Vr>GQwiQ0Gsx;UWtJs$uoIlf27Fdh-4d0)b^RD~n@&(#@&_)6_;4XJi9i9VG zhApD2-4xlppT1a;XSViTaZ5{v!*h2=z7VUA^L-)^%_gIVg~zg8 zUJQB7qj%zaspv{s$@nu(p#Z>!x0Jn{wJC=e zqlC{s8|`K5%`o5Rm0ghk+01_=wRcB5Ib8@-3nRU&+}<>YFmPn=7Q9<>%CvWw$|80JymzmB{WrnK*f=RZ&lmn<{P0V@_1 zcHj7QnJ)N45DNyi*FX=jnSPI5e#(w8H z%k?ozeeeEz@}7vAQJ?&^#riq)ybTTz`ufh-%(_0jeno!Re2sL;^?5zIIr6wA4`bm5 zF?C~Vmq&AzdNJx*xI4MxT>2=V!=Y^c$hEm(0oe`AvGFNQe*7gwHmFj^{89@vr|{=> zvbUqTs-n%z7=ARb6YufpeExCtC$N`qUZY{tJKo9k*qV}c!XCO(@&710%fBWc_w9ca zkrI*aZt1R#F6oeFASK;7Qo2jJyOfqrX{1IsjP4pW>3jbEg8TbyPp`eU^E%@=j<D;-?s^eN{JI=s;cxhT<;Q2o39%5mu8;vT5N0b%VeEV`I}$5|%YwdZBI$ z7fu9|pYi7b>e-oO`AMN!6o?}`#Kd5~(DX-9El+yP2}Pi2z~4&WX-?O;R0r_+Uk{F! zFY24Zy_=k?AKE{%V6{V4;!8CUnOUe3KV)2vS{%+Hv|?6mspC=$=$bwg_6v(UZEW8? zK;}6Z3TwwNr~3sb1Euc2zu4sCN)OF54PzMp)%&+P0q4{}&7b^wXlX|?A%7$fy1Czn z7Uy!>n;KliyN>0|H!q5cxaKaray*6U-bDwT@{!(lKX0ESFX8xkKRi>A+hrFta+TTh zMvcM6LB3mL$A92w7unC$drn!p7~Py6CY}!6atJ+`YUhY`>14H&TfwmRcO2x0$Rk3< zck@r{d#{XbvFM|^EnO#|Q)ml+CXlLYY(}p03E7?RjFvo7#9p6XY!U2l!@CA;F~alP zx-K3Oe~^~45i$*^8edeeYIPa2%2 zK#Z zd2q>6h`csdfZf>;tJ`%v4D26#T89WcxNyzetmicKF~H@X|IQ^w%smwuW|+6P@%D1m ze)Jq3>kqd)RlQ-?&>;qUq=TZh&P`3HNj}bzR7A$Z{dH}d0q7^v{vgjW<2i4~YpqQ= zra>>jXPI7?&TU>18YSEPV@y|tbb>8;Wfi0ibpwvDL}1(HO;tRyu+1*59TG$R$d~27 zLJM=@ZfTwfM|gpS;baMkPBJ16AtI~;8PtIaCX?R@!jvow2oXH0HVK0V%!9&boz z4Q4Hj|C3_Jmh(>!A;iKRYAKw`F>}ABDrL7&+|Dj?WP83((#{xKPd$-6|FYuU{~&UW z9e=~w@9-67^BZo&@R<;j#g1`x;sLjHWQOoG6gk{{HEYLc<)U1wHZ>#JhyC<$eTZ}+ zRW3QxGWC=DteBwI!1=H=5iozpES)t3m_*B0prgrsGPqKZw6Hbhf_fQ0?FTJdD~#sejHS))n?+ zpr7SRty^9fMswjM_qhS}jkhJZ{XMr#x)YW*R)Xj$Q1#xmbj$Ngv!S1?M^3aSeTTfg z0i<4A7nV6%wQo()zuD`3joC?Rm`iK)%VajyP+WSJ5>pM2+FD6Nn|iX)t%N(Pw(R&1 zmruldaps@S)$mPfpC5*PM?%RdI)$A^2{o_RC$4ZOmEYeY2722$Y_&>(gep0i{`xr* z*xxJv=)(l<7dmg&ns`o}ytBT$Hou2|+~?KZdaDGFf~^Q0ZtSUY)Czv?uVZRZhHn*Lfz)%C##^Nz#=fyw3iReFzawmueNkM))T zn$f^1DiHgaftWAW-J2>F!Y8yJkzX=>&zTjiB{06%CzO5;v2TZ2i(Q-*XI}|~jb8NB zsc{u=6tvqA>eMhDIQKV8e56)PmYmr5o2tgB!7nN>#n6Zb9BX80xk9yvP?4EL1{k1D zmRhj>HH(VU!K`fx;Ga;*RBBMJGqVl)n@yRaDN`* zO}_zw@W`&_-lqaNKJ2MVhjNE^7MNuLTp1g}&7mBA|JDHB)_-manjK(7ck6t&pP#o_ z$eIN9>W3$reDcFBXcwv#h>a)DT&S;gox&H<*_Gn{DshlWeLU#ZqwmM3)&oBkytn4$ zI}o8Cu@WV8w9;|JTy_ccaDEX@GGf4;2U<=T?VM{)nlV({*(5_hYK0jIFLiOS74T!&c7dw=uog7Y zs;Vu{>o7{i*vP`Kvkg!S5iqaJ;qZ3lbSn-*=Z}vGi1WqMa8}wq#7}OVOuKw_fJUV@ zKVLm}O|HW=U2`I69DY@w?%wzfr7cD*n1PItOs}uTw?cCf=8kJv!zFs35Y>j$$-EA; z5{TN-UIB*+3~^Bt?<2?wUSi)mA2fAkghVbP%)-v=coE6%X&&ilf4;5QYd!F*3c~p% zvFb+^^TjBDZl?nptar_QLZ~X`!5Z@+#SFebfw2TTFsl`=pi9i+U?!$yY$Z)AVmcujOS6D; z5wQ*7CTUucBCXwHe0z*^q%8a=^$3>?OK9aE-B9qtyL$`#l6sm3i|gI#EDXw?+%8T- zgoYN2!bN{yQEBmSD`Upz`m0Ix53zqLtUau^S%*tPGn@A-uR?G@6v8e;Ih5S6&B!td z0|QaqS>vMNFNQV+xi*l>IRP^oPb(V@Ui7H-*;WVgXzB5XwgXLn83W|P^C@Q!NRV=o zwLJ9=Y?iozKEJ#%U-#KSIxf!Z>A~&N;t4W=ESc5Q%%soA$NR&MHHXbstOnBqb^7Ze z<<#}i_OQP2cm3E;*V;c5We{Y}&Rd@A1*~BewtLO$*HYftc>yw*)AIRBVzgel`d8oo z)Ev-IqH{o+&h0rD$gfDIX2c#4VRUYfs?P{u0BFg@)*gjQn2j^+GtXiz-gjo6n%KxS z=4(*hANW5Y*TD=20HH{PKF*6EdWld7(6-Ovky!KO{f}CDK)Ui_Ijc21VrVv6lJ;iW z&1?Ana>RlnShe=8M+6irRl;rg;<7m)sG%;Ww(*Z}ZAHi>c|bhgY}TCRX6IQ-gbu%{ z&IsV0`7nB(>lpTXRkHCLtN2l6`ATBDtmsid7~qa~-hgPGPVons-aLJySGB(>Q;dBn*s*DE97KkMdKdJVtZa$tMR^|B_M0;S3f{uv_qN_;F# zmhld&`T?`MBm^M0oW|g>?Now>VNGUxWTO zoByeev5PG?BT#C+n1q{%Sbtvo+dabNc}u}8@aJm`QB{1hIzFQu+2S_#W1EiGifo)~ z?O%=lQ%g1Sg@sucU+lP&UwJYjFZ@zgNa(Hh*uV82bi-4P>g3%^vN~uL-vY^AOnSHJ z=$;3X>lS9VTQOaE5xJm+KXz;_CpanY22mCSnK)aJzJvtN6n&fJaKh7wbKdA-lf8}G z(ZzUaX*YD=VfSFO25kZ7*Zt7B*Vb1lSZLy5T|Ps-n~SleV$WR0{|)*Wg?jtyws1zbX$8Te?EsPI$!WQs;%x` z@$lC$OeM9!@lBNjOH0lx3p+u8Yxx%&A?-0KXVRa?hT3t;+AF^0bzwkC!s_=iZcJJEH!NzZA6s}yIa zoL{?oU?1Q5+0IdDZ7sPlxt4wG7u`hJ>9@Kn@)M0J>2;1muy0l>yGifzg1`#hpK8AI98zI-S}ladMfv!GXJO1oRz@!T6=X}hrMfLT zaj(mt%v2O?$_v_dI2lo5W@-rSSROAS0f7j&2-d2zX~4OF@s^m{TRF|HX3!IdE()b_m$6eox`#e>C;%JZWprH zzDD?m-KrP=YvJ#6O-mhQQX$qXegx?X9W67hXx-N?QnWTpB6=l@R&KT(FP@AvULv?l zx1Ak0Ozr@%xVwL%`d7j-6%>%yJIFa5h9RU44peP$7owOJxt|#i=tX{&5g%D)6ElO| zm?%m*-}y&!WollcHkJCSgY|Dk?RHK9cuox@EV6ZP0Nvztb;tuQaw*fh3X%CSdDAmZ zI3c3k^QI0GOc~QRy>z5F(lGSQT+Mdh$qBN5t+hXK8iFKk)})zbGkW6fKfhX`IyN9> zvTf9s8lkwkGP^-rE;_JWl&OC5rk)E~TV8Mp0S(&Q9RTgka_raBjKK(na@UJrHLlrd zlGE4(jah@}z4j%iT(_=)hbo?kkQ@k$3yY*ME*AJRz8kB9{_^dRs#ZEj9+g-YzOh)m z*$^Cxk!t7FKt9-cs;N9FxF(vVBpN%dG>-G^66wFhaSbbX^e7T7G zR5(qbT0r}c>}bc8bngbkjYE*|%fjxd>0Sj2ca|DayfgEkw@3f-oNryFQj~V z@f1}vU~>>1sH*7FoJultC&J@}$dq^z#w_POy4Z3%%Y$gCHu*%m>|o| zny_Y5$S@t_J+8i6sTPK6oNp_s3$2qg{+hW*Tv2mqJ?$PjURaM2Xeq2N+}Zfbg*A~q zzHg^m&HN4g8`8>7N-I6DR=}#;x=nD8+Y6CF2?6Pu4EhOZ4hkT(iXFBbx_H`{#Vhwi zkzAc|2spZ|Mmwb64wi}p-@TSIpv-YvhuqoY5-(eA3w^}J&MzS<3u zi{em#zNZxybmQ;QdD(%t0>n0MR`$gPZop^UHAr!?rZ0`qg2TICr+=z+K&9lf%M?~C zx9JAH_X-Qy)$YBpo^s^lzmIx$A0AYOc?!#PDdjYaZg>EWf&_@PJdiV!9DMvPhb@PnkAL?Z@B)+55Gbf&^pAXci{t(5xJE zoBbo@Tjfp9r!?aZ#H^noiR&^}3QbCPx*9LP+d*&F5?-(#Vq#%2Kp z-V`*TaLl?^Mx;QE;!m%Pn|jWw#+A0{L*ARqw}lakT?-{%iD->OA=`m1_wf4@Az>0>j$@<21qE7ZJc?dYHLv%S z^`5h$RsaN+CvTf_8+>ebs|0@O%tGia>gs!(^%h(q(fDA(*L@SGo_FDBVwN3Evic;u zLQFCn2W;SL&u-Kf!`&B;s<1RZY-v81lK*_;4^cd8T)}GrzZ*mPQI#d5%q#XO7I8sw zUZocuLd<@qI8+EqYKt+v3YDHw5w6YR|exYS`(#-z4X^s^M!b}e|tRc|duzy{WklqO75V3Pd; z8gO`wS?J{QwTDVx7beY<>N2Gm{L0uj#~}sZKHEaIwau*|kgU|@Yv*#ZxxVTUK)!fw zgM~!ry(%olT`rV(hJOLMgVi=cRfWHm`+eM^>m?Cy(9{pbsg5BN@A7Dz^~moBRa$Wm zDP?JP={{79YreyI%6S1IS9Cu2YtSreomD5l-lcLZ1*8Z$9yR9vNOy~z&e0zuhjg&E z6j8bxx^?41TF-n4#hK97;*pR8{LN+Wrf8XU;4M#3t^w?;K(MHrP0y3#8^=+u2t`}k zYS+VGQu`m|I$w!dlCS?FY+j6Z?1Y$D0DjoYeQI;g0WyT=qs>ZwXTIDJO4-j~GkV#Ef2cU7 z%yc-<9~Sp;YY1%AFD`Y4KAMa**z3LXPRqisMJDb@X0 z74yU$K;U@H&sRC9`%)wT{lAg1<^#5Rq%gC@SQgo-kBP*ML@?QPi=X*_p1h?w-K=CJ zRqD0Po>+l9me*WZMGN^5UiTrd8TqBVI|N#yP?~qd!KMI%h9b!Y>!i38@1YHN_UYkQ z@edd`@iyQPW3gGWuM3lhBh-|+$$8amTKcH#wR)_L*9!*QpNUP$A8d&W;TMK^<%iL# zWJ#QbI&@Vt#PKPL+X>UeN);!ocy1E&*%E zPaMtHJj|@mx@0aH${o&-Ci3g!S0g_Y9!JRDz!!ESb@B;V;#zv|yaPqG*;mu8XWkg3 z&#taaE3@9s@2Y-b5GuF3B0gE7fb!&IPfj#?T1|UB6>I{qWPv+UgWOXF8F0tNCN|~t zUgxKSG&!_oN{9UHsz zZV#@OYm<}Uo7hw`k7u4EBX8C^!y;5pBS~b6xrpxZOmDkZ zAZlIJ{pOk`QY$fK*0u1<8v}yOLGwaqCyVmd5KPkP89yAm=$4dlTU7!q%D&|v{8^35 zO-7TY+Ap>xYu|GK50Y*{F&V9krBpn$6O3Kg_y`qM8>|$=fZGJ2%-gSNCIq})kXbAx z<%s3>JTNHagYx{=)e3C6UeyG^U-n|N_)m0iJNsM$$0^r>aY4`AtC3B zuhp+J&OB{Z+KlpsrzMeqoHd}0yVs{O@;m9I&wFC`h|}No1XkC8YWE{=TC=K+EHuS^ zRY&ZB81cOdni`z_gqqpR43rtwNqC6-6z9|ZR~rx!mSnpeJHDjOX{4pR|d)H$`U$)B#N#z$@ag!dxPP4-x8VTB%2a!Utr>HAJ+BD(k?I8nUy(kL3ob)DkJ z%m0PPDXPt7o;gya(eD8cYyZO2c+3g8K9hw!NS~5&TRVDo3%2}W4}byO_ocVJ zOFd27uPsxDKY0HhXcF-Fi>l{{w$IDhE|k-($hN-qmz|#3XgiiUs6}w?J4Z-QXUUDB z#OnNUyB2;^<*9>uqZCh5Fz8%YAaU)CvXyAYr5Al9tU)fl@ca#QCsj~c-f=?obl6~b z%GL%MB|HH$=Et_&Ddru($8~?jy&pYN5otMpS-3VSvX| zV5|*e)Bynw_Oj8~sYZlFN2k;?%%g#{@P`ArVpheKGpNKTcc1?)?&|l$oOKEEklD8R zFyAM`8i0~q-zcjDoy(v@>2;A;i4tuuPe=x60bbP-7Ca&w%awYQ+Wbpex5V%&azd90vjvJ z+21RRV=Vn|J^vQ(Zr#Lu1R-aX^!IAfoB*SZu5SUPBg1bjPSY$qzL!j%=7;_5bFTQ2 zgR;;r=1sbgpxT%bfa;j(4+ZLU4B5^eZqi-HOeDu0z_T;>!U>n0LVMs!&5x^3L+T77=z3W{&Zd8Z?&1paNbS5$zp zGAhB70duUTuUlWz-531I7)LUHjHyOfkXFrg;VajTAa#(dT$S+fpEy1*bL9Wsh(zHS z7VWS=u?hz653BY`$p0C|Zu;O-5z}1`87T;=L@8QaP)2KebwJ9u)#g3}2A!QrsyaA# z>t@%MRoPD0&PCtiDNRp?P+@R`4-#{I%%VOV*v#JbA>ER!0yo-qAPyH-qy?x5th05* zkx1F6QD$CrI!5#e(#a%@_R8OSYzAyXt3b=M;eY@`!ppHIZ z1jJcRTlGM4TEetmvi?|%=3a4o&lk0Llr$0IMFnm)dS*M9ho)|OivUbT4(8bySe~vS zT?*3DGYWuSiAW*0Z3lbt&{t?2X&xqrobo@#;7!TuV`dULD`JZ>6ykJT${)gwn^ON{ zzO9;cDDL#KXZ`htVi%cNS`z^2!R*+#F4Uksew`2L!DwU13kl&Sa`DL^KV25)FD+e@ zYSN2WZ6WKV4vl)cji|84nJknWlTIQr7@`XEMzFL*nG^L={_ZI2=1MFlWWwB+H>c*yzY` zux$ifm4?bvECya5`MB`Z;&^bBS^(l0>%ooyxWXpWp4A?VL8PdAPMIG|PV{|#s$MqI zlg@TF916)h>z(Ghy1em0g|Sb{5n^7}Z8X%xEK%4g$dRU>@GyUQ;%34lDk3O3V583R z*4I5YJp9;tz|+XSKT{F$6<{34>8DhDEEEnte-AI{8;Qjju*wMQqnOj2 zcYkuvwG{x%?=dry?OhZcOBKZ&A8&{@M+@ajApz4aMbujeiuMaLx;QE`v~%7roXXAI zSMc51>iZVG?*BMLTnO9u3D6sC~FvhCE(#EG0l6%3fk3B60;s+YUtc7A=?=wSMzoRKO+odgwEdqIb0? z?!cqRWc$OkBPZw1kKNbNN(pxy{&3qLmAbcaYl0#J!c$JDBCoDOgPD&zaM~`i6M8$n z2qtHaN6Bu3!#xr0Y>dx<%Def|FG#GMVtK()z>G^lr#B?GfAB1J6Vua7egRz*7f2^^ zH-%RBxL0Zwbw>q--9iqN$QkVTLKm5%ZcRRCL6(I%Z9~Q&cY?nLAU-hSiT!rU4#!}_ z*52Z(aUP{ceFJ=-m~FpX{P#Xjpi=%*V9R!j)%KI38}DYv%Y_JZ6EPMds_(ur;_?RT zPg3G0=^acEogVobBRf;rDRBaOcP|wN0qQSUY8lhou=SI!y_iCkR{fpM=XdytQOsZme+L|_YcQ>U z=68N2j+@fkX|A>qdpe6lEXmM<&GiEgoy9c%23n`?m?i!%=QW(ELo<9S^UUFll4t+E z1i|UTFA>e-%m%ZSaxFBnGKZv5f?I$yw`u)qo4Dbr#%ycDm( z3i7J0j7cw(%I)|^2BV;+2C4YNp=G^lkE0>LhVs}-)FY^3{rzOT4UeG5TF!t(gah{wtu6x+_u8U0RrDv4&vlP;}Az!!G~U3t^Ba=+nZ z5MLDl)ubYud>pu+at*KbHWWb%h@T5och4WC!SGJGzQUp&tX;@jmT}a7 zk`M*dd}%G23*EXO=WtC6bRz7olA9#IT&1m%_faRUYz#N4eOU8&GZ$83bh>u|h!A0o zc7nHRx)lgur2zrIb}Q{Zkwm=yzBgqxJCb+XkixSAhcAklzjCZlhhm;?Tikxu6Y5*1 zz{2_`5qe*<KHQu0>4;(r2^il@5%GG)v-4c@N@{H$&*zQ)!s-xlWNAa${w#&p-kC^V{2iP zIfLy$b4RcB^U1#GfXU_e`pVLGytpG|CVv{4PoJ?l&J!NxKD#2chGY=<$9-iUu zlKdO{^shw2t+w8QZ5#n2gO13p|K!(KUAf3lF|9b?@ ztF6|rCk#YFAh9Sjad(0XCw@2e8L>BO`c3GSMld;=+VLGj=979r1nceWtYqxBoDgY#F0Gwt+ikkK4+Zm)Pw80MJ8&ju2fvm;gfnXomMgVXSbU(yu6UDFEv;`{Y5K}M_&O^>_psfi)? zcZjC_5!SX!%0M?wl)|#~spf~4HMp!Tlg^~66-7J`jb8&Z46mwWjkgp(v=KbX{`KOE zkuf%wVGLWS;`YwpkdeC}eu2L}etDf*@so0vq;@`b_QE;5HA~xWR2~UCdNa6qpMI-) z7VXQVw*0hzU6=~a??B2)%in?Ss^TJtPJcI8!wcKJ+~jwAnaAuxxidiSaeAvi0^>^S zo0>u*C6K5X6cqmcelhMUx#)&h$qNQm$q!#s{6fbN0tP>3y3oI= zU9?ZU5_Fl`=7-(XBn6liUC;-&o&1H6{#aO#(Y@g+8h8-<8Z94y+l$MlGK0Tq*gLVPR;~HrO=_CX zGBulo+Aw+0sZ_Stv(r-S)GnZ*Cpu_Ub2wL$zL8?(8Gx&xb1kn5ZcDYY{q?P5Fd!|R za))>jCjrNtrUBi+B@m2^t+QK*0p2^=;&S`IG>MCoM7dH41Kzw*0fkiZ3W)t zukfr?+UEHNorYYcEl#X;k9v%WJotGZUfEt7Kdxu-kNxo_hJ^YP2*)haMG=@umPB7- zpwOUHWA|o?3E*cnpdAfO*jKV~)|%M#b9`R(&pZC&5+rOTy?+JoRot3Fnm1Er|8<6q zzHg2*k>z{Q`P$ z+Sk5l&%+CthTzRsQRG>aeKyx`~rhPIy$ zhW23ybp|+wvv>YB8H}o?@^<6jbQ-@Ux zC~(;PkTlP>*DMk4Z9?7ke>%kbSQF44yCl>Uf)*)xJCCx1#h==cqq824SI59~fV% zNLEb=FGsM$<%x9*zfWe)3MUb+CuU2MB&$2CNe?yWR@*Ind(1a>a!ahInPn~-G_PAJ zA(Merc3wwedf%;`UpPWv{>g?`cbv}|BG|b(xFoVt_pKk0%?RA4O$T?17&!^4XqH!Y zh0X>>RS~qykqgB7-HjKEF;+C?@a^>Fm__N5MQstrBBmT;b`80y!gPrx`*JOYn)!k( zfFaISW#;*PnOTc}DuVpZ6Hnzn1}E!#&I&5kF;%v={_PBO4s$=f4a?fjUfQ_Cz3)_0 z300s!b{Vi*3nQ*Jlzv);{p5+$S0}V7fNHkHW%jK5pMn{Dpj`oLVXf{-dB0l6cU#{s z&zZhze{~wL{fJlt9o?+yk5Bng6z%C6Cu&nmUmTyqT;p!Z^)86qju`XIF7M`BF{~I7 zETIF^SHg`@`cG30P>m4JAO83$F}kh|PGiVgZ$a9DF=B6DY0p#hvx_3k z5pak4C!uv=+rB+oiH-=i0c_*n`VYHTtNi}gYmO_Nef#OC?xHLIT=&qYw+s8OHLltF zUgJMeR={Udi*LIx&Jpry!gHs*<(KZqZp7OxIugwLLTQMTN;J$&`!%kpFE!Q64lQQp-_40dO1IFUE? zx4>Vv${HhDx}SV>SEo=KiL}a2%9`w(%ye8Ux%D@yB1pqNX2x)jD9s<{zzX!8e-byr zjM%IKg$eb)XIi$MWJ}qw)6thK7OzWku%6yv;}jR?nMXAd8vcSwiW%IC8!)2T%QE3l z%WbABBOwgGgC~Ca$e+f8{$ic|YMy?FaDoX9vno#D`hsISliyyTi*^JcR*~8yw_YSF za0I4?b?H|Lkx(1tLvlv1Q%7nh3YH+Ttv7}H$n>T6$Tr)I*)a2Z!o~cQU&Zd}r&H0R z*+?&1SAWD7=Ft5#R=`mAdOV5S&Y+Jv{Io}=Z6DK@9w5btE0hNU3;pa80SUe|rD)xr z8S9&J{A3#ieeC){kF(CuPwbsc;>Z8FWj9*axL zXI(5ab_@p`-TXWJ-tzm5&)sAzNu|o;dADBo;xW+#E6cb&V$Gaqs~6i#$>B}7a+3}x znRiGirQQ>0gmK3^T$~&ma&$i*|4TxBS$o+=VE7Kgo0k;NU2E!_w`9+jbzeFD{wc+t zCB%e6f8;87RA4C7%|cPq``-h9-gqLxJg|ss-x5(Nnmrwd!j`%&@%F3Hj$0%R@jFBz zb~!`mDvad8=Gr}LU2oZ}zTK1T<&WR2UNZ#0AC8{Ic@A~a@*e0;7JR`IiwCrW1i#Ng6gGXpzQLdlynw%2-bC$hB3}NzS~TV!c~CkS@-$TzO>_#V>ZmS;%u{U241Sr~ z9U-35P(iilyeJq=?p)ZE+4qUJeHdO}N}nfx9A7|UI$oj}=}>oW1kUy+bz*U=s-gmw zok|7hW^CYX;GT?%}X= zi0zFU$CZvu$OT##$&&59L)2?BQl*$`MgtJ_To1ewqP}--WOn|yBqiam2FK#Ir?81g zVYUc|3$?fg57wpn1{j#^ft~zG*P)Qs1HKsC)?iM0n3ubjVM}T}9KbDCtuK?r0%WM_ zQLo7t;jZ&sG1vCt@E_rV)o0GTf)U=vY)o&7M;Z0We1Uwv7;0KCHA-*keEkEh)ENBv z#@DrP?r>HD)LlTyRMb1B{nV$_pQ-6s^!!XaIn9hpObtTTSHBmdMW_^UtxUEqyzDHc z90>ZJV@h|Mu$F_!uTk=YsAEkbiXwGYQz|QduhWaMoeMhO+Y@g4YP;$%NlgaV573~B z3=ypj85V^&zH;C)6^F#IR5lnP_Fw8h9;nlc_)Q45w|7-?)i- zYMnI_#&u^0CoH7#!mjoke+{TIJi@1Otg0pNWYX`r7Vhy}vr1id+q;K$!j0l?w)bk2=_?C1Pbp0G*~O@eZ2i?W zw34Pt3{*1AH&yN`Yuz{c>M=h)`18BB%-Gyrc%Ad-c+6SY|L> z9?Ne>V_Nrx{5TuCqo>G}FR|ADWH7r)f6WLmRrA(RJ+w_ww@lO8dEmz5FB+*x(XZBey_Jx~Os`JJ?OV_EuzTwAaK3G$h#Tws{yxX)&h$w#3 z3|W)K?tmYx#t&h$Ryq5p0#AFl^7$d3MF;nA)Pa4s)OfS~L(#l($d@*Nhje~87C0L_ z3P$LEM2|QnEf_ygyZ<>$-d+k@>tF~`UBn+%e0(D6A2HArcxLPS`tufS@8b9SuH7$w zsJ3vczO8wGo*?9iW&7x!1Y&}K@}5LhS}%h$ShCC}U&3@95A=E&p_&tV@r1h3v@|0R zlSBAo5NsTi?$Jk94Ss@ovr{GCAiBn;5ob|&e<|kGAR7Y)(6hh4G?s@HVFU}er@Fdn zjOE*bG(tqDJ6-e8BBPU@sDR(I$rn)(V(ypufAT9-3*TLE^%Y~TiAW`uq_*aeow@IF z7hZL=!P+^l4zEo0s5x)gaQe5|qDb|s8L57L{^~qR6?3DwM!tdz)AfZRl3ARwm2ET2 zeTSHq6J<4Lge9d<2-@B}YVGS1yt2IJ**&!D9XZMuj`glop>rX^~UPhx;b?i2)d*6Eh$SJ;bzZXe#dODr5 zjseIGK-Y+9U~a3VevB2lGo^+Wb>+SNU!A2SyD_2|?zl#}M4WtqoTjE=#-R`H8WZ1r z>Hb&I&X_6F>!--m{6@mwoTx2OsvO{reip`D+|nY0;b~nZuxZtyA2nJcg6@_=xyjnc z4HdhXz)`4iroB;Y8tV7c3R8n1_C_3Y8@<=ICNz$`W{FuunN3{wTyUHQ-)b3*Wfs%& z<1vJOw1YeHw6<~Lhu(!^=@ltVruK7Y^;(VIK4E-zkw0*}L?NlwuCZw*kp;^ME$eu# zDUp1afbJ`BU~B2hbEk=#;$qO=zB8^hcZitLBdrtdfe5SG?+@QPmN;ddN;Jf_~i31_`t_jtoz;mRD{bT{SFJ9$bQ z4I*&txM)8JA$x)a+y2XwSzph^Y!&w#-<;+9FVqHqHuY8L`X9vgKxpK*@VPa4@t{P_ z8OlYQa1Z#Rkhb68WhWiz6WtriH7mzUw!OKjPV`dox~AaQD#iR@d2_}GqrVRiA`^-g z(&0Gw{r4ozL+ID}WE2+&-FR39Au1I0lcc;#0fp-i&ONP<+g__Ig4bJ93WkR~cXsH- zeTmo;d6q#l(HwRApV@X|7--FW<4vI$IA-#=anx+8TdAp+KPkP(L-GbgyuU>-A*GaK zJ4zild^D$TK%3HPRJ5&uz@GO49?lWZb?zJ63GceO`S&?s`|6*sAXb?5(J~_%}6TtT%)ur9*sy_Vrb*-*= z_-D-o#<#gTg*R>Z=p<0hP4CcW>%B8DaR-Ylb%8E7gVw^Wo@3Y~zosb3$()}m+ z`3h(7D|j=Q{3yN>r^c*7k@`1pn2UKAig#|pD}sDpJfK*q8td>Y-U#X+a+$}kcMYh4 zgGI8}_ej$3GS%`Z>FBNMouv=qgpBIXRaHX>>V7AsE|A?D;J!a6*ZA4OoAal{8I>k7Av@$i1650P z(17|Yvv$1kAP;qI!sKW1HkgJ1Zy5KCnrm-zLPYZ!?7#bU!!h$U}OVmaiwq&;4QU%Kd0cJ%IPtWcwaKenyvC+E4Vn&KYME&F+(*Jm$lcUNzFW73;V zp1gkkxzF*nzT}BLK*)bAnHcoA65d3{Ka+4w3>8wv6ZF1i(}py$jxw>htjKu67gxYs zp8bN<&AYK``n?UULP3_EBWl?g^^pO%BM@%8EgFmks)+1d?vj~k>1zA5vZ)hchRE-G zNx1&c9|!wtPx?54KRHay-kPOPGUwywHxc3z$0vkK+TjyAR*Aa4W01+Ki7q~u1{ASep+9(zTQ<=pVdy0&>%R8cHmecddiSI4r!M8~(LvkY1kfkXe!<8G`pf?~;XMPnu}iB znnmJ29O1-y~LNYjmosmr?-KgN`~)@=A1AeU8FB z5PEWUA8`j+fIu=IvfHL*-dBUC8y#qapD6HRnc?Cj{90H$K2{rS=*Fdk9_)$R8}0ig z&fQMWVlC@ZTz8^WBkmwVnt-TpN1!@UC)b(sr|LE3RT3k zztnl|wA5^Z^zD7(!eT%x9*NngmCH9ZyhqWRHP=doGc72x(G?eeB-Fvaea1qEk81>H zzSn2ld{lR7mGqIl}$vc9pY_^JbvjWS?#UtC8``Bo#;YMrjSMWC7xb3B45}-Z6CE zn%8C>+TFI5c~HcU48_wSvw;PJ!qWvXw=u~ZT+rl>zF*C9tMoLx4X`vOy}Ek<>~r}) zkgQm!`cgJKa&5qlr)xt!gpD`5*q+y35)gdlmyhs$gO}zPL|FnoXT5}ea`g*^lWQ*0 zgBoPCj&H>6LYRb6PLBn=f7$gmui~D)=~b#v?NGTkr~r$TD<^@w*D7wVpArU%9lwG! zEmbAlZ_XVZf{(;@J6NavdopHxD$0z8`hbB(ij~UMzoM$*u|;}VuF-C(7)(O~1_^&T zE=SEjuciZWRLLJIbh>d8EdJ&DP?pmbYW{z1f#^PoUL$%e$`*6}CU=6aHAg`59O-wx zvuE){@?=(TkTG#texPx2_S5Qx0 z#|43rm2tLi2DiWCr1o9;pYWC<>%DRfKL@O4wd~eKk?IGFtp|IDv6=oF{(qF6Ra={F z*R7ul#idZ(ibE+-+@VE_YjG*=?gS~t9SRgDSaEl!xD(uhTkxO>1Y7C)1@E_=Y~;9) zE7v{em}8z}fR)He!4Art%9m?f)_M4og%FUb?em>qp<}FHo9!$Lqhql} zcQR4=2rlpR$RQbOlDM<)yP`w$N`xI9FseGH$(Kf|h6$+%|EH510Ap-}&kJIxlivGVn^=)BSV)M=fmYqPaEjfJ_ z#Ep&G5=iV3R#yoDj#eJF1p2*OrRxwkFP`)qr3~TWklEq&-v^K zK>QeiA~ynnTQ% zMU$6S6PU1D*x|~C7=Yzm4&#VwKk$O@%PycP5Xfk7(PX97 zhoq_^hu#Cp%l8z~3opW+r7zzL_^LueOR z2z`3<_!Gz!)_%@bVOwA+n3+8M)Dy{{Gp7J36lDEk$fOG<|$2899tZ1a=r!}rMTV8-}7 zC-&uiNz#2cJO!ohJ0asjPtk4LKqV|R<&_$*50;HZ^5rMfLJP!$Pnzo&pX*wT5-=0O zVV+dT5x~A+QN;Kbiimyw)I6VfZ3JDC^Su0?tl;p$u4#p+AK=CNJW5?LyAGymvi5jgr82tO6f$ys>i=(%m`XAw6rk#r34FpN>eL2 zN!jmd0JbdKeeDS~9kdamvV=*N5gyB;Y85;ZsD=$f@;kl+GfmpOkNvK>U|3x0`}{124Xq&-~1|tqxq{3j)lw(S)#RMX7*#N!D|fq`Li~ebz z=4-a-gcXL9ky*x6tD7QOoA=f`2giz;v!}O>BP8^@k`=+_?zy;s3KlU~5Bg52j1qrr5;`nW3^DW}h^4tqAn6 z0ZSdEMPosbWbRz^YA8tDsf*vYYeWzYLEJPv7&d>A3fv70JjT&zH1drCSvI*i`u*VY z{Sk_H{Mn^J^}>P3ny)+_r1u@ila1OUjLuq8ztPtFCdoA%%(9cfTp>Z>U) zmCDG|2tgFEyF1zLV6T`HCB!t|c$a(mkkZla#mc1Dzs}V;>AunNnV3$AtL* zN5C#qL%O>W%>fgIcL&A~=*aigfQTcJhB!wfJ5S<<(@#-2{!8@&qK=QQ;b6&kYKuLG zGFT}Emv+H&M;o4*B$cAVLH?IHe`xID8y-H{2Z%&8mIDW8qRt)69cCviQh`lUiG1kf zTX;tKyI(BdPonA{y)_& zM*s7=e7KSNK^v|r*=UK&r)f?E@cSzVG~q8Um=ao{Q|fo^+8)fUd)ssm5}O7Q0FZkN z5hd)yPj()GU7|TBt$UY()jIO)uH9*gfoSfBlGA4!1jy!&lKq19HT+ zlnw;`p48$^b0-#Wsbr@`28(XHjwE3K6Mh%RN=Kp{qrvAN6ppw}L?M*A67)QI-HNb) z+n662Cw^8E3wvcsv}j7PvUANxcaXfCZvrVbVkXS3xv!%xmR^^P)dZw};XHCJsrqzi z3&(XN_i!S|5Lp*)b2x(Ozsm8Nbq!VsgY~I~daD#a&$Zb7lqs1vtE5VBX0xo=3&>#n zPa-^)mHF`O!;X_&uPP0w*MwbVFa{_p@ZBIVkxr4~ydPh_Ds%ad;gg3mln=@C_I*Sa zFbMvq-scb`mG^J!#w#v3?1r52RJ;3$x63NLkL@}FD1P9Uar14`-|V}jglhcpG?a$t zRqucA(8Q zukM_@k!<IE?$99h5H&0!1tdWLn zqUeSfCrE7~UWp7neX0Zxy-@PqfCM8+X0C-1e_~_n#UgM#B!TsT2b(U3L)>SD-XC!o zZEcJ0qn1XmG^?sBe~VQtjeVq7Fv!4z@5l|y(Clp+8symh&-mY3 zv{JK2f%~0&5B2Wm@)|OP4EnBZHQc?847z(-;1~9$XOyvR0peOuLgu~m!wpVkA6!m* z#Na)JApUBJZaJV=jhHu$Qet;Z!%HFfDr4Zf__kQWIcGY7Z`CW2?vOsc_c8BF@xB_R zF;jNwMjm`EAnpiDZq=6?G!Pd7N&UT0#Idj{J13c8R*4<1>#u2~_m9 zuh4DBU8X`}M5gVm&H@Q%c&_@UmJhdKK~xaLED)M=YAd1m1uk)@l{Pl(O1)RJRlv3F z!bPd@RmJMrNSnvlSs2!4cqMgtMn8H{t>@9kJG~~r-eS28pc(ktoiNqD_VcEcoTw_f z#C))*@AlJGg}?E0$y&Q#pr5^DT}8FiEx%k~S>re{`r9!FgWZ6%CNP?~9}&%W-#-Ml zO1*DPv(pMR$un1B)b}LeBRWjvzxH|@a5(Fmhd{zN0?lB?USSB@n)T1JInR!9xDQ(v zwJXW+DtP9498KB)PbjMpm+?UDarWM#W38Sprj(~4fO_GhAzx6NlQ%v{hbQc`1m z&1B6=f`m2mGZ-$V+#|oCx+kG%!K7qI0ajq_ zFLY}N>F8NV(TFYk7?#NfEMDLvm`0-4p2h&41QL;!3ed?4M{7q+I^b+w!Sp+-Cpgb6 zDyoI@`XCyPn9J=Gct1-%e=UsD#qFK)XcVd+pVO^a;`~EEl;*qo6PNm2M8I#jX?t*= zp`kNNjpifHa;I~c7)O*+16BCin09MDQ?s}D1{-B(HnBF9C-PyhV1m$MX9$7fy@ zlz}41)pT)+JpYV}><6#CeirE8{S6%x%7**R7yqQ4<>G_heU=r;gEod2MF)Hmv!Z~Y zzKIm>Nn`twSP$~Hn_g+0Jb%mR(?5b|r#B2Itj8;d4}S~ag6ArPZe^<=6)f7Pg%*#3 zlG*Wij!uTBp_wa9#aX)U&TsU$%j2>P=T6O7v4&!~b`<4%7c?wR>r}*g{1KJl4)GS> z@YCaX(E$gpqf3EwHi6U8DA7z&qjQAzmSSzMphEL^u&u+rNNQ)z)*02hkG?!IE+ZmM zo*(MGk;)AA27)5usdO?S%f#Y?cUv7z816uE@y;fjJAaPbHIN`P8a!tDqhgvfZT=fb zrmSohXxYtlCqjv7C$f6%j_K|6DY)ZJb+5qz%$y@!be9n{rctiXIPru7P00y}>k|rm z!~wsSBmuNL`DX&J`Z3qtB2RR+9Vd;EQyi;ylN;hEGNfFCFtn2uxxFMt4&cUzZabh) zlB5a6SmsXUoRWT)i<6tnBC1@^px|SlBmNn&4lSw|!IBt=!a<@yMpx=ya{f zZ8;v&?Zb`1yM(i10GWE^naG**J5-s&{9EY^s8ws?(wsUpAB4+-s4Cm-!mEVGcwc z4&{jcjz3flEo{-WUazHanF56=BsmHUQc$#rhgs;b;EQ3rz7GvFr2$bsyWxZebCVCXkDEiF@XJJ9iI%MiK zD{Tr=_%v$^3Bw6>3lMBFZ^zzY#}dx= zujfd(9{r_jL{-U-yZFU)Z)LUi7deX5Hu|HkRmzE-7PS`Ib* zq>?Ayb!9mOnmuXBI3Y1e-H|()wR7oY?*cFi+#$=z1OuAT(1j(vwqhF$} zGIUhbaL-msDD=t=Gkl6}E*j|sdW{TQc|%9VVK`M?q)}|3eyF$7&s1(rUd)(^6Rg5* z_3*@bHRWdf?W*dc8j@xn{9+M)FLvkOls+||HtablFy`~0x{kh3b5g4t3a4B(yttd0R6)aci(aZ4ix&F zwf@V(laYkIF6U&>{$ha`mp;3Hge*%!EAO4s8}85lV^s^o-|-;Wv3k?iXKh}phv}`j z@Ks+sAW%NNew+yt@2$mqS)Of9mgZd~m#5D|<%H&TsGz-er` zA8?1k`fFg=s;2K_ab&PZlA3Ptub(O-W;pHx7g%OwlfGvwx|t2R|GD3`*X#fDIzkvh z&m-@yBUbP)T&EJk4(<it2vZ%tcPhKc~Oi_I&jnm6fL|{VV2WwEI`s;juV7Ho$v&%0(G| zMwXQaytyIyee|4-Q=QEBhn{% zLJo2CvcN%8s3Np#j?xBOt`7)z40L@3G1{x;tgRhu#0I)F^xYD!IL{nG0f z=I1}=UwNZhv_nTVmPuX#aSi`C+tX3r*vP@dH=Zr+BccD17Bjr2;Rn2F>gz}h?wT@= z^zb<4q1n^w4?{*z*i+iE$7o&(DXj{76W6nUKy)dFU{sTvy$ug)O{=t1We<+u1)aUd zZ`9RlLi_o2NlKDnqlV_bCiwEiQ0uO)j%0Cyk#423>fAe}V7ID6`%tdAQx6+|w``m$ z-OE1v$x{!E`w+mA{tfCwvnmPi@(62rUOR?*q&QA|dV|_zC8ao-t2nj^@wfM;k^VG$ zrTd;)F(#{Xc2kFx8_HbgdU&$!hUFlfnmBFQfAX47SgBqx4eRA{%$2(dW5%#;1bffE zwlyL0fi#s?I9Wp3+~#ShPES7d9QM3oq!aNB8p#vChdh7W@a=!MUhRLVa{D9+4n&nT zc)~1Bmw`<~ysHs7uvWnPZOXH=6$}YAs{^nYtRuT>oKV;JB9+@HRLY`c!d5LYz+gPf zqjRX45?X(@{Njb_DObez8Q}X!&7^Qf8>A#3`X58ZRvpo+qO3X6MLV&^oq-<$Sdl%? zG4E5qDmWjjUpS5G%`U`GmO6;K7ias#IdRM#*?-Uy_5bLFUu#$a>Ql*)TUd}u>{hWY zKjI#GU+lab|CDX>O0Kc>&u?jFO&Q#BW~?_2b5HkS0Rdmr?Nw%(<9k?K7M%umO-4$4m1!N=I;CciW_D@g+Lw|7R-IIbeOayQJ!8;g+kRwg9@10*7h3?jwZeaxpD2EDm$aJcSN?nmG>HZyjzk$* zMQ=!&M@AE7Pf|MeuZ4b3^1QqW;Dp;;FTfyB?PgFK&%h5btOr}{sP$XCp8o1LMrH^>2dhJAeWOQFIOC=X`g?`nZ7#Q$d&`Po{btTE| zNIs(U7om02`@XoaCed)~>h@ea2ZuV*wE>!mk|F==-Ybp_p6-j|e^)7o*bP#AIjXLE zB>Yw{I1}xk-mJ^o=nZ;TuWCRW$&4BFMK@Y!40v2r* z7=1SW53yN!sZ#EU|Ni8~WPHS3H+57#cQil1CAg?jU4Ppez%BGko8XQ(@v6!Fvnd)C zF`o9^Vvcrlhpt{`LjXDRCnP+L)8Z03PtOVsm6KeaZlLU5DC(-!9&3~hr|s(hPdD~* z1}~oOqJ=jwH5z`34az$Dk+YlnO)ctrW4dMJlJBDkbB2I_9~13C^Y;s{szGNh)X3o5 zo_*-bNMwHXQrJY<*z}ppyAIJxYb7zBkJ0Pxh1Npw2=hufikV{kUP-aqLn~WcMpW-$ z;PGw!0{SSt#(`{6f8@F1oA7Um73;cBu?H!NK8`kJa%WxD$KqY2?0TiB;9wHStj zB7@1(KuCT&#zrOfb4uo>w0Q)#>l%&XSKiMv2QgY|ML}?p3o;?0I?d2WI&YJ|9^A)h zJ(1$kz3`8Wv`0a|u16RDE#4AOa_asG^YTSkxk3?1vcxM6 z{r=`iEw0}pGmttjFp})b1jW5DXro>Y=ZnoP{rv&mqzM-jOLMXMHt9Fc`Ckm&Z8NMV z&`Z0O@&nVlXb+&|)z7)sEE1BVfx7Gf)iRiH2-^bA^!Ri_*~1DNaT%exN0ss*#YpBWrg!st z4$>4CBQB!5L8f)q*dlxn)dR*V*^+F-(} zvkYs#$Rg8*gIR>bs}mpF1jVgk7aFp3wfKD6Eh8oMjKs?an$A32PzNGWY5~`?z-_)! zT~sVBf%sFw_(~w+DHVBhb>FXLGM*ws-;pt-n0e8f4-d2C6^ou!mn6pGZp($~eZr3a z`F_xB>q#{DBnEl)i ztoJB?QA#8pV;+fW-3FSf$sB+eH~1D=Ne;Lp#lar!W(!Ug6G{hxvm_crOv)rGn!B|# z5V0j=3gJ?=VvrKSivMZOGAY}}PX9-?!{ZkV*1G&hA2fGORiGH>wMicRM?$(4NX@nerpT-=ja-nI%?3vau5B#+dNf8qV*S|rkbq($^keaii> z&;ZkFGOqYNpUJ}n!~lfio|4xm;CbUNazWlLO?Exfn`cQ>^W|kiSdpl&!&YO%G@*JS zeqk1hb#ADnXv$4J`0ZL0pKOkVBr9e9tXI9Ac+Ouim1o0JFIUk-dSraVK387$hvdfY z4>mr}&hQA#?k=Tj=FimdT6Xu^-xQ~4K|OJ`jUG+X+y~{t{5}B&KEFk$iV5M< zlF3$Q35=IN$DG}PL+69({?$2GLNmTE0^aP*C8WHw7=By+;vtvdz$;XXOs zE8YI$c1KZY#iu1$Y`^Qb;5+iJ6z|6ZDt|mZ+(84-013S$9`Xe$)Jd2eI%I5!K3y8@ zxzCqL0d71-^Y1E|GRCCp^TBCD9jx>=hqvRD=Drwkfl?y>g@8RI@2=q`ZGX>G(Cnx+ zUxDePQn)DUyLJZp!E_#1Tz6^o{?LZw34NzDo_dzlQ>K6eH{|*T(1;87f(s{~r=348z7 zL>EhQg1Y_z)e>D&ee-xOt}u6#*_hbzb!B{D4pIPzehP&Q41N6bm<{e=KcPCy8_j(& z_N4GNZ3)yayljAGyhI;|FmnC>KA0`FzskyMkzx|G()p{* z;>sRq=%TylJ@yx$+bfn4>f;H(B*(qsumcond$xSsfX^WlI3JI+m)YA}hhY6?VEY}c zI(*#~DuZA{(Kma=gGNIqFG4y_Vru7UlJeiA8gB-){{u@}&eAmxyHmdd-4N<`k9=E~ zJ^QJAzddv-0w3k}i=z*zDsqucpFu&?fU-?vGvs?(a}VCwV4h%RU)8gya{SV1Z-*doqm=z^7X#;5W)!vB5=1&U7a=|DxQZNAblN70)SI%>yF>)PC|M{pJY1KK!0N^Ij z5=$%%W_cbi>tfn0G{Cvs^CJQ^Nh<=^+ioKM&vrc-(7zujntL3SC;q716$Skb?m85fktdzv8T@L9O?d@+pfiR*eBbsy% z4qN}^4qm-s{o7IDrAIp4^`G;gA%ER_{Q^F%D(H)xMOc?!XJhH1Vn)dBUUi53itU+C zj#b&(?_08g?&5{TnA5!_aQ>0759VS=X*_>zIWp!;$fYS@-SPPl#Tp>r34F~{#21eS;bgmj&{dj^5)Se$GGJ|xfr3|TFD0)DJ;lYPqia0gL+^D0DklN! zI(Ysm_wZ3S?u(b`H&!M5jc~bxw2?*)(06n9u*{kL6Gu}R;c%1vZpWE)A?oAT-kToZ2g2*q^H$2sWZ;Q7Hw`xogMPt z865qr<#R^wq=Ivj(Rp5BU5;cuvxCEn4OQ#{spO5_r}@|;^H68{9wIuA$^^H23secF zynK~uSd%LYiGuXgcp$Ud?CI6}=Q!f^0~X8SOpBGlq1xSfv#7`CdIaj4R>M@A{{7iN zQxV_w)tSJ?DbEMmg_YTS^hKJTp}Z4X6pqVsM~wIDJ0c5BP0M}IJ(WQGM_bVzh7G-H z)G)IBB)3&7@{Au^@l3gWI^i~XnIz2w50oPuS3suS_BT6{`#L+x-^d1pzV^A|A{)?M&$S z1jz&_3}s8XutLW*7MNE576oZ+Jt6DJty?`&|8$^T#CYP>OAoD?wha&ZVc8`7lDr}t z>kv;yTA?2fBCN~oD>{(IoflsT3{^A6HKUf=X9Dl==b{18-YlGfAd+5(#`HH z$h9*}LbOSC0RX_gYZv2CEPpR>D!PPJC(T5fy|#YJ%}#i#>71~BNyg*WKoo)rqly8) zUr<)ZiJy26knNl}TxOM|T4VoGS-U(+4 z_8d)1ythtP=29pxXl^tllu9aqqxp zx6H*z4PtgMmr#gza|Pnz>jmmJa`SaV?gk%O=GJ#laoT-+?Bf|9@09|dvj&DM_Ko-7 zky!LS4dhW^D&0H?RYQnBE zfOddEwMUVO8Ysu#|FV7qiG_dO1U}Oui>ULx)H_bYvtdI#0r;0mGEqB-N>VUJ)P>1G zql7p9&+Gyt*9R@*rXJ3atmPQfJDzhvD`HT9ej@ z;hFXoqRR?~dh4ys-^cME^===&GV#O@_lMga^3q>D;n>YOqPhaRpLf_JQ~r0JO}G(~ zXA_+K@fD$z$fS#)*ZO*Yv5$tfg-OY$w`~zcqAaMBw+bObmL(S=5mUgg-Puc*um*`` z^J(~@9|yV{sP6WJjpH?k!{ug_Z{K`}H5m=>fx=4W^=tYfSX%u;{SG~jB2>C={9-hL za|=H^#!BzZ5YNd`;Q%9&^-E(iQ}px8O6biyfnxDraa%JSn?1iq?jhSQn$mRyPPf0g z$}fGqN?lC0dy`I^-^b>MON%!Bj4Exe*T*2eG1Dq!e*9hADJf@1lRaA_kcZy0hV*<9cruW@U2fW z#!>v5PJjJpzjoaB`Xa-F@s#^BDdzGJ|I_QfP8 zOQsQIQ4gwZ%;JffGZB@Q>Zak`2PB2tHMB}Ed+u!`%`Hzi;&7x|K;4C~Kwdn;-4Dq1 z_=CWU)PEUu9-kG;-iR38lh|1iSt+i#m7j?EnhggZ9VCcOu^XCmJXSx^0Lb?J+t-+d z3`p|uC;F3AI}$>5Xs_0W1+$Hl^7t$fVhUQ{x4;rnrc2qLzUH~@&+Ffa~qoa@lOr*e1|aa}WbEvyAm zmZu4bEOt6g5w!)daGc59J^rdgHGIo)t2_h`1I2jxrSZ-3#j}(`mzP+2VLVNQD+upV ze{NLDB2-_6_2!&OY5szWVI-?n)DGyABifBTVvEQlrgo85h1m{EK5$bwCCG+8J2+UT z9_$*|e-ch`OD1l;hw3Gwb2Wzb+h6L%(h66nJZ@H)3=N^)Vr=A{&6|fkDERdfh^cEy zCgT}KLvHdvp%@#FZ1}6nz_tiQGDojg5w&P2BN8|de3$mmgH8Yq7^8;G$k?m{$8^wk zV-Bw=_+sfusA)1fmgA+7O*M?*3gPJS>3F{Q zWHEG=G1K+uT2Zf^R?n*Mo$Fw$Q4lP{dv0UTl4s%+P}IKY2}{$Qf^zzp`Zw&S6u5p3 zi=`Ed@c%^$M!n~ht*4NHtD^KW&S-^UvETo3#!m9z?^%D5GiI|O^J&GVp#O?W0xF~861W99SyKMqJXSaHN}UyxA{ zUD{+C&116am^T8Ml=7ZxUhJv~*EVUXMoLPbd{z9hEL<$j$AZ{jBcc-WHd_&LA81yQ zQo?_D6+v4-3IoY5!9`mxh!&qm#)c{G5l<{huqOvbp=_$`f4U(MZX!+7@NJ0{=g)W! zdSomC8g0J-K%a@1!O~p0dU46_v?LDs`H4HAVDm1lTa}Lakx>;JytnauL@Ggl7hn3lb zOWXSaI&)sNvHlrdDb&F@1=sFpu1=0b9Cx)X8cRuk8Q6c8TioH2%FQ5GmUyZA+mT>broHVfmgqnHQK)}=p`?Pt7oOd1LM2C&TB$Z|8u8*3%K zi$L^>EMelMF|SXKVo$Gubk9fpt<=y{SN$yTc7T{bou~KoR$WDG%cEs9dJZO_nFtYA z|2qT7U&H6={kSaP-=iQb=!~@pODR;8d~}@DV#uy~Lg~7e{tacOfe`Nr{ol;PBQ!ERuEH?e}ld9k+GE)5XYtpVqkhX`=aG)hpZ*;Js1k5YmvN(C|ZW#q?*}UoqRP zi^!{+XCG3O5mrH2xu$OJ3(Puy}@lh;}fop46>8P^KVn^{jJ$ zTyA;opSS;Q&cr z-8Ae1QJk{cRMc`BU90o(Ht+MTouZ(6T;yh=dc?u+`of{2MAMA% z4PLi0f~0MzEA_uGbO4KY8`~)nB3NsmeLe#JYcRLg-hMQp=v`~N82WMmCW1?;r@+8! z{!p0y=J(|C-wtz28hVUj%ZWz6=7#?;)u&GO(J7yR zIZUoI8=6Y5y;Yy8zMh~~$O9qF5iGn7S@TA7vZFtH-{j|IF;SSVxoTSQ4W@2vXo7pb zyd_!nYEWXwdq-hI9vs2c(%M(TIIcTX@Ii+2q|h1D%oObnBNhdtK3@eM2O_6sfji<)8^{I&`Z)d1@J`$XMTYC~yz0!;gSgDF zvSIIVJhlRnQli4fcicwf=Yb7mcwCAStbtngs|)2`#)q*9BQHv@_buXGi% z1nro`Ml~`TzHSJdMn+lc*#CPjt;nIVoiYYtvF>7m<_#{sI zAA$fJ;&at1rYY9ko*UWnrT~cuyX9x|#6XlstHH<(nOgdw`P>D|owZnz_#xT-^_y6w zs_tm~yU*_` zPyED5uDU_?Za}KPX9n*cniCZLMcH;J`pI_1jlJXfr9XB$1n&-6+WQRTx?jQ=Wa(c_j_e69XstAF5TcmT4@X3z0opubDmcpyaf z!Y;vw(i~zSsgSqK(wGO+j$tnC-A*$&wO+cqd(eHib<`*$;dzvsJ{GgM&aIce6|eMP zC+OiPI69uFz*nV@Vvfl6SOHYaP@%^~XMIxj^JL-cr))5CLd3)Tb1i0QeT79q;%*@| zAo@zj`7y`)E@`;_n6S?NV`Y=ZHbw4nb@ixX0Un%M=qMZzf9t^^EP3HW9G;;BPRf$; zb7!0`)J=BXTwGiQ{3>qnzLu3!jIzHj$sfXG30#;yzL3J^RXSa2&2Zi_N$>F8vn|D$ z9LZd|nj_6T>mo^E0Z38H=DzLmX=hK8dHG9}i4PGK(iYaJdCUu;V7(QkvpyU4om&!n zPaD0I!e(Qir6tCza-GT<6mrW1Z$&5)rO7YoFVPEEXcLwHqgWjh8}r$~Jkx62_h^ro zE;y^5b|kZ~BcDe5>W&_Bl3N!~)ry(1ZoJ%Pe;qEosYt>pcIkz@fU)k7iU%$=&W#tK z+mrp`jjpc7L0DrNaeGm%a@$N+)OYdh7)ND|QN22~Jr~czNp{goYYo1NWLZ#Mik6ac z)8!uEdtKQ!n6CL*_BvuaBZnc?;)MiUC@dsqjPxXw8|*jf>N|Y;fWS6_ssK%Yf^0V| z_1SKh?L^P+*Ix2ik>f^pO8_PuOZN;{Tk@C>_0! zD5Ix6`W~0Hva;*jqveMX%<;nY>^G_dJ={K`_s2dySGe$vu)<&QCgNgX3rSC5Rfw5z&iZ$I8l2H}&r)0%{2;IE} z$^#1~U(TrCf(4C^V+vHI3t5QClu#|DKXJL=z z1Cg)Kwg(YB!79@!A`|F_;hcjuOe=~sef!lW| zTnu%^pMS%B5FQ^D)?mk@JQeu4;4n<;nmOO)zx=Vf&Gt_nsnkMtHcz@~nTr(cY9K$p zv0o)vJdP@e&%G5TLgv}bMt1-jpB#-hS=Ll$=ol;CB!0>rw5`g1*-zw~ZZQQrojRnH zMw9Vb)3JtZvAWI<{iKjVBP;9UIm##;aiylYtz-H=;_N1x(7(GPGv>eY3LyrU4a;&9~5nI~O=86!p?9W%5B)lnc7UuQoQohH1_ zQbqYy7H+i-gETa#w)FSi98oa%btRk zK+>EkYdtvFA&U(5G}`$`LTPp(&29euts=>MKjMrjvCsXiCOz*~_KA9zX?S}5IAxy^ zCPytCj|m<^;|YGiOx_^}mF_dHa49DXA1MuTK&aqsCfHyf^t1^%52enpaBsDfKH12l5tz&sS46olR&c1W(6R;O+XVCOQ^=|qTFC&2gT(XZR78^?cSf4QEkuUBVy7~Lu zoswx>qQC*SQwtIR5IU|5NldOOnFu*<)=}($-BgI%s9Y_Lw$o|sEMVWTK3Dw7sgoHM ziQJqD=9RiT&;chx$*)f`mWT8NCH1WwNfclQ3X&MP7i>^s zn5X3!u?Tx*El7@A3F7`L2Fxj(pw-seE-UzWBu-hW`z?b%gA@g>XT5=aLhjj99^ZDt zIZIg^&t$@@F)(u%zeSF}iyWSjEJ>&%TKlgZudPOEDf}V`8`}GwEIjbF^iP(THXrxV1=(ImLFsB$!{nJ)>0vg+0Ye$97m|Lb+#`z3yS^?%>w|;npgJ*m zc1EY^GH&l_b7AyMA|P@UAoB%PHayz(3Ijr~j_8c%8@r$GYJc9gUu2EdaGl>TgzWOb zD(jtwz5UM4DDvWcI^x6pI)gb+QQp};V5|Nf02|2b2=JAk+}mR1H?Qwbbrtj7`XJlg z`-kJ|ZlwQeB()p41fn7~(6lou1kEOj$mTwXPvDo|!%E`~X$I?T-8s8C?Gt)<{M~D5 zap+@S3xK>>^ci<+lGsqNrYEqK?@!0&>NfAtCYfbesR+jFz^sIj<=fKi`~-SE6NSUm zp)NjA$Q88jHw|*0a4PrHY2VH$1P$YUxA31xJekyM<(+wdQg>bGCSWBFzCY?Nij$5P-ul zG{wT9I*`D6?yg%b)xIu5f;;f&(VadyyXi`=cWne^LrTpgKylg6|7h^j!u=cFaV}nE zdu!#uPUkVQI8L7&xApwK<-?%a|3}$ZHnrJxZP$U~g+hS>#jQBS9g1slFU6e_JOn7k zy-?g8in|7iJ3&f-;I1KPfM9Q~=NG*9m&{}`$;_GAv)0rzF)I&D~ATl?tYa`!$v`e8!Fyh85VaGQ@}?H(ufMy6R_ zqp`ioeyjR zEi$sXKKk~4e0!%eAPU6^nMIP|+R)$tE z6`9TU=qi({>??a$z3* z+_%jGlms{O=?*Cax?;IH)9UXiV-R`d-%4s!=;_%x;tV2;#)4M(! zH1ILD=_jYN>jvcjt&vwgkmWn^dWe(WoUd8=$vGti|2x|F(4tZ&Zo&zt(R^zPc?ulkG@ngm25hJB5^P3LYK z*d1@H?Y3~VFL>twH3OR$*ViaugYD69zq=IKoFpK1EddHQ}<-=580e{+(5EV)GG42)*YD*gW% zw+#Q^KBo&~c$}h-uvwPj$MZlp$#9}9KlKDyK$_68RQ^6g@e)ozRby-!IF;0AQ!7M*wC^zo#yg`UURweSaG&M9!(e7L# z(am6%XuZ9)+ho5UU2V?Q^r#1lhHi?HJc>jaw=dc_=W@-)ULE%Is-s3TzTYfY7WWRQ z2a;+|ACQq%CADX-xSMCmiHJ@=e#yr7>>QkK;A`{lkQXibDNugdVS6d)Hi+wU69!<} zxV#+V&Sr1TUmVg48c#5mz1r(YF0#7}bm$@WbY>oj@!`$5tB zEL#Zw3hx(&d&uUm=Yke*1F)bA@Dqoegc>rXRuv2aOq{S@Q7Tt)$>XR&U$g<@9XbHyJ^kLk>OSAdD%Mbu^b(fWixs2yG!8?eMDQE@WQgU{Yo$Yl4 ztoSw{S;IX6Tx1`fC2gptVEcSN-U@iDMxJN=))q)3!oId1V2o832DaBVNu9)5d2A`M zL6Oj7(nt!PgPqfk-3B*zQ!i@b{6QOck*zjQ)i-W|*cYEl44*35TVcX544#cVSve?o zIMH5Q-E{ltr*2jDJcZD7V#HzGck*W@-SZY#_bQrJ1!c^9SGA2-zEg+&rC0@i-2SYvh;`&)p>-3S zHXms$(L=jv>?t(I+mxf4yXH>tphb)??qJ z@&V^*{AvscaTVb`)n@sI=G=B;U7q?#GE9#}E*IMZd zn%Eq7G2+>ZiVGMhPi5dmS%~pka677lvlp?-kgBrev4^559sJy~0wt<1a51Z94{*5j$Y;L{reuS7L#Xwwz`Q0)JkC(@_0wZ5%Hxj-kl<6Y(~=TSmHkt z17J4`^`nPHwneElQ=03yoZJ4ZV)i@i&^-qj>HR*=Vk}LBn?d`@i=1(96*NC~HLV0c zo>Mdxk|n+i0wgRj$`<6GTor4=3E~~Mbyw;5qB7f~2UQdeR_7&+u5C!AgDZv&!fKk2 zg9gwsfnQfFRznOImN##_*Y93Vv|C&%SurOKnT1xBrP$L!cqx8!RZxB+8KpWZsjGHm zFTr&y_^EH{9D!wn#N~j`Z)C@l22jD5(2x?mUOiWA`IU@#Wf)dEbYm$Wljx~quy>`K z$M=vJh%GvV=Q#n##LpmDSYALh_wjK%fQA)|Qo6I}gsUmL9lEyKSPKts`{{!(w)rNi zJmC>!>}H^b6{B*23mp@k-tDD{gKT0Ught2~*?Zq=JUMeUvu1XQsWZ!HiLIt=SAqGH zzG%B`PE$CsdHk3djJ@}V)Bm(tCH=Cp9<2u3S@J;#^~vmB)}|cf|PNsAF~!{^KD-F>^}#A{V3X+r_v(B(Ykwo-&`hEE0%L2srl?}ljxghAwB3r3=42gS(YN^f-Xl=%I42Qo$4t7; zbQnF|C$)wZ<1>no;^q0e?(APT8{(!DNA#-OyUF`>(+s`E@V?2Pjqi*ZIiN~r*!Nta z$GUtPs)6Cpt`A_hUlwyTg+mPVL2h|X>qo1{&o^GE=zx60-m3**GeaCqsHx7OnIeY=&a&_T8uvbfzSTV3GfsSPR8 z=VdlHkbR}Qb@oM@sY-6X#bH28FLB<(>uUU;Q>-a=tpC(<_9(awvNi*p`qpm-lT+)T z-gX}Wxk^K<6^jBC{>1~;KJe=*Q&=2Bsd6Z8bZs39mth;90HD84j|WE8Xv`)Kbf(1! zf1p|9c|N&|A^)L1pP{I9uV8QzeC2{C>TYV zQdcEn5_o!#%uwO+b`4_XsX3H;mh}_(OBV=*N@$U6~@a?-vQHK zHfuKT5=FXUOnq#k=yo0kJ|Lbt7>T|rnXxFrzkV-0VLC@pyY4-P+%=egnCt52+ss#i_QNnRy7dI-cW4EWF_tm6pnfNU1V)ln|>7_<7CCi>j$f!{VpnbJO|ZFvBF zJj*C7erLt1g;-)q1Oe8!slVjYIiz)7f#Szj!#^)_yR@%^CHPA1w+K*m zMmX#RqVip6`Xnd<9(?vMUEI8;2gl_>DnZ%3c=UbTxNj*B9d%;4g)!{ zYRy6hqL~?%@;*fpNF=Kk+D+nUgco*Lwn`l98^{*+7PPEugLOFEaS??oYtC@Ea?+nw zhb68)6Lm|R^V&TH%bo@C&{PFKXAaUmTjm_Uj-KY)uxhG}w}6-4DuU<8DHl(@%-GB5 z{Fq>Ux_HkgH`U?h>(ig_)bBq#K3I(`j*PL;sJ$Z%Pi?kaaxzIIxP!)andE%>BR)_L z-HvbYS!y(qEQ(t4g-6)bvP%8CDSvre9F~0xZO_K<7E^w`j0|dwq5Notd%GmApp`Zm zO+0EGgH03kx4tZN?h2U*Enqb>kh;oMIob1e^~wo%thiE(6I0>|+oLz-;}H)IqG^uC zU&ufPcjwk(Jyv8%CMrlsg^|w}mJf+QtT#WAFhI?W>g}Hi>JteN*PL6xBxi>Gi z2$m2&(FEuj8wRoc*{gQC+)}#+o%$3HicYCy(L^zSS6^{P@Ng$0Mm%u^e_5weZ|ij=1%mW zTCCX$4ihguQs_bd=wPE_|#fYj}7|4 zVID|Y;91#!!uv~!J3aJ#F*56do+ISVz9IfPS~yO7S_3mVF>Tbd(X)r_YG<#{Y^nuz zNhK@I(^SMYVn0~o@jC7yaP%eX_`*5bkOoE|OXr=d%2iC^eVihOTstC8&To!vY)(uv z1y0NEeLR_v7#sfY=}4Bfr^98wz62{!&HX{M_r8Mmv1f7mJ-X1?l-YYd-ZQ8pY(feEZvG<%r% z%!Rz`gZDj>yfHSo>0^~??8`Lt4o!Hxdx;a#|I7}R-(_+@++3*>vSEOo@%%;HJ!QpV ztpBi;>hCzion{z77N!oRIAkwJ;(l}Rq1Pnay_OY=R5=Vi@sqUuaYf}SR#(aXP-kcO zCDev)hHQ5#>Bd@F&gsojd6HL+mKdvY)At?TiLM!o{9KydzB2)S!DUn?RF7x=by8YaS8|gyZmWMFi$a>!1w;~f=tT(&)b5?X_I(_q z9>BZUX|JH!V=%}esVK0XWB_M3N)?}nq{QTPl_58TngUG zow2Cm<9j~)A5S263k+MQ2_M@=?~ciF`QbD6^=rTM1ljFzP^b{L)pt4eWC9dl$1vs_LC;hdTrP68hWoF}EYa z!Xp9OZD2R8{Fbiej5dx=-$4(_#edvojGMz49H}P zkvfa`*V~k{yvesUKT)L00Kb~Ia2)OMzw~X0DBM1dW7>f&=$OjHmfXP&&Ek>sdPwiA zRAGmaCl~?k_&3HUJ%LWq(j%{K$1-c%DN+UyOD7%1c#@T|W`WQd%Cnol?%hq6Oc?uR z-3uA|MtCo$-fZ3TYL(mc#kvkf@KF8!WgNte+FZRtyP)51Ah=_$R=^mHaQ;#gu?l$% zTS%*r*LIi9gntu%3qwPWadqL*e87(MSe+B#n0OVCox+o@euF5GnQ+*Bx1BognVoTN z_i$^Qvxq1UIJre1ynEFqPSb}i8#Gm%(thBU(aEb11m<$!D?GW>+teV%y(7EbeB-(I z{vSu)TzdHXSomZ&G9aNhD`!-lK1JM>(4FI0<#r2rJ_-aHWO+*?7&O(>}k zLb;0C3)@z0?^%L9vY-oIuL(b0%~`8P#j+d?Ij@1&*hcXBE0=4((7Q%?Y zz4Q9%qjqMZ{6CULq?868n>iJ-`wnG+wT-v&d)^sm$X1QtueWI=E#G&t7xfFivPDIE z9|+Yp8?KC>T5bt@I_2sOdrm?-iE>mlUX%QX@i=)K@ftI!yqtH z8gyrTZfgufR9YIS84ymh^t@*Ejn8BF%rky35ZvqOSmN->{-c9SHp2-A@3+fTye0CX z(>u)-^xt!pw%e##{+(KIC?te0p5y5U%$M>jTmqIQHBQk?zp_PJS4nG019|U*JStaM zC!*V%&n1@wPOsn@136f@+XL-Wf_!|PC1H7KEu2@);OHu`e%kCc!}NgwWs{j1?L%+s z(YrS)6o;I=mFE{WdmlfX8}2FezZUJi<>$C_AE7FK9?w=B7KT>*Vc-|OFO0zJkN~9Y z{XX?F@s6}?DVf=XNZgq)<{5)-(-qI3n_Z(1Gy9ss>feG={=R44xOoz6bB6{UqS2&6 z2T9mE3|^cCISNHnaK^&4p?N?KeE++~+qIo~z-^Tik)58XODu5IaAah)`tNgZeh)jv zQeISLoF{Rkp%j(cUWVBFPgMFm`{W_e7c8VW#yYbzZep4H>R#deW!Prhr`5o)2W@A%r`vo-bCloe)FNuClUXZ8B z)a`f=(4|m-M1L54W6uswE4*~RLe0Z+Hf~tG{;ixxR;jZ0C5b)}7;anBda>*`ZdyQy zP|NAjbST6Sik*tAp>1pFyWYR7pi2ByMv$LI%M;Gd;m&$xbjq_5cue%iwD|P~QP!U9 z^nTybA*|h#=TQ6@ky_55fW7jNw|V%)fbA+)YO6PJ-y5?gDE(uBbGL=})zice0{r~w zrqejLka02AFH@rWb*{$<&1g7mWyI%SG1VMMc$jF8DY%%IS5Vm{hvlcUN#~DQJuKL% z6(Nn2`^i@R8GMqD;5IcGp&KY_=*DppXBlpvYoxuS&;GiBucn9)^XGNB11mV$8fJ-6!hG4iLY8pM*QG;kkM2284@z)r z1R?Ha&G4)*heNrM#9sA&u$?&FXfGgP2>UT1k$Q99?Ke(H1n809Eu=^*Cq`& zK8_1&-k_KY{CPx@qT*}B{+w6zRHq5;$>2ekdsKqy2rYG-cU}n z^;wcO?F==IniTFjLQSR*^^caw=q=RtA(p9 zjO1{Qi4bF`RKT#Q8lDRmqh+gyBQ1@c(v|z$@h>}$;F>68WJ>E$3ZPd zRMhJ}p47;(5H!=l{T!DO;CIfpidJn#*^tF)CJ|{bl5zg^A5kLQqf(VSDURrRg(3e* z^I+q4J#8hsgkc9YTbuKcjyiVr{dF!BBdwv`y7n6;q5p++Q8&nn&1`hvckBI^MTz95 z_0{z%uiB@l89XugJWOyjs+3T1BNEWuYx!=WMBd4&ziG-Ur-$mCKyE zv`q|y1Fb1b3&Civ^uR|ygkNKX<6Z}L>*GG<_@8>^x9gHrGi8oD+a}Pk4AQh9&?%4B zH%~KjuuseIq0CG6FB2cl%ZxE+5VdLmDw4q<$kG*WST$~)fPNo0wZL94ZhJ%N1m*-sO>!&&Wf)>mE z8tmNwmYC%67vxf@>V9c)z7HZkO8l~*{cSWRe9^11_wdnhaJo}oXz!=|Jny&n$jMwI z{bOiFnG(_byu8Ix(Tm`aCRpp}B9CJ0Lqv*OX?{cr)jXu zRhw@*hSI%z2r&-c8{TAeVE;bUitMV4QfyeU0*=aEq3P%NxfakBD&P&bNgmDC88dUz{} z9Jr*6795%C4azf0(+Y!f|A$baN%Y_X3Y;boA$j4_+qTkrJU$WPc@Vc7umKua(PyF^ zd5;+SOEe*9e!cSHO!ph55AU?MiJY>Own+7i6=5|Q?O|g{Chxacwr+sOeG2$j+3Hcb z3h1WZmDP46=f)-c#NYkFl1R)(vGO11i1b^5X6p5@WHesnQ?N}@tBT(?;EHj=`bGw4WNfHwC zLSMRk4=enmQiP>oX>iT&n^<0bVYFdNx5L^cc-kMm7*1-5H>dvn%O741xzHo2nXyWF zd7rV1-_}WBEyS{o%WTMB&R3bb3Tognj+vLqN3mP@2>7xX^5Qzi>=9j;$ej)FOV(eB znv|SO{t2#{yv~uP1?(uB^kP%<{S>u;yqBae9g>F0TkqjYH)&MW@WhTydRbVH3Ttcp zd?Z}p_VTNVgP7ck(g@_S$F8xnNtTH#u$7C&GwmRK-i(3*n~q6%X#3jJJ35)__y}nP zv2a;2K3gTNW%F6M6t~KR?QaNuK86SkD;tN87H93zvxEG9g2RGeAWwJa+jqO?i@~)& z1(>w;Z!99hq;Q|EK&G5McGcqY0@EV@RqQMk_e3~vvv@vsAJIP* z+PfHu;kJJPNR0Umpa+lwWU_8LCIg3WblYyA`o@rdqvA3f6-CMK>qf_=aNMuVV7!LE zwK?F2;u_5Ck;2bWfwd{o;(#*H8I4u%`edB_6bJLEGR7sDD6PvioJqC*d(GKO9H$8FRAE&#v zgf4aicC3uRFM&9w;C|t+*jtIpM!AKRC;C(~p^Eib`7`-Dk)pwMAUGo=sd=^I2Xf~y zYOHDeNkiF8iTZz+HPG?%w5!m+Yo0&cSepHtc&NA`cYh|Wh6Y>zjvj`4e4;yD%pCnb`ca3`c{y|A;y@7hc0h|jQTHMPmFhg zD3}ChG>?+w3u)|hC*v^W^HbKXSQo#l%U@G@8Ty(8#31*6#+_`LS)Y$)@f7oHk2#e( zwl-qP4wA>SOdnJIbhYgOEXU}FF^}3gh0OgF5m=D9h)@>g>^f_#Mi;h~JQJI^Sf3Rq z9B=2bU51e%kQUj9REtEtX;>$GHJtrJc1#|?&r*3kZicx*O3Na|(C#Ur}xX^bHO+aR*7liZns*c z6w=VGTDFGGQ^FZKD8#syg&23Pie-A@;r%%Sz2HkTff)5$er?*;uu;*YI)9NDA!}!8 zqiBc@71OK&tBog<>N#+?e8iwF{5>V4{wG9*wa>s{mkaG09?$zei=H@7jQO|0PY-z{ zh8yRZ>#$nV(XOOhx^xOYG<9Q=t*^KNps<$|QwMk0^x*)}v`tRb-r}Qe4cW3q^r}P^ z(P*FFIl77Xwm@zp<2q0BXLi2{VAm3F3C{niyGs40&eO1H+lEBWp+`_#9O-B7)BFlA z<>ig>ysGEn*SmTzQK~4(0k^6L#yb8V7fw|jvo@u@Jv47|fRw_G(?zZEh?=fCTd|&kG{eWHEy>gHccN7nJjumWWfy`xR6bdQE-y;{ zvvcus3HTKrj%SlOs9m}mn_x>`$gcBXtx_(=O~~%b&->RGu>YMA1@_ofYZzaG9mm}G zP|!^xPVYPj;5LE<oF%$dx}<0YPt%aTZwgEdB}8|Ihbrm6jN?5(K!|{Hx1*AYJF_~RuEe7 zL^dkc>Gv~>mce3ynA)VLW20{>DbQYmYXbg|LeORTe?e^2H@yFuv-n?>JfO9^PNr)h zxba?ZHkFp}Q=0;e4@y~_+cgyKdKl;WquujCb5~gTywSQhIIL!_K$2KI(?do7p~vs0 zyYjs*XbKAV#J+sV4eBE6wn+?s0WW<8^fNph71tG=-y7SFc=ljODG|rqw)FRtaPPlA zSX$6@jgrn1M&k&>T#=oRVoj#QX>L{ifJRNjE$Mef^qG){uTk0C9c;jDF{Q0$U_A#P z(mlf^sjUSXnW?FT*qw=z(wv2ccc z3PV{Og2TlizMMXvu+UR|e9da{7~ zc*adkj^6&XZ68npygZ-W3{>r!wCxDzd32g+DJi9WlEyQ@GnXy?K(UklY*v;FkFlzH zsbT9jCp)MlIj4`qv4#Qifq*E?RuUab;) z4n`E~*&+HIhbh2t^Pl&kON$q&9DRU#B>01>qtjfu_89I{^5 z^*4}6=^@$a?5e?E(nQ+UOKj@+=R5ui^5y3V;pAGnEdRiZ0;f1(&R;tK>y^CQcb@ny zpl0YALv+%CuA4 z;|Z9i&lrhvIGcAUf&CDNEu%>q#i;vEzR1OnyUcKbHa3GXH6DB}=b~!@6NY=H%VrSg zMFdCHcdW2khF->D|)AIiPr{|Ttdh{fn;SP9M6YSvD zSpt>b63jFk;q6XR>8&Rhv(^VkMZp{O1eAe|I1Nwt3zWjWJ#NL1=<%{eMDWAIOXoK4 zZc`z+2W%)ff$1uS)?reY@VqSWaw%WC?1+j@p zl`wYRHcjIi$xBO}GB7vcHd-Ri|70L!Ptu~EA1Nd@FCRq~cl(k#EuTVVAx3Pk3VWjr za+&(R243%h&KBZDz|V2aAsR-Npq_vzuU7RM^o(-e_+OPc9h`q4uRLAZ813r$9Wsu~ zsB-ZtIho}Xm#pq&LvUbCDz;Rx1ZS48#TO1_i@1J-orR!$V~dIl^$F}#n!y`KjD}@A zST(`&hjE)DXJa(xW|^}=gf-^#W!Qtc@@A! zEF_U9PeoPl~dBvX1&wk;&1iAciSy1nLfn{rnQ8ZEc z48YamGE9a7<{wIIJo(qkDs(JhCp1%AZ30^-4Yz)|*A1JPxJOvV&c7<7(1_(QJbS~x) z^axoZ=?<d`=5!oujsQAeisoK;Dvd>tY_q0;`B2g|8rlUWo?PJ{o! zCzz3^-DV=KKAVv6tzh-r^TT(eH~CvtR6+>};Ve$f?{WY(4|pW8snT_UuD5HjwFwKkEu!wi2|ZiGarh;!u0E$1 z8@&0Y*cV5#FY+HTMsd)mUwp2QIrEWzyYmzaKnkSa->Vcah%$ z1g&?Q^aRgm23AHV5e$1?RNwkvW2TIMd2N}1K-<#)Z-Ij~d|L_n`WpxqIg`YcuJlsM zC%;qbPxDXeW?cMUGdyz8&sB*jQlrxx4c6>_p#M_qp;w8qr~3b4QT+cAiZcv z_L^k}o6c*W^LD%8s3jj7MQx$X;Y>o!WUr5nQXRo-;~%o$2Nj*J%3ZCNHf65|xttD@ z`eO&z_dD?lnMQVeH!IuMPJ!BRPqVr)Nz|p89LOrU}^MMcB zV^W?6SCv;0*E^UDJ<$Qfoo8a}7H&vl39sG2954IC9Elt^m;gdw{UJ%`!I|%fp?E4~M8W(>mP+j?>H3V(M4gJ)SR8=JAE`MW8Yey~M5`+c(^hkl#9k z6$+a-&v~TtI)ukv8`O=%rC-G4k1cFg*7sN(JwR*nA1GFs6BUvHt^G0;aZh|BZfeaSs?5nlyn5Qn%g%R!+6M}(#Ndv?ga zUqkcakNop%p-}r2thB*7gMafk46r z;{s$w{Bu?J?VGARqmwr)KjvI#8n(8#ruq#j=Ratg*jBqfh=cyt(_WZ91L(qvHJaqn zkz#mxV#A_gR|p)c^i38>*m~sUx5|;|^mJRNsNIPPw*LSW!&49%-hX=7)7||;5rB9~ z#KVzkMNzA;D76RvZ?BmHa;=+okE~iwP-hZG95Wb+WQ>UrHzm{9e_$K(mw>2xgy>*0n~@= zEm=IQ=S6#>_yI9PusNn)LP*jAG4Vf{Y#C`vx6#y$UFo?3m)G;BCiAC61Uf=+MNw5c zxSZ^jlzXf9`ZHKsR~p4M^&>kmT6<+WC2#O6WfI5j@yHsAqnh42Z`S`lBG_-&E2fs$ zZ-TqC&zsvF2fF_f+B;l(=}zrfivesJ>bUdBU=Q*5({zTRvuQH93Au}j2BxOsBNx~L zEVeTh+ZWb-mjZ^U?ihA_rk;y6CvdMH7jcnF71=7~Etqp;e44HTvdPSw1I7S(?_b}O zVs{iR3Ed*4Z9m^FuZu5g?1qU_g%EFjnfmitAq)91u=@;U-C1LSI;K1x&ADC3K{r_n zf%z4nYnWm-r~j6PX={rk&x4=K_gaTIsi(hAg)81u#__nW}R{2H|4HIi!ckL7heegX$o&;XJE*dpY(M0iG&f znqZhB&?a6x$O?9e`{gG>7j-vl`CyFeogj`mR~?5MgW=tPQP-=%HfS z7zJl2!#^UVS=J&iSlZE5qsl&0Vyl%P>m;JF?awl=xN2{b6eF>!kOZL2{6o2eJ)=VC zb|!+|M(~jN;MET!pps1{Q$M5X?c{{a5qU?Uq%hi+J&Nz?nYayq8a$ld0>RVN=io3yL*do%^9FK?jv z={ME<-4rKi;+;Zu|08(n%e$2OzX$|r5Un+n3!(_P%|Ei4Fm6tCH#(#}Zc@`~0-lcDdg4CrOFiD_N?2Apd6gh7!K2*3sgMQP$rR^Uz;=RX>tVJR`m}HZ+ z&`z&FdP|e-Fw43;zn=KFZ=TJ_T|R%{!5_@^ODWf&Xj=5E+-iJ(QYwu~Dr1>9Awmwu z@dn!;a97Hxy^FV8Cm{dISliFouLBa4nFCH7-4?d5or8v)8Zx{P+rnSFQ{e*Dd#nv zYcZ%C^NwG7Bxz9F7f)Wc^ViXiBwJ4F-*s@+>Shhbo43(uzB`h!B#D3l_sR^T6tNz^ zxMd3oW&T58*gKYG$OUtf^vpL5DM;XUl(ydIqR*y$YD9NFXz~2t&93+rI!qlV3V2=yVZmztAKd`D62W1U@|Ru7i+L+YG%jaADwu;EE zLhbPssX_{{Ninm8Gfu$;G`t(CmK>VTS>J?Y#Erex)X9*XO2Pc;%9ZscLqWfV11b^K zid^hvf6mh9<2HskmzP0Im1C*~qy!`uG@j1;v)xXK=*WhUq?DQ$Z<^+C zlT6C&UN5J!*W7va#w%{=!mRJnaqHnHG@C0l*&qhK6M1sjKcml2HSNvgyDp zACO4YNtG3ga4O;uEzZrdJ{aq1cnZZGe4UoJRM2sOV&gT}FQV+ZPsEC`832otI^dwb z`hD#kt#THpx`;~Ys@peS9F0x!#^#sR-j$6ZdR7bte5sTH%|AJp33e=lqiQ1KCliI5 zPuB^hB?SBx8rm9AD$*G`EsUEWQ@75nmjT&k^?KLAWJ~kv2&Gh=hZ_BufD3PtxXeX5M684#ep^Qw+At@1Z`CoT5lH3#1mPxrmWh;|(CPs8w9fu%h86tT z8w?rrmwK8$FQKE$!wJK;u%Jn`D2fjKndqqvY-H$m?Gcnd@Z&I)0~J@+=gKR~)tTO! zo77pA8O0rMngi~7P)=_`%f1WTs`6c}MPHl9%1(pVoLVbRcO=9yB}f^a$H;2Z8BjPL z5q#`SPr0!MwL2>BHu%`>7GWdV${9qsSb*qw2Wp=*8FN$cK-<;8vP`09@a1B#Eay_A zP;=f4cr&0@;0E#%Ig>(VW8y`z-m>u{*5DZaoeZjH;G#QUuewz+g3EwTv93|y&##%G z!@Cz1+v@PeG;x+LOI-G{+oq@ahR^t>&gI**BQ2FjbuZFJD5V}}-ePFR@zZNB!i3J! zyWJ6#!x3|d)URL02^#&_eGcuQxKYnb{^~2>VC;kT`UbDni)}(m8uN4d=$s?5ZP8rW zq2`|!54R7$#x25M0xkNkDlS|pa|Ag`+{_m(@or1`fOtzkvB@U>W(a9E%UsM0-F9S& zJ>bd93=D`+0Uo+;I0F*H!&m&^Y>eZO`<^akbfnJXn!2}>wmG#4qBbkb<#a)FcD|Nz zP(Vlpe*6TO#v)POJOQvf-|n)VHm0c0x)SY~ND z57Xq>bCaKivuC|_?@$mib$g@3#+W(hnMMN& zRiaoTk%kLlj>B#&M*@>%hJaT{sdCk~&2~5G!d@;g#B7unQSg|SgGXQB_wi8q&`#wu zvH#Wo^?Axz=TzGf|K)%g$<~`uGR4KZXg{>C8n^X9Z$Kk-v^{D(s{YB7z$c2bQraQO z#L45AtUB4B|D7dQ)2f_$)k+7yHA7Yvf`oK`IppI}!4lu)w3_Yc$M9}{b~byWgKxig z56luArOlR%^KaJd@@Vg)DJfbu?8yJN4HzMzm>HlmAS(E0)L+G<*R;iMT8*3BifacU zzTc_Z#f?@bfB7x^>qh#A?EcT!Eo+xns!t81-Or*bQt3v{bvhiLI9RCrPewwQ7PL$%D3mc!%*@ov28>msdi<6THv+p>p_2k_m%5!2C zs}yS#!s<|z!pmJ}T*c;j-CbW$=9qs^w#S<*bMcx+{s#$-DXnzBtE*tMOFhP5`6>!+ zT`G2U@gD=C(#skB%Bv?nux(dS0xw5IgZ=BX-v;}l;FE&Y)q2=@J_@U@Vo}Zz2eyE_ zNT$sEU@}WAnBG)I3oyQzHJm)3yQ4Z5xzJuj!SxD$O%R8CO(kdXeK$?H?3y}*PA{+9 zh@uJ%ewqS$X^Mtz8eVb0%Qujsf|;~Yu~$p4vvoihX3gI_k|s&8w**4N5KpqdM=9+o zs%5MJUIhJnMqh%*Xo^QWe<^ZA*4)`Qy$g1BN|#RU9sL#EDv>nOv=cTYHv&( zLonc!s+QnRoGC>gJfr2Ke>DVcF*uUww4H$D-AQatG0194a%UbEjV^?_*&*^F!XaG_ z8sGk5aE|NqPuq<{ts|iyUJ+AsX(>sI;%U&wjbA0A+Ps6xrUUMbrYX`tc+M$;>+?Ws zWrWS}=Yik@91iM5|; zsnQs&Kpc+Fq0!{Sc0@0?V_WV5E)EvaNQCxJX+T6y`%}mWF2PcG_(Y}2 z1?;rz9^sE(+9TN*h3>aG4l^8U-S+(U zFb(2_LmJ;&P7J{^EUG4Q)p!2(;Jn(<+@HYMib7#^*OU+aezmpE^6pd;?(3s3@4iRL zq)3!;C##JOpPD3?HT)VSJ(FHfcl`)?G%?38%)c>RGEZ>@Z`!Fsd-7Q@LA_CG9qf<({LsA+f z$AC#AjdYiUQqnn)?(Q1R=o*ZMXTLw;dAD~vj_tm$>l^3!ISVfL{WMc@;<=?P-<3@P zp*lyWuGO6A9+ftB>TnqvdiG|7p5r;S_bLS3sh@@M1c z@d@{IxSN`^l~@`_&587faHPMxsxOh*y~KFgbW4z){$hb-$ppPdYv&U9qnWS2sqB+l zBH06QpT7|vs-w&<3JH6}n9FVvkq3LV-BJ3ciF)(s7X7A&etG9ipM+-MU~j8Jonf_g z81yND-ipo`ynMpPZDO?)7O(HpHrkV~tZppt{tanbs#cml#GEB+c!8Kq{UQTx8v=@* ze>_Y#aGKu{N4QCcWJ-fOuD-K>aX+dRHA&^|w;uk>eQG`ysW$&QD7wYVqqLSQUz&SD zkoogTn7?RvOLnw;F#c8eLzYbZ3h&;MUnso8D|~*A{$T?di`aV#j)JdRwcgr3Go4<6 zw~$mfwh&6r~h71iRHM1hE})N&U4EMOO!BC*oy8FZ10G2*K?*n9qL zdxwIN->f9Dta;2+^Zohi#hc?AttZ+3+>I+}ReCU;dgDE2M%Xc}dBsE(gx2%xq=crG zEhQ1%6%t>(F?$Xi7gv>)6@A_&aGDD8G`9YmkP>0KZIG0dOij#u#FfR4uj_*cAke(# zBs{dxETAXocXY3injeEbc+cOmOs6e;6*5>2sqAR&9~W+X`KewsDs+h5R`YL+w@sU1 zhu1OkMN*CB{P7L+j{v-}UvhIRbCf!nV{%kY&UfTa?ci49oPZabWOZ)L9_M<$1C>er&^50kL|jFOrBrw>L)OY|jSE7+o--8xt&&-GP> ze>5ipTe$zzN{@}F``7tJGD0@c$F+FN4&fna0z9EDzaVjPpi>NAjS)=qcocox%F__W z>$uk5VmtLf@x1?x)b#`$)k`2f_8n(%71p(vWZu5P&9&B#jQ=n;c@8K^5mQ>i&7Ga!6VVds9 z<0n-srPOCF>u^{d`kLz zVk46_EZ0L^o&j5c1ET!jbi=a3a-pkd?|i@eNffgED8m&%fe!552cwBW^N%oG;p{87 zFHX~W#1?zCVm^@D6h)(zJbpM4$@?0^mgR+47l@&-BFN`MQBl5}cCuLxFbu_@**$Un z2Oh`oFRjWRZk}v5PWePMQ(%fy>h8Q})l@EN|1;e7-OQ6;O8e7-f;ciY6W{~Y(b-FW zU4FX@Y=>S#;*(F@+YB>`t7YFPXoROkBigmKQR8kXO2j#hl$^weX1U<=p(BK-Sv+%J zX*pgoT{8dlpgDZrhaU+9fV-d$ARM2vZp(`u3o7Go<$ zW&*7}AlRs&85vCI;IHg)@Nf8ui;$zSPb}bRX8b>*CzX27Fqu`@kR};b{B*3%3OQsF zbADMY&QZeJCTqZ_q78)eIjO0mnyys%jcmu3@Vq;jr(3S6g)`>rza?e2I5UFJ;k*Wl zpH~V8SqKfdPslGmO^efC`kF=#7nfH}>4qwcNk20j)4WP4-gr8a$t9D{`4KOwavW0n zCg;zDzfqZ28}51$2-iN!r`?93Dk7l4E6RaXarF^V=T)Gtx8d-bAk3Lr=$@Y{{V7x? zBVNEA?M+ATO9!Q1>)gPf8na$qdQlk%OTI?p_qd7EPf&^f#>M`3Z0+>c4OhtMjzK4H z`inME@P^o3!R5h3Pnc{J#QE|ao#k7#?S-(R`wv>Ca8D~-s)Mln9D%3c5!7S2uRP;L z8gCE3N5e>UCE-983`_ZsAl=5EeK;3Wu;`9)A4H`CuM+oQ5Ox~>$zHUa7a#l`IQeyM zEd#!=SPz<(c&wE`KK1jJwU6~_7vheVX#BF#)EJxAL%M~9Va)BAf zZFyyt<6?L`jf62K90gYTc#nA5RFAf7+|gdDez|`dj8ds?@eRNJM;Va=@1Nu)scbdKSG`^GYe5vO3*0^+bO>p+B*rT{AgX$c&B2$M!(kblS`{ zIe1TscO%=A(?Bd<@JyBIVnmA8=-Tp|&)=mk=%5)zASh_$xVd8~SHXVaBGf(VAZwxX z>xZ)>+NC{oSMM8f6J|vcIis7XPdE2rN5?CX_3;JT2qN=<4?=hqCe!MGLgPDf^75=l zn>H60^Xr_}F3g5b8Hy5$Y74;>0V?` zE#Dm*7$33sy5+%X0z=~Ig6;Npppe+&8_IG`oo%PI{-0UXf3eE>f{SkK$81~hm_wD; z0C?EiH)%AlYi$dRAVlqOZ5g=6{jpy@s<(jzjnoUQj%>wu#3j8pR zlqvKb{$~MuUgv&}L&B*JUoIPST>G?H!Gu%{0~u#YCLZ1CQg6xMs{AeS&Hk-4-Am{C z%!P25jNkDeb3CT0I?d*M^7CnPnfgQ;k^Ug~g81&{M5sABu2ywDCp*NKGB=H0+J=i+ zA`*R~<^7%Q1MYOW1m_#-!m^b~T^~xr3)85Wb?cH`29K$m)4m6F)nZ@po9WttBbQkb z4zMi`^_zeI8nEfI>N!bT;^Pz4IdySIp8g^6`dXzziu(*0>ev8e&#grP{O-QoX_0~F&-ffhr90E^VAO+v07XJ*}_OxJ?P zRo^dk+7_Yj;ig~n)o;%w9zm)Ab;2@HpF^E~F|z{(5^o7C)0C?=7XH~!tJJJmNJPr5 z-51f={-OITuM&mih}1{fMSdr6h?9A^#$IPte+uMJ+eAv+302>L6L<8J8psu$d#mpc zr8nk9UtO`^t6mxwTRO7Mu-2`6X3Vd&nrk2{7NGy$WHnd)35xv^(8pWNr;pwY~YC;@ei#^Y3}-~j35 zpyyADs{P`PqBDOCp(j`tfPF&Z)U$mWZu~sym2~#QSBLuo~k+3P_M$c z;efS(n0>|8o~o{gM}XvI)|SW%9m^w6oL-*^{B$|6f~ap9^IgEqw3l2>U`C024A ztx)Yund!m~G#AV8oHPi>mI)v|AQ>Q@D5;ehD-^P#{YWFC9gRPCY#8CzuF8`4b7`_! z+Gs>K{HuF_8iqCBcSVh_InKmYJxiciMQ6mzldMsQxDbD#u?Fubjn~ftb?Zti;Rxb0 znt;FKx#30)s`8Maw+>%lx=hC4<*XURVeE?UZiM#dey}@P@eh|cWx)Kd7n_{dXD1jK3nMnXAO!FL;Sf29Bnvum%9%k0}E2VNPTAQtv1_b__ z)+P&EiG2+1zm6W-(1rp&d;!dti@xC!jaac423d~b?!G!cH7uCkwOcq%R*y(*;8vj) zMwKJMmZeAs9w%;MyVPQ4q6+TQAV~0O>w_k3nAAi60?( z9>fHSGP*$(fL!jj(@?<)5+=Qka`w`Lo6mE>&1QWh5p{DsN8{|6UvqCiE+3Sw<~Lv0 z8=W$ME8#DCsKio+LJ1GmTy;anA1zH~gyw++o0ZCQZHc$nUvnL+r%M<*$L9ZWR>+f%W)oxM z2J|6@9%`#$#O6d8;4c-zBXOm!LhCt1{LRUYB*cMN?LMbfBIbSiN)1EXFi z0kn3@#DU_1A`<1#%LI_y!j zuGU^XTo>UWDn_oBz030f9j`ts+6j~co#NpUEH?QyLCAY;WO%L!{5XiiK;YlUG@oGyPlqik#=RpY(r|`j660OSG6up`@%-vd=WMoPLS6 zJ!n>K(#@!id=Xr+G!Ht%BH}PzRumTpXjX02z-~rh;$JkONDm<5_`bZP#U^H3!CSPZ z!*e{*FY?DoIGV?^d8p^sZ>PD?ny@}A{N)488HD(q#jg3w&`6=Ze8+++oZO6n@16yx z<%g;p%bQ;QJBP^Wlu3(QVEyKa$=vkyIdGrp(6&05I!Spidc|4XvzQ00XKDm2<{x;d zY9Aa29u~_A{tNH5K|f}*#Yh*ysG?pAaHYr4n#od{TSKj|9CNSqFbp&M@ z?0AXeTwHvLizt&%JwA5W`G~~B(WU5gLd@x>=(E+X0KSW{XI*4lsa3j_Id#)AIxp|-=N(xCBOHgA}bQCCK#VzUnS}0HT+WrLvBC1+qMXgcXY`8QsIO zD~k7iB;^Zgt1XNuwcGx`Gm?Kltqs;6*Dl023cnftl-d^;mxnD^H^S!lqlT}rcbDTUrLG~o*KZ71s14Eo_H z{E0EUt+9Nq)*=3#2@WT_kDK5HxpVZ{PC#w6=`V<91`FNqic7w$pfg@u13;41NxayFjYH6 zUjN{d&6I1qCTB^#U&>s|pWVXR2}Zeyzr|3u@s9o?<}n%T4`krwI%l^Ei}5_{)cIFd zoWz61ZGKK8*wU45L>56=OSwlV0J_4J(kGf2dT9yXh;}-MkXa~VxGT0Lg8aGSwg?pj zO3^jb(3Z{#FT-N+=Sy@N)pqeqQHhP9I$<~7I_xgE`Tu_Cr6~)d z(sugf2?S)Q0AB&)WE99=hvz=b^f%LjR>n3}PkuMb8)_=PfSr&&aSSIBP#^Cq9;4B%Zk;$k+SKjoXXtuK1j@Mx`y$X!natkY-> zimWd(kIdCMsE?#{uhi1(tixBgo_0`MfuJuU=+nny1*w}s7J|F8SJ0sc10;*F{ z|JKubJkkubvVnoGcLO{;TxNBO1##pT|C6Z+dm2GMqBOjmQ^|;3Fgarayjm=;Tr8XR zF#`SNgcmrMSJ-IU_+<<^T#|wUJfgUbvQcpYvmq=H04_!`XZWi)bQV^ z-}2-4K7$j5at@;@7Fw$dGK2vREr}&&&hu2!23%hJ~$ANKSH~A zx}P=N5_Rs*-*~u&zNZG*E2Z;jCA{9|<95W$#GN5#pl2=KkZee(miJAl&B>RJpS&yy zV}h^dom_lvN2|oqsdfFzulc0b*aKkjQfbDcQ)^O3j4$3!99n4$;i*y_i7)@-yPUEV zvt0|w93;toei&vQ1;ekQNV}P+_W~F2guNJ`TJo3rZ!uQjpjP0fQ`W6lnjI>A#P;m0 zNLO;e@;|c1Ngxp#^vpuybtbX(;f$K7U>nrKL8Tn+?xlSVIWG0ly6KwQKi`w(@dm6L zplH7_0%$!=YNK+07-(W|PLdbVA4`2PRE{_iaAI(%{aqz9tewZdIE3?17=$;E0_Z!& z-JcF-KOENC`zpgDASy1gomf(@CsNB-}Q{!`E$v>->ho8Lr$6j?t{d5^c@54wlGGJ1J0^s1RtMA z=L#d)9>yMw)0}PeZ$oTkj(aVW89Fe;EB$hs23}53qon{W-jy=tLhHV^8KquB=mkeF zJN4ah(APj15H?az!N!?vFZ5q=HQ|{>0oNNAyu#4K1vzL$rt|vi#l^PWYO6b~0ri8V zIj3#sThd54Be`ksU%v!vZmRaLU z(OlUNxf;5R7_M2`sz;(vue}^59lTz6gEXz$VWST7H+1~D?-RKE3k&x-G23k65dc!H+Iact{^fVD5umrP=t;f%d1hCqV%GHaA~6FIpG%ii_Ba?$~o80yvgnd-U(CR!-M!Vz#W8J24a8M=nTrd6vOO^tB;M; zJg$H)xCo*u-M{$vg949A)3Ohb0&9g}(fA{WQ&aCY{sX;;xoT48&H4wQi4e0oRxGEM z0srFPnO~O>XD>-d*!;@?TH~ITGyHc)lDnC&L(28TsCE0nyBOlg4(0TLNo$vaj%Q}- z8_spK_OYsUhq2T(mra|zxZ4jbK?0frE#;^Q0O7efwnIozm0IGfAC^#VY(JEeC#U| zv1NawbWC#O@9n}O=mJf?mb#hR^G@ZWR@IhALpt?$LsDZYhk zJSqImzWMVNv4eV|v89MB=)N|ORc+dG^?`&vFnDebWUvK3-2wgd+=|r~kPHSv2%dEX zxPoL8B(8?r8ROXy#jevoSx;^W*(B?I3^4Zoe2`F8#%3oXBFIZ=I?WHyGLn64__k6s z6xF|a&lIwI$f=>%b`C`>OS;XKxPjR?Hxj1Cj8k40BWmj( z=ODwwsCE_@dIk~j_%^x2Gw0^2R3nd7@61nJr4y|%9Xr;-;Lp_~(cC>kncE}_R5MWM z!|DrV>bBOWXFY2%rfmr}+(nIe6`5ku|6Od}pmoDQnW5_PdwXVz@78+sOdq}SZgU)i zXtwMx$E{G7N?bTf&KAf9CMkv|6<{Yxk)g(^w6&o*1_f7OO=Wr0W z8z?rdorhDHV2ko#fhd#!RRAv8*1ENfwP?0kWr+D!dgx-lM4!C5T40;*c*m|^X)aK0 z;I@`@)!dQx66LO9%cnMTM{2iK#c{^Pdy_=`N5q{!I0t5b9Pf41DVU~$+}glgaKrJv zW9|xM?3(6i&AUag@MR@}>;i#Em%cWL7!4FK0-Cf;HE8`wn1`Y?n)&~=BB*R=1k~kD zNGf})YJiGk_r&+4)1CMhtk-Qo=v;GVb;~b3N?&> zdJB2cQ{k$YRT5!KjZljO?9G0(Me#%`;PpXVWY^|nMUY;6uY)%ZU<}{8S-oZ#+j|vO zU;BR|+kEPHNGcG;!qdJvgr@;>2^fo_)i-Cr<1jfF(`AH}&F+mj4%-b=CY!t7VrDfU zH8DeGI(UBO&UYGEfA_g~KW$h{eA}%BMKpHcCvRj}$Ke&m-uaY62Lv@-MQHn6g38rE zw?VQFZ9@q$WX(*9p}ci0xY7sGU#nVMlJV@#G@8Tc7vz#nRX+Uf`!ai$s5Be({qKps zTwvfJGZ-#$_uuO_RRT_f%VzwkK74O2AYdQ|h|g?4lGMO-gFahBLlP^8E% zUf$%?QdGIN>(9%v%}Q@-YLgY5ja0-a{!;IGkT4p{vRo)&5b5L%i2ZI4QfP0k-uanMoiemUl#`Uw0>*;M8Qf@RtO7xwAKt^M))u#l9HE;vy?nYLJTUoF} zf{XO0qMr=P7ne)lXY4i2;4&&{Ic@W_UZyuGi)WoaTjER^s{hV5w0YvRI@i>E zgF42CQ@9rLWeV!Pr&g&_jXdN{4{(oLKJ=wKG=|s8AQhw;SB%Tj1c(K?EV>2T@^zX< zL6PL)mLHEhyV%eE{I#IzbCldN?B8cl0P8bN5U(ftVF2gW{IZZ@#{g8Rh069wnERbe zyOYy%W961#_k%C>Gor;IPZ|82 z>;D7(@e2IG?)kv%MhN-O`l*jO@YvdlaXG{nXO2{3+3Y=k5;woLSerd`qjR9ng6$yH z)>DTr=V?pe2neZTFca*K&g2={Ea2td1SA&oOk!C91ilKW;Y?A=A#?*poSEsZRnz1N z2Ff|P`vZ6+GHyk9_&NxNfqp&qgciw4Wu;HmYpnEFpxtXpG0uRl{+@xBm=?mC(3Q2_ z$GYRgKk5O7rbGtdZsFy$wZNIXLUfteD2$qd)9ORwmk2>8{{xA&1#F_sN;_>C`)LLX z1^!WHM-;7SUF93u!9+h7mj4H?fBFBIqNV5k|NYdm`EY0O${|BQJc^Tzo`fPq)?Fhg zC3hTrpx!)+gHgh_O@Q;Lm9IrbL7aNO_FK&9SbD^~FwGs^y{x;k2~(nTzO139Q}R`e z{q)BP`znAZCT{0{c?CJ?()0EqdExn5R|&iruiFV~zh+pzBBHl=e7KWa%hSf2f7|xu zy?sWQojsEUe~sl_*q537ouzK9rDkF$Dv1@V@0q$AC!3>(kF$tAJB~Tgp9+Nd4D!R; zcs6}rmFTth<85!Vn)rXpFEphY1>t(Knw#PX>V#%bZ)~h6aePtT&ZtcFTa)#$AW!c< zfv1GL;Fs0Y5u|29W(?X&&!bFp*QcSDaL*o-Zn&$0H;R+Vp8R&q9(j>4=E155OXSh# z`F^Q>dFQVKrS$x2GcdXK1@TP<^?xq6<ffjsvihe{PjAVj0XoEEgLW=h z@abc|*pH{5s9yl0UCFB_5*UMw2Fp_YE;oH~IgHmcfAKllfQtwkyw}{1KgRv2(${b6 zlbDI2iqgu1*c$ia)$RfW9jTwmfrWg`_Eh%Y?XL@F*pF)K<+MvfRQ9>9MF%63o+8V? zpor^*BLp}K<6aW*@{%#z8iqAwW&dWC$3E!Xx)>~Zo%=Ym^WV=nD)hd^zoxIqq0ewpvAH=G)SB7%viUrhVwn`0Y+Gkd=Yu{V+ zv&YKbD%@kkG&0=0Gu#M!x$UQbY26ffXZ*4ES>GdHp=jJ8>hSb+B6|MC9p-AphrcEv z4R)VIO=AhAj$cpT_;ik^6Lo1U6HFP9k2{M*&Rs=>DPd z!)vEyn)DBBAq_&*%3~y|ZeXzUlw($?sdj#Vs)4HPhkz#wK>@pAH1z25HR59S)DD)T zvf6ot*SM`GN)c>(l#@z|e00k-x_iqyAry-eE#1Nl!^tR@e@GfEn714VPTYNpH}$(- z!jg6j{)W4E+oXAt!hNkVO+bFpAerS3ym$2FPDDC&KYC=M1Cdx-+(ZK=xfHeNp~9&( zcqN0ENlEvW-$$vN$N|gi{uMBZpLjrQcOBsA204FOg^asj`8djOF!5rKvP_lo)~bp! zg=_;t{xUNyiFa=_wCv>?XRBMW_7qM#*RK^2%f%CZn|N=k+(q}wR`%VI@s^y?`nP#Z zcg?ZpD!4^N|1IL@a-NhT2W=?M<7ZLdX?u_X{R1SlI);bHmc${Eo~{N`)6sul?$@`W z)qeKoa5K)t2GG)Okz2#J)lNf!bP%amKT9j9O;+QSsBVj5AusnY3ko0UunwL3B)`f= zs!m8^#asi8cO%AiMX8gh{Qq>*Q0RM;4_I2qbZdHv;K1CB`|5Qn*BFm#R>MKYHe#op zIVRz{x!aKaKEXafSAnyII)j59O6v#jt_dZ~g=KFSko75JSku?Ewykm;R;xcDH@!~{ z$h=MCKCV8WIZwy;m%ZbUXK~2(0!d}P=!<$A-sUQO&5x&{l@5C2I9)_xy6fdP@FjL` zzBz!PDxmw#v8@;Z_R+YIT9vPp=Djj*4%^m00;AG){4stAxG_X`_)^LwUYtoeu43Cb zPuOj99oqM-K+fvpu^418P;q@AFziSBV~RYj?M^ts)#-fQ`Xsb?XY4QADCKo)RK}LI zOJ*Z*8NS-*@3ACE4t2-?z%#`wbF86&JI zANr>x@TBV^-M&52g}(#A!|ESJ5A>E9tg?*>GiNE)_^c#)t^O>jS|~iYed%M2-c&gV z_Ge8VTMSwxR~m5jE8yJ5Ek8V>wo>m%i-W)#BH>p=h<30~cK<(WOoFE=VXmz$Ou)i$ z7KHSuaFh%@rrm$j0%V4ExJBcXh(#}D6OebiOPunsqyHHmvB4sqP{0)<0^?_)E{10ZiH*IGMTF+T=iTP?&hxQ zr-zg;5u?VcV|L!5Bvo#Qqq~U_(cv9>6f05l4Gxc9Rq~?EJ9_ogZ`iOCsR*Qj%X-i$ z68*@BY@LPxIh<96wiR5wPkZ7gnUFu?VLe6Arx*ZZ-j`R`f)#epAPTv&0WlXk9p~fy z!U%KO1~U}`p{M1JU;W>H5!As_fWz~b3GkD~bNOhJ*!M*vVAPe-4qX8GXCdB3w%Ihi z-M~B1_dgR|R`A{r2VKVnS6h|b7Pdt)g%;*XWh1QO?u}P1I>NotjZ=3LhqpU4vISa9 zWT=wSjNW2@k9QARYPNgqOzI7PVW+xV4`I~9?3IJWp5!UL+v}YbZ}VMOg}j*jJpf;K zYxe0fPr3Ac*x9B_B!22$djcaTO14A5>xMAaV{@m(+$gn$Rlvp2N~qB7*i)qvJf_MY z>3tc?wW%r@6bDI-Iw0(S?;7i#M*zHrT13pbr#8q-j{jv3_|T=_LdC^nywlJ3&M>AP zy`c@qz`ym)V=dzHoX6L|!A z2)8wx6ln2b3@RP`fKj~0dBHrPaxvhv2&dYTj$nLAG89_SMRB5D&IT3=R}d}54#q=> zlwl*ZGe?^xxFvc`@45XRMV75`D(%;Ecdi`%Es*0ZMy?Bu|%J5y3OL?;bLoY?uWg0hn>B+ z6#1NR;E48!2|>S0Iuu+C#qnp+Cnua~nE%gR_JoS4q`q{_Aik^a6l-)ZI?I7ofDW{b za0@IcKGadTD{Jlj+nOn_wK1K4=W+|ZszJ;jw-XXcl747VKVDafZr>(o1)s&_sU+nq z6S#YfD#;yqidn0VqF_dLiy!{0xlkeng!jY?y_VVQM=3SM+1q5_`xsutxy5r=6y=Nm zAw~W(UddeZvzpU4;RYIlwJS!Cd(2!8v?mzK|Eg_!jTw&n)|U`b~c2g@&y{4m<@vav+w6)G1pJ?s-3r@e6)>OCedof>4jNOOdOHtT8 z{`QuT@tCir@QDU*N3viT3-`N!ZR@|f&*naFxg29$YUfU5FPEf9(n9I-%!6aRQwqtJ z?iy*ijX%EX7d?UiWFZt+IZAx#LB^#AEO2A_LO(EnV<_#K&B5p{Yn1`@gxqS5#z}~p zYY+W1Z{53S5aYoB1(!hAgb`Wi;GBfm^WR^}pLb)MPl7$U4psUx3cAmONsrmT^`%(X zv#d6Gzow>lM@PVjB8(Ln2#NCC8l1%MX_ldSg60kz!tjyU+s2b`5Yy&C z2Yr;bu3Nlf%AHd0emHvAF+tG!>zQ8rKI@aWCPuA4s!QUJ74Vl&%u}(*sj1bGjf2IP zK_}WY2@5zy`ohbaj_p&V+{bPWc)#2L_yRWh*ll?;TJ<+(f$~B`2xZW9oiMUdzRh(k z7XP;SbH4+%w5jBpx!Ll^1tH3~dFR!uzR-mOG^YJN0E1rI5nJw|Tubc7oI zPIWH4>0^D&;|<|GnMzX^VcH6QIlBXS*q^tyYP}IZ^qF5`5gf)Zu*%A!Eje%{sS(n> z&SMZ85wx47qO|+z)s;@Az{8Y^AD36? z^=geoCvVOv@Zqj`+&>zrS=mc=kR9#HQf}%fw2B$Oe!Kl%4pRYbOeNv^Uo{DL))&yu zuD>#hhaBRmCY+hckiHt9vsxl&tm!>RP)|?T*BO|A`RT%x3xe*9?%+~bJU8C+ue4Ft z()y$3)x^@~p}H}$rvtSR6Tijc;7!Y~NZ??Ob3&QZf9sb$<{eq5HC5=Zd0RdzUs$;j6aq%*pcJwrx z@_7LSS%?Sl6KZVx-@wQ2+^6*aYL+`- zzDDK5mKafzmah)RKa{&JvdeoiOEou$0UJf8S*bEuhRH{S9SDQH!!y!dp4qz9SK z1)vI-Bh4qhbqNo@!dg=qiw3pbi59ceMAx(-zcxv2pr`w@$P(oT<>fSKrpSABnbrX& zx;9dGavzOx6`42UO43T++iv9)7s~?LY5EJsvo%dFl{bh9t3zs*orHjhf z-r(~Nq*!7VG$w50nQL8CrX=3=%}mzSiCINY_u=uf+(@ z9!j`VrYiw_(bR_?xHU0+w#sscydE6W9aGnp7)r)4{;*d+VB?GThdXfq>l42dVT4av zPwk42(Vds(*2s-K@cmMe%sz>ey_>}fl^dG9y^P1Vd5FqU=*o3L!=KM@ncrH{PO4qB zt+09ZK*Ic&M-NOr-rgySp$rynM<}F?G=A^G9Os#D_=z%!iIioi70~#smd3stn}5D0yS9s{PL06qhzPnPw@epDcvIE7C;J;B z3_n@g=*1d~$5{n~Rudnrf_;i))jGUw#UEIZw+0x|QlQMB%?}uw=HINAZDPH$#uk>{ zn})_k!6}|w%Z*YNZkKg?TMY7T3-hnpQchqI`G0=0P08_%1UJi^^U}OHPOGr1%#f9j z#qM9(PxD6w<7@O8SYk0IXJn?EGE;+JBJtkkG0tcGu-1fq$AejK{t$()EZS6=C4^5Q z+5$&#Zxenq0=kqUnU7^s0|V7zGo|B1eLIt=&QV5ZM}XEZ32HDkcn7zI)WQqe0twRW zPCJh9%lS2ns?kY<9J9l(nK)W=sS1sYtW9p&gWTRFMy$v91CpR?=!UNnWD?EN=aYK2 zm$-Pww4d%IRq6ZCJ&wymEsFG^bI~d!lj{}Cj^&YZ4&}&Jf6Rn=_CD5-_{NX8 z*7A=g9)ukcKj9V9#Tr+U=N>hJkjKxg2njHL-Br9$^U&=5+^*z)y{of5e5@ZVpO~I( z>>(<4qK7PuCkb=le`nD-$~VGL+e?Jj5zuA82RoZs69udOsbsCJ=W+iHX5_-QXG`T9 zRfUoIe)%TQO9(cO=L1}$iz^4$^5T@=mxlFWfO0V0qfoX}Ev03lnxf7Swv7 zi($MbHGYsxm%~TYYI28@UVf$EBffThwm?kEF>y$D^mh~>zV6r9034;m?{(-{Ev_XM zbiNnAv|&DsmwDkJR&{@dJ9PA$2EYj)UUlwThWTa5!)-fyZy21vtab=n*Df|9U}9>*9dP8^Wc_C{*^nDb4c z*3siLGd=KUM8xi2IqcdKkyrYK@FqHH)RPiqJc^ANjMs)ixcOCqGdebLsWV!sTt9&i z-lA_bOy(q>Dzw1<2o>)4bQG9!z8OW&!c^c5t=azW?QDYl2+Qpl@dRgM_4ZHbJQB?# zH7zHhMFIVm&iAIB)|7Zs+PuqNNrkr4C&%uqE~}_^%Go5i`7*}Rirz1NCZ^Y}n3-Xf1wd-a3`NwanGUV-IxPX3$*3t7w)-)O+O;=dj$2W8D|n zU9jBtm&NbHXT2x4rIa%&)E`FXMxhgYS2t!Ce$!KtL)Fne$@RbTS?n&+r}6CsP67VR zFv~X9fD3DAzl7IGRNdsER{eLpl&h{R)dG$#7g zR8YBlMip(RbK1!_e=h=Hg((VRKHl;N?upjhN|G$TfP2r%xPQI0m<7TZ@y4G7e!YMd z6^0%OLm{}joK8MYQBFOpMti{rK6Zv?%x>%o%wts?$6@W2Jf`>r_^KIahnrS&Z`1)?rXW-}%HYvSsCgANxByxvyb?a2WxZrU@8d42(zpL5%u z&WG-Dat?T21m8Yy)ls)K-c*l2lP(3pY3PsB`EUOaX20tIznkcDYe=8~_!;^)x<$ge ze``@7p-BWz8Wh|_L>l1aj*jQK+y(ye0Exzs^u%_qgG=-q({@jA$0RK6F8o7BZsAs* z4jKEqxWrsLGGGAfz0q`Jwd_Oc(Y($Ab9ME~nvcvT^!|-~Yy)Z_6cSVKVe+A);-KCT zz^0o=?x$CL)$CrzBKjqOx^}*?+G4Bd_%W~;%ZY=Uoz&1|1<6XMh08qfl`TtN%KkC*5~hn0^T5g`L{~YQSc#bez|E57(tVwKT7l89Ya%m z&bWjnExtuvYgKN>kYCKbT}l7ORzWC=+o|L~q8zcVdvo5uUCke@@P8h5_L0q1pA zX4VXhHk zQ#|^ds)``5k2^o|6KQ@Af~Q6A!YaHnKg+E6%X}nwYqIn|%HArVtu|^CZJ{kz+=@$a zC=}P=?oM%UaEd#$xI4w&-Q9}2J3)#D51JI8eCN#d%s+Rz$<0poyVm>3CkSh z`PvZ<77-eiaK`6o>+mS8i-mQwxnr&(wgiSbzjwr9G;6g57?0!$Z}!Y=Q2<+4rD&0c zWQRLES2|FekZM~2 zh<#$gUbXT3`#uS1n>MrHmQOQlfRiInv-v}QA9S}4gWlt0KzXQDZ^6Kd2gO+$mnEY; zhWZDyB@fjS@{SG=;dtsDIgZ|VMKqExv~&41Z6y4;73+7$^V{n^s9s+r%rDmja?;HG z;=gl3_c7?6eWm;BbEvRQaI87SH)g%WF=pHu%i_i?VIGX6GG`=nFJT~C9pTIC*)y=t zQrCSOsm8pfcLqEGoA2b%)iN~HGCcp~kcaY}fDA^~q#Rr4zy-Eb0T zr0U?{JM3gh^f2UK)Qk~t7z01ViWYWPp4414=+bdA`yEbzx0^>M!|seh*?t#3OJ%If zgJ<|^Za14gP+?F_H&ht-yj%!`>-|PV9=nt)h5p$QN9!phuk`L@9{%p5U1osvope5B z_#XRGNa3aMOQk6gNGc+e?LLFO9|TT)Ej&?v%LnXq3XI1dtXZ5|Yf)VFq`oAE@^oD@ zruG+5Y)UQ84LxOV4(lnP4h26tIi$<6QSf&bBsz3W?>S{P)bRQJ?q2sl_2_}828!I! zzrexbbNq}Ru`koG-QorKEotvg2QFImI)>A#v=tAR`%G0*lMX&oqyt?#MOXuSvR-gF zJcBV{+RfyZKv|Fk-jmR#h~Yx_lk}sQ$W65hef9>U~ksAyud05#5h z?&?0q7mYbblYm%s=bx$oi{+ndVV7^Wv|i<`;b7n%l)pE|Bw&QCc*t-kDtk+!Zz@tl8sZ+^@% zlT^&9`2PN7rA2GKGZX0ucUCGKRP;r*R1w)kPsYyfe8J>v{@&5Mc2|UkwJX{j@X%3* zgKfUfmp)t9)G>O(N7Jb%?GJ&y*l$1H(!%$}UJ7g*lE1;K3%#isk~VP`y85(#-uXdGZ&$c0L?KN(Nvf~!A!p@`9Etef|pMV%02 z1+0=>W=*3FofI~egW%4aKLTvD>tfF&Hl#Y1@86}v)4p!X##SO@bcyM-t415er6lz8 za->)m$>x|p5RI+@J6e8|rxtrjOzS{DGib1HNIes_8!j=GE*wVwu}hj9oGzxO9yecK zU)~RUe9VG)#xY_n7}AMm8SnFWKfq;Qxev%70YaVT{;jpcm-N9d3_BICGdMow{gmnG zxC8km&l%|@-V~PCe0akkSQ>%ftsaM}rV@$A`q;@@OLd>z`w7@p%Aa;5oQB&}e4Co= z7Y8$BHe97sGN+2PSNT!QgwrYVNXhAY-6)cu=>JI43*Q!A$Bdsb;hGgr3QL5)Xppbg zKguW0JLVUBOsOm_@^Y)EuN;-!A~sjbO=lD+NKFD#O#C3wHa6lfvzZwgu^=0+YH!*+ zAyoE>?6~rJ;Wv@eybfE3J==RcjwTdrKvhf28Pl9YQ8k5sEsu5^MNr9So_SZWrW@}>P$YahLx#y# z@M;r9e5kr*(4lRaeZ4u&A2`n_gejE;M$a(WNzAG^FJu0jRmp_P^b$Ko088x@5UIE) zIb(Pox@dokEw%avWk_whP5ACAZa##pKz}9uS|Hsc69jmaHYFGBvw(Y3 zSQZm0myEXk%4D?4=guG2T57SNTKGOCcqFv~oCOT|6xqp|DzBCL9+UW6?Zfn{!;94oIqzHG?*UuIJC#;3Uzj^Wj2P38^auoLTeP|u zNz2@r-BT4sH_4>bLfq1UBNWXquCn|gr{%j|hFaU8EB}i228I(h9LUK@W}lHUDa3D+ zD`BKlI!=Q=##xoq*wh2$*aFnRBYS>6(KRo8h;5U2tCpUA$6UFs3#;r&H`wh()s^d_ zWcD7ue3Q711I|8;gykI^cd$q|rR_l*C+Z zN-llXufT549c0Rl9xymB^w9l!@t-s}0fjpd#Qk}HQ&-*EWiWkv^TT_T!T68$(^?|L z8WBb*8MjO66wX+xC4kSykS0sm&%01vDCDq7Tf@8i&**1&!?w-tUl_F zo92+(P&rERQk7v1sH@sNDB&H%>k`6az@ zI{t0%(cXb`Yz$dO3Eguu66|Z^{mJRri$!s*bN!ZwnRvrrf}x#jIOBuN89~>^Z*VgZ z@{J)}RdOPr~4e+D+&t zya}zl>V6h|fW7r@FRl)_q2hlr^3TKEkdQdIs*e_h?7ewg*-6n!2bSRW%w?Tw_Hq0d zYG@4;r;qTcfPgf%CU>4+&a5~F@BMgTm4N{Huy%xdRMGRhzWB_h%K4Y- zAFhr&Rr!)1tmp4uq=;zI8Sqotay3@EoWUTtr6>DGuc6S)VCwek(tptc0e8kvaK`)r z=6{&PH1$C2Qx5Qn0G~K^|GD|W(KEQDGT4GM{);uq9m{RmL(0<$6kj%KpBTNbBd{{g z#}Q%E&@;L*`L(wsttpBU&+d$*g~^Id3vAvQz5Xb|vCKo$imHAu`@RNE~M2BY!dJmPe10SdV32me0H;*^{$w(yR={xBj zrP=FQ-PnX$-I<1VYWzL&fpa7a;j8NIfYYY+>BRKKHbL)vP*BK3h)^b z-Rc?nPdWrlV56xcM8z7IwO}=9D~)TPI6`@CA>_~YvqeJkcDnPwtHem|BizFL92M~B z2p@{m0BD1-%kH~Y6t4$t@_scMSCV?#p=Foy^bcz+4M@yy?E{3c^{j1m%p9=z z`w$s+q8mVFKQmuQE8FEVW>oXDQB>xs)^ls(0WsEtAwMYNS>Wa5~2WY>jGz# z@43rN-Lwx>jlA{TtK@hH;DDRYf`z?F%;ENTn4r|_7$f!S9Q~r!dhEv8!B4GN_b2eh zHLUv;a&hHd*YZw}^-S3|j;TXgjo@GdRRATq7Vp%Xe`${vR~%2E6(vKheJVIYSk|C^ zZpMr5gAmjwvX0f9#19?uIN>I)vdOXM79K+N@LcN;hjfKs@BgclKtk$LR)n>}A01F; z!4@>@*1*H|>yXktA)ZNJbmyR*ZrHGQ%yrDSMEgN6xT5Ruei9 z-~!tUgZDSZ#Hz~&^sYgPbhq2VT@MCp8&>czx^#SKJl)CqsKilii~dx5X)530Z_$_7 zCy`Iv_$SeW#ZLcZZQQLZSAI{s9iDH1#jb;%?S@gQRTpj}r;VtrKDpW~f#E~)XS=Ii zi1&RstD#xOjRKpoj`ePvZ83hNXE5i4Q5Z}ZsSZdS+LJ>)H_pDbu+cpt;E^l{Cps?d zuD6b^1#0(jXW3=y>@DJ=3;CpC4jpz#`&dK>k3> zay8l3!g(Aa{L$AJLsHG#$>Ubt*H_c@yefP?y|QMpPStB)09O%bcM9SfP0;qbyeYVL z=j*7pPjAZGi*HW0r+7d%{B|V#E%=?(L&TeqQ@@fd9Tn-i;<^AbioYA$2{mX;6Nw$q z?>Bk)9{sLA&%odNDck=}&2Igb_~jOBC2Z>DQ+ARYi;sKZOA#*Ntyj7vS2$_K4}N?QiKSg&|Mnb@*azCWx>28ur9I$( zf1AEf(UE9JXuruA|5NQl4f0(0SV!O}v){To&Srmjux5ErQSr$;M5i=BMp zd`M(`G%I_J+TabUZubRIj+ge{s>FqEGHZB(_KTJX>lPs+@J08THsdPEW$QR){NcE2 zPDT!%v=7ky0^=`0gJd)Zr%p>P$&7#RJ>WjK%FVBEId8a-r+6>_0`1OaZ?x{h_Z6u+ zp$zznB3b%>-G%=DeaZKT7Asp=HR3F7OXg?PqSt70*C0>V-u&GkHyr@8_h>0j8{cz6`R?#e|!AzCj@p%R(E}(EPp1w`85c?=$rT zefmLz({h&j4KhzuZoZ8JDf%jg`St z&rqkD)_ zLX(|D{y#pv5?L>aHJZ}VBeZpxZVCa((0XcO*2u1i-gN>Wl7(ZdL-`{T=?=#47NVUI-{DnX~$ zB!+UvHFP1B&bbLB8U|{M67sbb8F<+d6NKSiV4Wn*?hNB9`G3>fy<^FZt?Du>UU1pa zIV~y@r>-Be-yXg6{#{U_lt1&6`Yp}`x$9%AF-aL$t??RsbJDOC3MKbR25{-HvagkU zc&9&lrB3ki&q|j1w+8V51$P!njRkYB9|Xv+vWSVK`=E7srrPsCO3*|==Le?u2GJok z9uD?e#rM$8TKEA-@f;yC4zvC7d;!?!fSkJ+MMc%=a7c_0wir?;$F$*9#4C*_X&>;o zBX^i3MQxVL0_nPCFX)@TvMQh&X3D)1=j@0#t2Z&uHK*yDoua(0GEI9ILw715;wTYLJ(-fgBNEURoXacCZD^y~hM2Bn)k~NMGXrq?b zxgT*X)J<3W4snC5oL<%$%zM!b4vBGJc*r;40Ye$mO&yb4TN5{SH-i!FTTveMlMwxE zYrT-YbUnWPvyE>nGUm(1E@=?7O`a1$vGnt<$wxQ+uGDzHKvG>UQO7TNz0?EKn_Voycna_{sdF7*v3oNp^h#Q1Y`+`Jb@2-kx ziLRqxul@@AEMtn<*~^&gMN!Oaq;heewYx!oh;&Zh_@94DHTfyL%6R_>!fcN*>aHDu z#sGR|y1zI)R-?Gegxy(1KA_WeDCvDtv<0sUuM;%kL)hb73(trdhCOwmN+!aMN#7q|pftwrvRbK(D` z?dNqzIKw?|-E#GENtkwayQ|X!x2mU$S*~yI-2#`}j5B5n(`O&PVt*YvGBK`A7wpV( zuSa)IngrHUd~J;sk7JQ)al`B!?E2FxuS3wmmPpsSa!8Q6^JoloUQz)-XNP`N zg&%a}g6;}?OZ+p9cOSS#6C-V=XU5lE@+y+Ua>$OwAEtFMaGMEq$`0?+$&4O!bx5`O zZWb$I>A#+yP4U+`$0Z5j-H605+UwZ%mJQteoi zI{5@xdfZv@8Sv`^!nW>@v#HOy7-gfJ-nVL7GuvT`d^lDiX{Py~YDcxlpyJYS;Z5i1Z#f5m^z=izWFapoj zoH#9oKO1vg*D*^6u*FN8ybEM16+Zv^3v>6*sP$zAm6Vg@yQ>;?y@rp46e>S|(WQPE zkgu2)2ca}`A z6=*#C1H}?vS%S3&($kqyYT3LY5J4Jk#Ww?$n!Se1#tfR6*w(0Fo)6N$!$R7^K$fg2 zNS>^`i`KzrqPug`+r06PAqbY3Zjt0G%_)y1yqW5j}g8^$M3RUAa2E7XBNo$0ykin^e&LrE=z)Xmk*LBTo_C6$IMc{K` zpqgFpeHAiQEbw4*xTctP>L{oqx0|N9(CbnvC!pPH(OXDYPX1-aUK@x(sF|9+gMzpA ztW{A95T@C+)aCS#rT&145umf(R&%4sOjg@M8j+!7PMJTyP=DUeQiL&9xMEvQ!}jtZ z0&fhYc-n$E`Cpbz?L0FZofQx!8W|S@ey+@ZqRHdH#r#Y~AxGv)G{h<0CEe=rmmPt3 z?VcyVz2nKJGLzVvR^%!+izTa*qy!k?fOG zC8f%*W#{No)&epu7s-+9@AyMxX07_YT8RY?y^yvRr9N;F)U2gaGol9e7#mS3jjq!g z%}`q5hiDN~pQ{A~By~>_|MNfpM-6-r$=(_KHXy2EwcA5DUB6&QE7%WMDBewiCWK!Ll1FKL#iS;$kFAzmJm5pcS$|a@!RgIgXU^*(^pdnuONm8;L*osp3U?LT}uji@j2uL&837 zZkg0Jw8ITJ^!H(>j{kY{dmrcBQVtJ19O3tu+-DT>)KcXd`1#$s?G5)@$Feob=uKSB zw^n}U`K3h3{sgOpk0cXPgm0|g(??P2bG#@U!9$Tph|h~g4w>}nGg;WlQIl=m1r z=5$+x`J4r=+abpw1f$$1bF*;Ya@*~`bDQC~iX7bjw2-7&i>BTtYvp}!_qx?5D(HX=E?BxWRiX9ao4G8r-C=a4gggI5cF1*6@d^<}T7zjq)W5 zMfPv7^#AVL;QMqV1>TM*fnPTcBZrP5vv8q)oS ztX`}F9-mKG^YJ|(vr|Jc)h~PgBKs{S*}I#3YRY5oyO{~egI;yI+dE1k-eJ#Q=c{j0 z&gzrkk-P{)>d6K3jmzE>+vk`=d!)BkRDtd$MGr% zjHLGl4ue@?J|>P(Scq``|K@**qSX{|+w5Ni@qLFtd zLaXpqVrY+EbDgxQ@_@B<$fCbxR3q;4-|Kicf#1uTc~i+R<>a4#-QPH0Y`)!w9Fm`| zdbD_M-%axvw`$ou^ACNRVDDCscOxk~GC}PaP(8KQt&QVNKT?ftgLC?P_O1GxwvyAA zI=v`rO2?~%J@KQL?cggcb8-uLBxee@=;!`E@d$Dk-HAp zt3tRytMc`B1wNNV9#3Df;gbBP#{UG}slC^JhSGRGmTz4K_&c$)Y4q%X5*nPC?rl#u zM0@gwwh??j@#fH3%tI6U$Tr)bQ+92Np1tAe(Xi`9Uc=&IMJ-;AP)_=H0Q`0)t6c&;}BVUz=^Dq^8vt^7WThBBNV99pJ2E%SRFPa>v9^WXTVa6)Z3J75c$ zhJ z4E{wS_6@gEoM#=J$ge*042chL*H%&AcBhpB8mf4qx<1*>`V$ zju@|t3|m`N{VG}>6t?5wp4K+u)V}+z;J^atP4J7k&1}#*2Nt+PTZC(BAbJ%li++~y zmSc%N$uOY+ALF81p-i?cx8;0rIi>ubqZth|>W}(=*qD$FVPf)wuTm+hc-$-A7IasWxDi7SdZt$u_l)~p15$1h zfO~Q4rFp%Bh3Kfl+1bE>q<@;uUwT^0AO4}|7RSJ&=z4NcC4hM97c6O`Tz#dI+iG@z z!+qL>2<~?o033_<+f>ToUv6CNL6O&E+uTJgIO78mzY^5MkK-6zv)OQBmB`)mW)p(& zHL21kAMSsJq{s^P*fLQc1+@On3DDUsSSk!Xz1+~+uca3jHT(ofr8;FcHu{htvtd5SUs{Nvt87v=JRAeaD|UgXxc`HQ!;Y3BPY382y&tfSTC00AxAK_NXo6dflaX z@e>ct3JY#$p?!xdo5M_$D@LN`@Az-a zNS}v8gFiY&mWZdzyVicB0#5!>MCm^%{)Fj8{qJD3!o##E(##}Ri{!`pRobJ4kbo$D z#SQ{BWsHmlWy3FEPyNV2n#{k*padgaZ!(9n6t9ca6#Tp}t#EF^Gdt7Z$mdng|CG@w z9v7E>Bhh>g2%LcJ!+7kd8{)W)!GHdqnNFKX$UYp>fTZLA$0pZIp?jJz;rmsM|857L z#PtvEh1bRP`ot#m&NYHYYs9cKvsoY1W%L@a&Jsitk_b6N-)GyO2yPB5rvZ4k8KkPwR*J-E?mq{F;|ahiY^fsdBUG@&kot6vz+{ z$AAHF_3Fh-=4-l3_N61e4gnm%UB{oK+H+q(0mFQHui#lT4=S$%Gfo+45=laBZtzNH z);9o$&_fN=JiMM&4D9m$SfXbg&3+TU{2#@BT927xD%cnGbps|!;c6!eemR(c&+jJ5 z#aE9mrIGO&cRVG-%CPK;v7xF2*g${5N=vnqd)}-|4>VO0YwG-}vsq4@jFoV49d_e= z-nsSyG!kjq&c5lIB|0;zR;@Dnonr~$Cu^;L3kDAnclwAOWg+!xj*gXFIO_4UMsB7e z7S;M`3sfd0vJ0{nA6I#LKUVk8id0OQg9v435TDK#l$bh#$S~#?>5e{Tzq2F{|;hR695!lVoC3E2K0gz8qG9kt-20KyfRxaXd z?N1Mbnt*z(k34|-sSqO{m2AJMl*|l-GC`+9&;rQc`-F3+hulYN8zG)yelhC*wbdSv zx`1Zqftw_2KNU+LVpp@dPK3m$qUM-UJ?=fei&G}R&?(lH$R9GWY)R4X6gDGtHt*{ z+l*sJ6%(A=j;Ty}Yh1Lv8G2*Af#Gc@l$FTn@a>%o8w>D#!Jd}eV5p`kv8fKPYuk!f zaL%`*%Qmmmi_py;t4<>YkR|;xAD*4?fp;v_D>~x4eX)=-G%s_CoaD2`^?>~gsY$o2 zsfLjsOdz1gO`>=$1mJVQ62{9Pa7_cx0%-4Bxz%nL!tU2EDw4RdBouH}V)l(xFzKfwNy-c0kHnp|LKT7|b_CX}4 z*YRjWzkpo(LF8rIKli=AkdhMtG@_gF%$I0%>TBY7Dw{< z1QU+}v9U|oj_R>NOIFPrN}c-MM=T|ZwG=+xh6a;PVrze8T3wFR$o?J)a7YB@gHY); z?bxN$l0sQe-s;=;8&X1EY5X|%C`Fi`=5&lxL zz23bBhlfAVyU9uwgu~fraXZ=E@U5mhT~ijbF(;#ycD?R7;`@&7*F_+9wBO=;-VlWplOWwXDa^ z5hU&R=PrTbA-OiHa^9QzhDO?Q!Y>>)dpE%levsrk@GS-&^n~JabSL^{Q;XcGO_FD!OXI$&#YiXp*Y< zW7$xE>b7jOoCVGMhf3I*Ana3Iv$_3N5RZVta)@OO5Y2Cn#$M3K=lOlWODySM@Cr}U zm)k|A6(D)&U-8sapFea0=s%_(?;Lyc=AQ-v`oXUO$1~5gixOt8a-T#Tl8)b*+Q(d; zD4}@7sjdTpjqPZskyRXG_pnT)qhp^bJ4d3)yzg>D&<6Eg95Y15f<-RBcl#*Zm zFzlCu;L|Z#x$=$veBHmc$yxI;ECKke$MnFd4gST&8Miv03-vmQQzSjm)1BV@0rwZX z9nUN@3>lDJSny6{F>J=WrMOGI65RP=^Pl>1S0^yI%d7Re62Y9-H4cotIT^nQnzh87 zq#gkbY>kaks=txb`o+UE5at;F2a2NqKqU%qINyf(O};|hbZes1Pwjw0`Eb}V;W@Fa zC->a_n5KD~Z;36#TgZyZF=U;bJ)t%9TDlYq@t=Oavy~%lrKhBY=Z^Gl44dOoByXlK zagN9C65ZCuE_;=OMXSH*mWsTwCJH9Y?v7*2Pm1lr$NrtGHRRA4qKQccB^1fNWVu>_xEYn@@Q)v}Q6js|3ik&Y*_@#*ele+HUE&Qxf zar9NCcXR;>|Gh@gaKk7wx6(P6@_uqd&GHjx7Y#`p>yo)y9UA1@QOY~=ymHSmjMdDe z+~@4qROLpexLW(mW}+@#47{bEy}752GC=FecDZ3#rt*#$%ODka%FFhfoc9L(hb4(o zWkJLe-mEn6qf|_bd$|QvIjswG4L*(;d7qn*J6SNopinCV|o+pY!yVxfC>_u~4)f4t^5$@j5@N1H%ZAnY+E*lZ=g*jMNld z^60UK4;C*`sa=G>U-0Us5^!fs?5Q1}kQW0N37f~a(#~TYbOZ`0dDVuZ7V}$Vu|rDm zhjQ-3o2JF;pJ0m1bp&w(F5nVnVi;5-p{eEnit61|EGIT_$JxGRZK zP^C<27QbTa!5`g#*_%U${6c&^xhlBde3kN3YD59^-=4g_X6hVRrAvp>h2sxDVsxdR z-NX(_P9@F+c3g8|ATANxJbf$&kA-8urCw-|VWhhz4XrMP$={L)_T}L4usf>0e|Wp{ zM2$Vicdmwmoi2`HkKVAKE5$o$Zl*X+8QKypX&tjR)rmdUJk=0O|Dtke)0c+)l#*$P zPyK|gPH*W#tv?O6*#+mk^-?$^g!?!Bg0O~1>ycc12&C$( zRi;>Hjed)(Ci_J;HH!616qlOkhcs)FH0vp)q*tYvyw;u(S*Bw@=;N%xCQ38xmPgx_ zSaU4}%ijw|?AwVAXRMlswl*x%&z$pM;iXRcxa5q)=0xMi5SqUw69}XdBC<)GvKZXH z)8{z+A^5cQD~2?oX8Vv}=DD49hPj?i!E-8Z=YC7tuXOkyp1v{k6KEFXadn*Z?(W|r zy@(vVT&uQg!1A=ddc_8%S)uXtSA7;2ehK3is$(N__OJ~1il3Jn5wA@O))zB8FqSu&;W~(B24{K z2ywEX-205c{Z-pr0U2eO###2?g}>A}w=a;9d!P8uW&gh2VFGHT+`Ob`pQ^TySpkf2 z1OH_$9^0gSnD|GoJnefVo*{)osRHZ@FdO(fi90oKCG%*LIlGtK`Tb)XSR^a1n?alU zUD*JG3j%?%aKc@8y((X>^!+CP+2Vq532c_N%3!me_mp&PD=9U^F?!4xx^-LkS-Q34 zyVTv~6}zvUO`G<8eNt(hwMj1fDS^iePuy$vRH*<3n>jhsHzYI(#~l8NCP+*ST;|~Y zj81n+g91fr;0^mi$Q?bBI6EPZoAcA5v8fK;K61kswZ67lZNKtJiCpt{y=hFq-6br- z_lEw~TN5E+)dp259H#0uY}x6PJMm(5+9ba)ObkeFX0r4#b&OkC8N>1^X9T+)^tG^V zyiK)!<3kl?*U6B>Ze#{-ld1U&>tiB{Z21Az>7QAvBOUTfPhantkqKwq76R8HJXa&!@Ow6R zUjY2#e1*>nVtd(`aiaL!rIj#FU#Ec70Z0m6edGSf`YR7=0;4On&QiBt&x=3bz88kU zgGfMkc+|Fp38Xx(pky_q-0KZZYVy@4r&OQw+oI1eH!7P0(iqdkIPI7-=!~{y=fpQE z44rC;yU)f+&t|8Kk!3bZBBgi2aoqllfNd!wcrDMLchki76wd7)H*=V1E3;L%aoz4R zJ>b%mhqd8`SH*#tj2)pkC|9$-e|OJ=-eo-XGAkqpm{?psf-rX+l>Gk!Bf-Cbn4Bou z!(cdrbVK|YGb%8js9;;MG1~FAr^d5nxwour3%NR<=gP4LHpJriu~l}rJN7XgnBuL` ze)3-9(9=i5D~}Pz_UQh7()$Y4*|6SFhCn6ANVl}+v(FSNIuYP#HQ!DFvb zpEt+Oo?GZKS;BEyt*O~#cHCMA)z&K_Wn0Cc3)alIHB(wkx>>cL z_F1hnZe-uT7IiuPn(?P!_si{IIbF~W>-F?PB?|8*q;Yt3g~!|mFTZ(^M0~L88OnXV zP30qp*&4qV$aD5GIIXQ^TFPg+2R=e~h&Jti<(YcQ$3fQ+1!w-c3E|Ipmwx|!+TO;| z))6*Qk2q6!mt^l-3!zUgDhrHEypz4C1xYe!s1JAYuHtsRojKB+FFQr|AjArw_B>_K z)3B?>jL-sv75wDSz~|``4OOulCQA)vwud}o$IGjs)^ZLE$qC(+YCuEB>7E!T)Ny!! zPEg7I zGYNKv?nbf4<0==<1+cKC@>UE3Zod4-TU>d;6;vI4InInn0&^x6kd?pN!p})(hVCzX z;8wpI;{P&uqPF3pJx4z=hC z+U-|24vDlL)z6^|VX+6^Rz?iTo^JFWUhj#ges}8B$M6eWHp7=QH%~>DX_#i>9XGVY zz-VU%(bGwI)eLhn2Hgl|*~QB1wthsOWc21&z5;#P_iKSNMTzKKuH^?QWVSK^KbU<9 zJHY9fWu>;y4={GyQ5We(sl?ao^Pe*I=w3k)p7@fv(pCjBIJ|GUa7ovhACyBQuN6lK z)Ui&`IsfyajHX{i%55tA{7I6v~>8>GM4T2MGAySYoDKwqAQL#F^trPKJ%uyRp>Nu($Q@=&q{Gt zF4CEr>y5b%4k#zlTLB0OaanL9I+pp|5_jlr2G?51;z+r}*Tg#S^D(f4xTl_S zke@yRu2sBtdAEVM7_U$u1`NUv5WxFgbGoEm}J>V{J4M!Eo@K^=} zvj1wBGOxOO(4$Wgf0pvW&r=x^eP^fKUcFpL@FQT%U$!h*JU$QuPk$r`E+(^#yf>r? zNdZrH!x@=Hd$?OnvF&1tXWfFyO-5f%<~vV9Ht5YGb+XnGI{gel9v;bG!(Qxio<=9( zuIKzh-_o{fNhxZA-c5hYs#*ruOZz88ARGI7;oiMd(v`JE4Y6LWn7%HEeJ>Sf8pn1j z^}UF!|Hax|_@gMZ?Hj?neh;Jn0sv~B>{AZSx$kjZi{}0&!tj)F&nBP82EeY?orNF{4G^gV`k%cUk&fTLy3u1g+ z36ZhS-UWAxG($fyw(-2aqaO;MaJXsF zu>LcFQ%PIO8n~ii?6}%kb$hb*YlO|mCd>92pAm+GZZm`eEz@{n9|gsIJ%0bda4xsD zAV0g%m+U|W8>xM`8+i0VX_~L24!3oR>#I6$$}qVL%Gt%oQ??Xu%pW)FS{Hl3HS%PD zU***Ey6{+T&>VWocOm@DU8|X$Ng#(r)l}^U(%LcKSR%|bvASQ*lp{9etq>3!a<&QSToj*1}j%zgzX7fW-oh^^6TY5GM9&4(lg0PZ_!(|5y)8C=?S$X0 zXII`&l!{-yO%cC96&EdiOO5pvKZ4x>wu6#m>1$sjODkS{sYQNExvwGF64o@EHjG=d z(lz%|EHTJPHlyF3_tiB_6z#%s10Iu=jdaG}OcSe!-4)>+N0_bWfm%?eNkdP?7XeHq zc9nibIcA#((WbIhFl#k02Yj@g#Ml8eqUq@*yUx{yM>uS-Asv`SLe-@bRj!0^IHG># z%HvtS>D?i=?tN!&GJV+~>}Qq|9z4~5WWliufFJIa1?@}2(?!a;M;TXp!u)Dj@FTiil z60T5b^N$o!X@os2pJx22>*zQ7MZY{W5GOJNFA9R6zJOhJSX{vK1e{zym|D?XH;Myn z;CQyQhU9%{&`clg`icVBJx3-Be~7p#i$_IWTtP_sOMO+BRFeL)jEb;z{Yy#_TDBm0 z-J?tcWOZ!v$95mRB$f7ZTcYW;(o z!$&{8Pu?!JsVEW+?%_rbKS}39T1$`q47M55bbM#p`o%FE@{X^0!n`RYO_S&d6|m@N ziA_WA*(&|vi?r7W6Yi&T=HzU4F#Zr7cGG#&NYI*K3$^# zb%IQ1OfGVpiTC|do-Ib?4?CV;^i|Xx&e`C=y{&>Hl zT85(%g{XAqS&9`stIwrNKI(wct7Z^t#`==!W(BDH*Ov&thi63@d`2uR18msgoZFm! zT$=KEDr%+AFGr@SW>lzFGSYcyE9Lf~0k9DKR!Q<$)xoodkMsm^Ms&fD4(R&fG#U^~ zVbkN=`holTEWpr6ugfdAn6c86?@*#p=DP9x20(2w-D(h>Lq?K{qpf_0>dt#;ZjnBB-o!)h+Z@o9{F3#^)o`8KE?Xsi@$(IU{F~ z{INvXFZ1IF;s_FruCRBzN~4Um+u1AWqoq>1mD_pnwC0@FpXt{uiSYmHw8vQq)uXH@eb#cfR2t zh-X0L2%LG;)J=j3l%WQm7j&+OxF9WDgrFmGx6xm(HqhwOW2H#EX7Px=>q8lsj%wvg zJ(%eQ_=-qFEkk1^*-gxZ5OQ&2Y|1L9F6vMCk)pjs^}5sI5D4a+FIuQp+AHAJaRZjQ z;a?z?vSiic>-tKOf;Ri`HdLr(1Uu(7s1b7_HOp>+AP_Qz|` zRUe#-tT1^MwmRh;%R{R1aW@45^t~=pYW6=R2u9-KN`3zI@V!^!bk^_>p1y>Dq@CJ_ zK+cbCMH&UoQEOW{A@O9svA@NTE7;|_!uYk*A$; zfR!nW&6=%e*DF=S_-(sgfmwBh>{JbzE!c!lhmPk3L|jdHXZ_jKNs&3vWI6jP{?Igt z_;R}udJ{##ppkYLq|mUBT>aE zu)Wv+V1mDo-cHsxtPX9zl)n6ojKoWnEh}A7MD7Vf7N+SVb^r}A0mO&duf8r*s^R;xwh^5ZF?GEtu#EgMp(ib!haaz~;R7$o7E`zw|*=08!+ zI_=)!v~2i=v8j#z(x15gf_KF(4JUVD3~GRjrho=oZrn#swc95E=nzWZWeDHZdAA%Y zm))=@%_P@~j|i zs$V_4YaN@bu%(Vk3_*kAW(hUE-YyvWqijKXrh`RUO%DfB#|z}97wbw-t)m9r(|MNJ zq5s)u`(sYoVTUibvNRoXQ6B;*RKT6|gZC7MKl)w0~g|hw>r>5MZm>L4?`F zPZz}XUX4YRk<4NzHG`z|dQTur_V;IQ-uI;69vx4VDzzz z1DP^jUXR+ntnUT5m9m<)xiM0}@dCim^OWt2#cTch?$@^&zso?C$(53-vGsBxs)U)} zI32%N&E;HQWNJzlvJ;XhOK0L=DAU||gG?fXLhWc@&WrfkV6Y^Xa@;KGUnEPPbY0aJ z&u)ykBlwyaAV>j2jq721O#*Kz8VNR?%930gU4+*K=#vnx0~Nr1oAAH=2Op?tuYZ~% zPc5T%IpwK)(8b2Owgc2RKvadt5dW`O3>Wp@2$5)p#ADQ@(GIdO8_S7%DAHUoog@!%1a`Ke!G*2Vuhqp&8 z=k-(@_SeI=Nj$7B%>>=ZP$UH!c10}rrJ|Q z*0z3|s?m(2^6}R&hlRt&)JndellaEMX5L+Eu?7xf7=Ufw-lJ+fy=HM7M)-yyI7fyBR;<+9^5e7fhe*Ste&g6|;IO*5khM-b} zJ|_#2iZ;cP_s#R0*{y_18Ai@IOgV!U< z94>-`wIV1!SUSIXo=B_*8@!Yo=}!CUyWAuB!9yfpJxym}r5wuLV$%R)BZdibj`J}SVUx%{z(FDDmRGx!zBQ@<8+no{c8>5Bu z6S6#0bA-YDPF{TAK|S2!U@pe0S*#Gi8ll0hc6NgU>`2M~;1`sjqprRgBy;B|HoFzG z-P&#MDfVE$RCj(~bDiMWiEh8G3%1)L6I>0v@M}S6B#Lg$$>emoe_%&wcGtGRLXzsY z?yKBqroGK51AiSE2pCB_Y`1qs@If?JVQQ2%YjiWXpL8SXBNFl_GE19Utstz;>>Kt3 z&yQ;%pMCLlA`(1;ObM_(9cEUZHm+AU#sUs(+U!Ynm29_*YOqo;=u7XCRdNHaJCdRU<7#hlD>%g5zce`Fn@_F4Cgpzd+IRmFtZX(|9yN3P|1KERh&jN}f zcbJPlJA$^GhaY! z|N0(<a{SztmXbDyKP&DK(c(&(?OL< z(irlNpdQifmeqGkQzP3#(F}&H#^YUTU5;2ma770K1YJpYcfb8pjDCB4hGr!pNleTx zO~JNav@zGo6eH?N9n;ryi$C7c$t+w_Xo=e#6(W7N(j$q8_JL(p1EVrmB!E8nnHPET zDH=5(M&E5UKhXu+3-e$l?bAwwa5Jr!z^)*%hpj*H8=Q`E_-}?ph=q|T*HM1k*hKxM zK}yImZeJ6D>OZf%AhajZ6!D?C-s@zxZbiK>+DDCwj7Xt35Wh7fdyIqxJFldW8SnMx zr~$&ig8|9CH8V1!m9c2)das*)<4|r`pZTj{N;$k=mgH7Eg%kXQExi*>q1v)`TfUjR z+~agMCDUh?>3aDU8Iv9@(DQ+_=%!k>{A07CVO>Po(f0v`ZXTl9$DiI6n~q~Dq9dIY zo!DCbFJ;p1cuL8M=2mb(oqo~DXh5N<6guShI^=#FpH5n=Bd|&hA}pY=2w7Jx=HyTWgiIG5>F#_L zX;X7BplQr*^VEL;ALbhGrn2el?rdp?PgV39CNz9r4G^hz8)8$o#~WO9J3kddbXH(! zi|N6;$WR@4rn!yq;;ucMb$WynpV4(2j1USfDxYGq3~g;N&0s3sD*gi011Q-d1Q^)^$OGs{oG6z#F0X%TvzC$=-?hBBfNP{_6=@4Oj$|jI zwB8HNl>Az@2pQ_SwkYYv6F_7y$gD?+yTaC$+um{%ZSuC2yYHX*`kUN7=I|3nzgf3c zi5;&7eR%ZbwlWoYv#c;?p=fe9m6kOYm>g|t4uTmPE?UDENXpe-aq5e`qhac)A zV1D<{WrK}dFW>&`X$Y$286c#+>Q8I`p;RpcOxyV$sq?ObLQZc&ejsvqpQv7}&qv=K zw)TChUpPHI#ZN6|94SlydZmuDQH4aaILGO97hy>yo8&->u@PrNl=Vz&VArBbwB(`BWhxn?ef_n^&&V%LqvmaN&{uBl4{kK%3?5>+13p^%!R6Al zF{OT(1Lz}a<-^`3R_P9UO~J(4iM!D!YCQdX)*1s73oA^c#te^U=~vXmf#lcU*c0j7 zdW)dH%3MbhL@qyH@W$V?O0%(k?dtpV>{h2-r0(qER%Z$N>5UrqMZM6NG|+_T(MFQtz_>rnh8LNH#M`ijb}2;u^$_3i-KYK zi*J3s>{5#fXn(bkxRw1wr(tTZ6dwXQ@9{e1pWs|_O3`%}kNzDd&K;?{iM*nYxITXa zk16-~Fcol-QX5308HSuT7ycqAlRq}wBwgf6Xzf8p`e4nWbeolFYt2g6>!*G2J+Y7A zZeAP^J%8MJE*>qLAer<&3X;S_EoL$O{5-j;o24&Byw(#G3a*%R$Pai#6zsVoLGh>2 zc!c596nnwfF`G>1omrWxAK_G|2@6E&S8>&+>n~&bvlYCC<3SzmlSiG;r8Bb#~)!ynF>12<;YyexT+O00)}b#RYs&EqC0+HLk;S z9JqcnJ31V|$m>01L04q$v;oC^Z@{22oTX9vu7+rJq<+)&VI`uA=NIYcMv$=}8FxBS zvGb}@UF%NZcSiIZHJ&catfZpt6e{qg{pmZt*w&K zdNj@E=5H)4quuKj>TirDflLXwN95E8bxa2W+=c|YLVH7^dz}UgyeIPPL=U>!v%gN0 z+|I0>p%QT-;5==GuuLw@y+lYD zi&ZU&HMax3KxdKrcZ6DU@|7H^TRuM(Ak3=zwRUGGxanzo%?(vBk&+;Gk%8wXZnIv2 zmQ_Aj4^S&SbM`hQrIyNx1Rcf3ezdj$0T>I>++bd zaafASEY&chY|;wNU9}8WY~N&)k~}g>8C#d1Pf0j5zgXK(Sj-Q3G&-Yb!HQ$=QYIJq zwTMt_HD7@<*mTONXX0SUga?}=4NSio_{XqB@Y0d_5(ZSBX-cHDqv;N6%NYi2No{je zeEl&zLG%kR75rc1a(+S=%A6Lu6l}8vT%L5Oe7<}pweHq%{X&KRP?HqtdbTx~Q(1sL z`ADF4FBiuY%;~k{67zWAJ*d8nN2v_Zp)ZXV|eSN93EI zk~%g0e6!nAFr_pI&L_F!0zbZb!T>$Z8e0b5_XlDPvv^JRqSE&f zCFSsfSJH+_QZ5*+(WQxywr=0JL6vDb6J?$QG*wU3kn}=zdW2h-7lp@ z&nSf01WA5rk3y3e$XAxc%NGn%Ds}K7krR_U`awct@z#(+*V^vnxq9kDcbpaBo59H9 zl7Yit=3gN{(1>aLjrSm^rGg?}S%m_aLf+D|4aSaU7YUcYq`6c+WqaX)oag7kql*EozJo=JK{3czIr9qC(8ah=GG$7boCY z%n%5eyl=mL)JImBYXqr;vZi>AE2Er#Rv{Xsls+ z5}V~PeT@p<@mZYFDsmD>l~h&1099m=9d8`IujGjOPbUT&CD*VzZJIRD22nTC=W=W; zL3)+yNkp=W4>e0^Ggp~X*l^T$*L+$G6Y}*!pQ!;`=0Tjl>gDfQ7;qEOYAnxwey%M4 z6m31Eg}=F!b}6y{TItKrZ#32C3w5p*Y*fgB7*8Tw+wFBAs>>kR1pcx2V0sdGIO93f zom|K;G-m=0aVY_KlFBEuoLKMPOhaRJmM^MloWAI8nP#ul>m6vx%0nXZX z{;O0+IO^SA7>h5{)4WNKO&=nbG9dvF%0mw_Tk+1Nd6-l;;d@J1qqa#J*(w#nJuELV zK|_ZZ_8JV@)N`ORmj=qk&gRn+t>F~1ioBO;iJps>mBnuFe2PwyA>z&X)K=%ptLssD zd50H0R_7WPpig2+G4$~Zzh$+e!Me0`-#RqY;RuV7oZIp}*@RryERCaN&IxZeiYRgN z{=11coAmsR8}HEG&@b&i;#=!A)m zgV(+iTi0#>`xQ2r$Yo6ZuilHpGOXWo(7HO`b7nUQzeXY*9{6lY#G+dqZ)U~Duz{?#_wOF%JW4N-+L%$`i>mN12+jgBT+;dZ}3F5ck=gw2ado^auWtE-W|fcWR@)pm1m;EZ8GQ zEBdk#bImkYNJx1|9H-DHp7SV?r`mpXuI_zi^rb2?G*{6of>%7Nqi}ypEGH!2YUrVA zYj!hFkY-`C;VS7OcmbukU6i?P)BN1fS4Rj^_mj37-LptuhXhM5vsDL zo4oKaR5a$f)LH6kx;!dcIA6r$w~BRlr+OKZN9^%2z#Bf=g;|EFGF`B*XlRmqO_5{s z!29IhAwW}SK%0o4A8ecnkFi6dTxNgRtLLZ5=1wcbD(1$({2)jX$w^gY-X0xq;qm!( zeI^{S44(wH5RW^T!YqL!R~RvXVj}i=f92;Ja6vGL6@xp|mDIGUb3Zd{k{gO(Qg5f? zwQJ%-2E7X)oHP)dQ;u45YT6>bbja#ZfZX8wLe{nj@x>j+kFzhg|KS2_yUEeqVc)(Sp0IhJujlJIz}&pDY+o84MVn zXVI+;oepHVsmZi5uJo{ibz->~sT#w+f`i`iHe;tOB#KoXQ8o2Rc-r?-X=&EYNZ954 z?WWVR=Nr_h>Jj)8l6F9LlVn}NOsKPV=5Uu?U6w;OwjTA7Wn}T)ZlBLA+Sh4A>x6sN zH(3Firi;`6=7TA9qrL&gIvxvtn&PDWui{^#n3h6v?CI4rWF(r^ByKAH}fkw=R-MJoj;=+S8peV zkxYB=t{7X^39~ka+?0tkIE2nQWy=Sy|NIiDesEJQd^1en)C*Yuo6#kX;bP-&RPj3zY~DP<8S!i)SpGSW5Z28NIvVqYZJzGnW6 z2DVwk-XiYw@3bK7Ya87XQyj`8oc&?(X}rbWx9rxyHC6D(HU1A1OI;i@66R0>iAhQN ze&WH`fZ4vAm1@>~x&)JfVSZG(1^z##kAJ>H(fWLHdo!toRz{w}bY9gv`RB#J0-c#n z_fu0M>mu|MiZUXZ>i$m0_03S^L|)6{;UT#;7v}=M#I~vZsVvP|lXRb8k|yO61rTaR z&6!8}sD}ASA80ujG2%I>`Rj)swQTH>Ug}m%IS00oy+3CIKJpsHVe94=Gwa@2QFKl~?*Dpi(eI~x*%&lgWsqRf z{A;Jz+PL&D#@X{55{G*lw><1Yw4t^MzHzh>Zb4)}%K0JsZ)~G9AQshj_jq)j=d`o= zwDEo?kp)GVkb0PpYj!*EOcl}Mxp@o8ys^)GtNAAT*Y|JNNuznX4k0&_DzVwI z_gVaruRCdl#@AK?dGsOGoBUmRZ9p^2HdUHcVM@@1_#V(|kb@Ae^;>b$OGUOLAiq~! z|HF=4x?Y#`e2YzvBr%#)-B|dk&KZy#$?cWaW(UqM>eJ1E6$)9|#>8VQz)YJ_10d$n zgLb_{N#fcbJ+IK^*2^+B{cIDdShnk0+5`^}XvM2Ec{P<1z#R5dAq9AS%XcXt-8~@8 zdWUNjv8qfFEzH{a^r6ESSEEUOwkcwFf*a;kUVQ;O$W~$NMo3IWku#Owe+c(CChkIR z$k8gFb~;%1It_ZbmtO;Sii~=?}pZ9a{ChR>8@{ zWZnQOx;?sIFeMu=tWq#STGblTk}xK&>I^GVZHm&AeQsL*PN5)8xBr4>|C;ys)5I2= z^9QhJvIJ+|kBCM~<0y_=1_K=hi=Wd-*;S}w$&tdiw9Q9CgURNuwI?(wWJkd?;uIJi zsy{R93YGitb?KLyu4G4&&Vfa58&Q`UcnL-D30@t6KF3I8W2(A4(MwB9iX|R=tdOR_ z`6A%9rSCALym6PvI9F&Zp=nXzZIops(jE)IHgxk5W?yoO4fK@ytUc(N@|ua&WJaG= zZPqIE=selSBKqIryKPRrt~Tl{yFhMSO?oFw45g$g7G0N_;%z&}wTJSSa`>z4$n6(y zKo9VmTbof{LtYx)I!?#e~fBINQJ%)({tVVyajPia5_bT)IU2~ z7E~>r;AsC<6ALXdFZ|I7 z?;4Ds?A6MYrM${_(3#N}ldYS0NCFG?!3m*43aHoH3$*wd;*S{h3EP2xRdX3#3}BN| zu1Z#g4~4mLy(u+^hqG6KPoY%*ejC$2!26#fP7n)p^>J}DU|Ja1g0M8@q8>`*t0d{w zqlcp6Cqp&Es7(I$F7~RL4ML?(I3?9Yg+MwEtE(NcsyHv_Cf(AqvR*;Ya0_$h-$p~+ z1kuH(%35=Ec$p%oV9vp5_};|C_zmJO_KiMEehalM9z1h&eYhj#0jZ8uf6NSTu5W!; zQO$gICy@Ofd7*%V--0*=A2{OdYA#8B|Up z(Crsc{|KGrtmIAZm$|L%PP-poQQV($vQ60_Ibsv07Mk|6;B2u`9}bb&*n9rB4}97F z4>$ju|H7B*+c#+c1>5b0BnG4sw< z9RYE{Ma%PXYcy>tQco~S`2HzQEf!`r7l2D7J~hcuARkvWi1jBUE|aw ze4$}ul)rh5caI(5%T>)#Y{;{%KAUyLEHoCO@IUo*{_|{GEx0L-n87ecMQA;@lyt2C zEtdk#q5`5tR0ey?G(6ROeaZP=1A7E15pq?f;7@NhYs>fGrIIu8U2 zy4Y`)+C7hNkIXhg__U4lVLP^rZo>dkf}+S5?K~Z<^-52HV!aa=m(Cb5GrPs9ocngQ zsYh<;a>tBz^%lhZIu3#U%L&WrzY%e1N*`L*2i9o?zrcbK^4Jf|dn<1}+ON8M!nUI0 zO8N1nUmc44h!4D@0i@-aT40x34dqFP7baWLpeVF{%C+{_+>1}g#+@fIgBGJE<9?R8 zqW-*2JLD~I0!0yUJ4qw;%0f@bIe$^_CiWz@pGy^bn(*%q z&8=3Jk;o?fePGIyYTT=Yd;ItpgJz_1q;7Ix>d$?V{x14;o@Hgpbcf3bHNAo+*-s{5 ziiG0OpkAah)c%BqOTk#>(?F#ff{H?DPAk*mf$STr%Vl zs!TnbYTA;Y=w+aCao^Eou(Hm!d{vo7T7G7F$hNqx0MZ`OAa02v^uKbEumDYO;6Zd9 z>6Oya#bqnBq{-OHa^z{w_b6ur8#za{XPiY}OTA*P*T}0k%4bkA_n3@|Kj{a!r?`n= z7PiXK@^gU-)@{UA-s+ZoCp&z1%&0owp6NeYbV?F0EsYzEkE_|t&P!7k@tR1=fi^|t zijo*DwJ%@eMkgfNEbSkD0#+=D8GY5-CG#bC?+rkW!`lV?5GT;4v(Qauf>1tvqcxU5 zcky)eZ{*K50p1*D-1KrXqKzx=s1WN@N`dZnCk;!2u4qr?=B`S zZI&CC>HgmtjZ#CiqlM7pjI1xfMkAh1GxLy4mn4bn`54yeuVmK5Et$6dG@R`2&-Gh& zvwtN5lN@v|%;wKBzkgiOqZ};oEd*kD;t))8t&EaPcg#+{-(}e0Dm&c9h0YhwUVT&K<~2POwotJt6@rE{ADtfS#;k|2BuiI~)NN3mvD}zV@aH-@8Wf|# znF+IU)ZHm?tqlu4 zHie{%h2(tjrRKm}R7!SbVisv1{*--oHx2u4-(qbw9CdzIglLG~k|aj2w_r5841G?G zg$J!z+s`zh{Nq-%9;JS@Ib&4mB_eBKLTRRvB$)(Fr~Eq+4{W822906BIChVMq) zF|OC7V?uI}JhW$eYQ!Xj^(*8U4&VgVj-oabm!&?8F5V)6Jwp`FbtqOF=XFP9fEPZ# z+YH)Trlt_W?hnM(aji%6$vPJK7hfX0a^mWAwJSC~$eL^nN zrT+}3H!!!&(O{j>izL=zd)$x_k9U8!hnKBX8Bv=;3*eDENC*sG=iO&+9IXwK@T<3m zkinmXQ0gQ_vCDz#pmtPP^KGauN<*KVd!HV zSWQ)Mdagi;bUyI|(`Wo6cu{7TYOXFxa+jkj$lqfIMZ?B56}mAtvL z3pXm8G-+}q*mu7}ob04{7Up~34R7~I>z#C%&HwY{!?|#%?|1%RxzS#CO{!CQP-9Fb z1dtF$R;VNYpt!Yp@Q?GiWWVMc9}tvuTcEGs{saiie)(Mb6fOZ>MC`;N?ucWLpQ_=k zZ6!GCBHc2?N`rx^frc!o4xXZSACdhZu*duP@Bttz5J^O(>pVv)<^380PqSQ)=#Y{j1?8PJsH1jMSy;7M+@??(jxKhpUBnt6rz4tDR`qD2%|202^9 zJCmzkaFv3Z4=)M)%pd;Yuy)Y#VA&kfgF+vE7f+8wEIFR%MC;{ zqg*BID!4_i$4QtCn>~}=5i*QEj5L*MK0`AxR*2Pj$R6TRGwD(((zXez%GitdL!6|V zrPl)?Km_esfmmZ(S&}t;mxaZxlBiFG;)3*vqfxoz)99_UdJ^pSm%s~5NgeduYup)~ z%niX~HLH4ko$wET1H`}&1Er?Nu)SP?RP2z>4)HSYphc2+t2?vNlc!y@@o|Ubh3DS$ zEniAXb&1iZ@hkL-zS{H3OmN+`UBIza&zA^w__RkMmMjAxWbZ!+@hylrM7Mm?UP;kx z417`J)}+#d@@Id2N!bO9^AL9eC}QK5wrM)VmVfvGd!&Gzq;>MoYr1|Q@;O)7>d5n3 z*`i8lBJRZ+H?b*w3tA$>$f+d(-=C=N5;2?e4Qnkako7D`n`uo(2>H8}TS5phM1Hi> z+}wgySsTQK|AWB0&bz`tt0XXm_b=uGZBeX}T$NT{wr)8_(Z;#<{@?HL1fJ)OaCslx zcJG(JS$Ip4EbsNWgYo1V76O}-*0$m`S?QTZl?~$LHbYB0+=vVQ@Cr>=-r@g)JqGOA zYLx#${+Ks0f!bUYW12v;+rD6G?Oaa`;8^#n;BEO8PXru#Vb0PY3SGW&C|vQkcY8uAIO0(!37N5Q3@ z^O_ZrN!634>eL=V15Z|7L8JH1jZ9mW%BQ9)&JFGB$DMMBLCg*ektoym^bP>BE$9n6 z?p9F{yjnv>d@x1|ouZoy$$BVLf}irJDBnM4b9w-Tt*dl~R6`Bq+Tw~`5HQoB>@n`7 zvo@9-j}Pc_vyPU>)-=@a-R#rNhtD&n(6)_j%LLt%eC|lrsO3FR81G-7FIjt9IHt0N zGm_=f%kvgPUG3~PzkVL!Z1S@l$ROqYT12f!+C-i^PqfQ|@OJVD7#Fa%80Rp4uLDU4 zN^1I8rVXcl{*^(B}pLVGlZB3W>hqo=_56bo~i1Nh_xc%0U>w9!|9puj-RqNF1CQ zkvbzfbG&6H{W4D#j9{ppTR8_knYP()1w=(zZ}$Rg7rs8fX_s;vyUQBr6KfoSJn5V7 za&NEg@!ejp_bGvo+@D9|c@*v7-{3Z!$-&{Oyu8f%m@7;%(g7;ALE#iMV9w=<5t703 zm2VjljZ<7Ssw80uG3S@YRmUG5f3>v3@W=_fX6504z2trI^B7()m(4@W*vV<6=d(TX z7yfZ)5#j3&88#oW@N;(myzvI&0aa&e{pbO+)qR;{^fR#r#g0hy?6Lyp-(z(0l)II# z$-%(TrinP4`H86Lrk!;+FnhzK1^i=cC&g;I{#=4uo?h?ib+V?EbXFIPGMBKXsp;=a zBv-;5x4-qO?$*4mR>dmUCzBxks-Oe?ux2js&2$-5GGSt>$UEB9bRc+qbR)i&DBb7l zZ|~x5{|7RJS?_7ZH1+l#Eg^YU;+hwf3{yczg^Z1-Tr^9pgf&;rMKg-ZD;*2e*f#w< z>^w)hQ+MzRzw$gY_ZO6BOo|DiVEw=WTb&65A53?f00*d<;^hHHOfw;ZJ5FR`iR=v} z;~Udxn|Zh=TXMeWn^+@1rfiq`3otA0Oy)-K*EX%ghTjHx9uOp~mQ;?$Xbe13oHk1J zy3e|*ux1?%E4*ty6(bA)ZCM+Vp~z!bKhW3+NGX(-ol$A$&^yLX&o=)EKH2?`fpf*9 zqB6DL^LsA82u@o#CdYReM&vWW(ykFVzF9BZ`jAow36@i_!MaYz4A|M;K5iW%;p7PZ zOgO$AzkK5;M_KQ`01gP8{gm4Tui8%oGYEH{ok<)DpJH6~0`BA~9X0o}1j{AB#3eeqEmkHZ4*f<9RCt7LYfzsgJvEKb0adXsl?95|3}dRk!8cefTD<;4^ZF z@h193SzS>SJ5*_wM9XlQa&Hp*OFNqHgt)f0Ng7uHV(_( zHTG-+ZDhqU!G(eg?&@-t>0G_3>7c)o>AHM;vsE+yOH3T3eh@Pcbi5rGF3%IIlImX# z@OIrKE!q=L>ibkC(~K!C@I~7z2Au@GM}Y8$RT8mI3WMC|mN3SOL1p$bNp_B#fV-#m z3|G;f8={E{*g$%IAeNjpc;{TTk8#$Whms&sQx$aL0DK+!wDyYcqsZ@zhT1@{ zF0q80PT8K(L)|2q)+GXCYgNq*dcbC7OO#eGbUZV)=-{=-abe~tYgRk}3DDcHQhcJf zBTrr0C3UA+U@9R&GA4$?6k^sVfL@e!*H1B(rut`1@MN7dt0t0lmGGRjvPpyiyBnwi zmQR9g7DbNJ%qGS90K0-8w}s}MDlZt`zI1lDWv%8Gbib{pI{t)qErUpU_@9zNUn}Y0 z$;k!K<0&f!&&H9uXBe?+r3z}7O6qRS`I!gSXuOGas(Acao|=m4lqBGr>z|Q&D#oQU z9MF6o+}Pt`mX+6gZR%`G`+&wJ>uN$m$tLZJ=a%-yY)OuO=oOq&78Ij4OiwrvIt0^& zeMhk`0Rn)fB?`R`rYU*-g&@iDhR4V%#j(B?{*hCRXU*^f{AqveHfi3fQ2J>lz?#pz zrl-eN4|J(Bn&sw@%J9V(zuQfFwqi2LoUSg!7(9K_8}(Gy4hx>Q6!MQ$Q!{!E?ch44 zb1OVs?N|0hu}L-2MH5qxQ}##yezf4)P<{g5h9gRNv9D*@tS-eiSpx)S40L-K@_>{6 zZl<^{)@gCkM%c*Lc}A-VL%;2(vMq4TIiN zD2U1sTE4f55}y#vX!4u>Qgr;5X(k6DK8<6CT4Y7Ej~{!f{OGv82FuE(sCwf(lmL2 zqa?E@K5r!KFmUSNUJ)o`aN5Y>gbBEZ@zK#_r_pXjWj0b)`XArJ_qYLiwRu0w3BMSH zOIfg{G8MAE>SIz)5&rZ()D^>Z|I9@AhJ)MX$GTa~#NyoJOlKj)19z2_fOoK>F|}7U z8j-Z{AU5iZk|unS_KR7KdEjfiSco&W!*cM>JcpSJVbI{VkuDP;M^AWC>0(X34yCGI zj6$a2jc-v5dSOH`mnQ?8Cu>zA{YuBgng+w`4n*kpbfU1N1`? zO-ow__(ujb3av>JsF<3ch@#F3X^Ps6<|YjmKNP6ONpXv=**{f9M$4wK?ohgh^5Yqq zfA7(@HWUOzk1oj1H2YbT1&D6!wzzHo@$rA5ZhrhZ8tRDX8)w<^R~EeD)_6 z5SrDqv;WeHoZNtjkvYumGQ`aHuN0C0Z`F)xp9c_-{4WHEu-9B zAQ08qvb1)!!QR-Js%AeYq$VD0&%+}wN{1&Z5jzk&L zP@awQNmuDt0b}yJQ~cNj6@?6XYwTMR8S{kC*4%OjPg?3d1wzw3^NcsD9J^w%mGbd^ zi6O3p?ER1VfE6IeX$p$*X;2R$`TP1GojpP_@yeT>R@F2*rJZ2~2RSl1z#ib= zesYx~@~O*8r~Nv`M&~-C`pog2mi)C2?ap#w{()LE!9&)-vC)(0NJbmVfCI-28GQ>( zmNHR$Pw$z99mL}md-=zt3%Y^yaCl3etWz{#ZLROmB58P{j0o!#0hMa{rP;@o;mu<@ zc>AQa)4nzHO{@JE0pV*hj_$*%<46Ppm}c7VsNunX%Y&sDIs^A7P4ZXQI7q**fzO*} zF21)>Kl*U5gr{;Xv-rPstnIe45=Co$?3z20(WINJB=vrN{&pdNO}jOmyn&DjRmjRx zoF)TQTUlg#&)`EzX4!-+R1lxN8YB-n{S5f0QP*_1#S~%&^TeroQTp;Fx?Bg@ALbS#zHR^ zB0MM8C+HDF8DH=12{vMDLxzk{0ZwYv(4-~!0?t?gJ!K39m=Ya>(1q$%-c1iczDu0W z-!6J1l#s1HKt%J9IE*L%K1V5Af&N?0YU>@oNm?sUIbvDNsJ5kpR84_GvB^k=(78T} znr69){q^HNUt0^$n!=G8Z*So$ig;eyxgHhG8s1 z_b#$b6w4OOce(SISjye)^S?}-P2R&Oh>b>5R5?{$=V2g0Ka>;-K0ZMRHNIHk`0MBY z@v4Ng`DqZ%T+S@BA%28?txUTuTCS-O_VL%=R>n(ftaYj{t-b6~wRrn@C_p9^DiHi+ zjt~xoTpqsg!mJabbjiS9Dd&*_J}zM2F^?L8aXPlYJOn%gLg}<`BlJ5>;_Q=(Y9Z~9 z*8jlEA<<1DvP^e=sm%5HF+ztmssD$vv+8QA?YeL&Em|Ck6?Z7m;_g!1p?I<4P+UTg z;tmB$ad!#s(&8T6rD%X4MFR=)<@p8Qcu#Vak%OH*_PzF8b6(S{?@$uPsP0)%c)beN zxfeW&U59hJFB$*=iIZ3T;x9yh5GxRum0wDo{3Cg;v$Z>x$n~z`(w=Hmx^cdF_}rs2 zqnRxhz?>{9F~53pQWig~qvsa;9)Vu<9j^Oxt$ZlriaK$vMW+Vy%Zh%d{y=QkC zt^8mT$Pqp*wuhsEXjaz4!mG$X4*wGbDM=ZEc zYqQ99&=OOSw%^hrbey4U0nz_SI{9+PZL5hNTT4;DGR&uWfV?cX^`1l9O~xPZrq<75 z5nAp(;Iw621rFq0T~g<&QC(f}T``N#DgXLJRTAd{fNz?B_!5fDaZgk17SpNwRMdEn z+IeJ^gznQw&H(_I46E9m&xe(7W>BejVl)?1S%7`iB>hyS)FzKS0G+1NOfH^qMRzpr z+)z3I8Pi8V$@R9E2z!(5qd=Fw;LwR5@8oi5VZ6I1gZIUT+`3wE|45&PneTSc$umW8V2F^frfQ65E5i8F}o`2r8ED!oM*#v%8Der3$us`b{`X z1TWp?zt~rfVpW(p8x0e$xKtJECqx(>J}u`nvYmgt(DWYiWWOdv+Be^T23}FyIi6I@ zl`SqeI&9C|d%hK0cw?ke%o>^uG{5)$IaYJS-YgD0b#(GiHbW0E3(y~J!hje2C=Ki} zNE@8la4MWN9Y0yS7kAI$`N^b}iqAjb*sUCZf3C71Fea-v!mo#{X>qjI7=D?Gz0(HI zQ7QBg;k(57z8Y@4h};g++oUbxvM((*-o0Dr``7ZGQdQKBPZ~kiFeQYBCr)43d&d$O z6BVToR~<%lgBoD#Luk-NP~ep#5^r`N4Mr}hdTZQ7A3uVVHB7#aO~wmKFRPq-^?PQL z%ziEC!gD5FYikNhOx#njNfaJWAaaNqL-%-l)r-?GUSY+tj;x1J!z*RwSmJ(}tjG%7 zDPi4AEGZZ+UiY)tQ7bznLgD6PxZliYqC+}2It@qf&SBD?t8?=dGfHe@^t9n6xSr3c22`ywO&dOcoQ$cFW>_H3+EIp`fBMtZbRNvI3Y667N2 zXq^oSL2Ri$!a>ECHVep6q7Xd45c_Q0jhu91%kHnXH&L77XM%+1e(3*Prfge*7QS2m z3ZX%;Li`?`)4oD(NeUSY91$i@K@U)|$fpTgZsb@L^eFg@G$=l%^*-Y1Wg-crfUc+H z;dW%XR$OA(xlj9eZYyl&HVcO5`FPM458yO&rTn+9f&B#FKJfY`IO9zJ%DfNGxw#(Q z*2TV$%agu6N5*mPP^=W@@|#}8*Rsh9lSltmp-K_AH8mIFiLAFMuDxEuIwQn_t`Ik7 z*)_JcL)M0|aD4c#Q1I;A>Yp%Bj*2`>yLat2FQcLExfD_yib;n05cC}Wp zXV=%(@WS73)x%h6i!+wHb7pNF;@Rn;Kj=Och0idvePU5ge=AV?Nlbo!ZRFckYPN$AB7Tbbh| z%aPnkvpmbt!m@Jfdi$rIe`KC)T~-BVAC2YkM_aAx9ifjHz~8ON1KABEq=;Oin^=y)645yaSlG zRJZT9h+{h?UOM}Jvi=M}DOV=G>~g^cTZ6l8;DZ-WEua?iluUvZ^gu=^Q&)Tf&D`Li6<2?;`;Erhv5%QDfVWxI72Z;98a>7Tb8wY9vqAmLb9uq#5*y}070C$7PS zAzSO^H!?!*H!LJmzpn82v2D+eFYI(uPL5pjnCxhOdX&1v`NWC{Tztv^MOr z%t*mq)LIG21p@cQ7S1To|GMAa_E=by@Za`vrL9V!TqgC2?I$V&#JLv?iB()q)Do#A zrRC((Y4*Ji0U#3yU!jJIu#O;j{EP8O&x^g$1uLXdbbT0({A`;2%l{SNXi#GM`73b! z?00D&uy(6mQBH2l{{qQ7L)8eS!!)!~U;`Y%!fwcU5echq!Jy zGyhTIX5hcg>)*F|jV*7CZEFYb@syo~i3rp_+FArwUO}H8*wSvVS5yL=Uv@Aas8_$W zJ#uGgP@=Ony}f#ULtBLW5kK6*>*8bWll~6}!?MgA8N>q$v1>i3S@rl0TnF-s&VhHm zBfMKTR+3zETxX5-k1zITQW=FYKARymtU{MWnBoR*P!9q(PYnl6wEP)?G(J=9HdFOH z@AGFz{{E^;NgMC&xfTGGFXaXvjFKYVhS7NzYltUt>bx~X_VDcYQh97G{}`ZIXFuTK z2<^7s=e}K`>l@0A@$92d+~{%5lPhxO{N@_=~_u3({$%p%obdG&?0L z&SBuu;h@BprF%pGK_^9nR4J-)WFRDGE|g)cm+8fxt79fS9M~P*Q}Ua)107}s3e*yT z>|lCaHG;jz|J@dy^8O24fy`he{8r;qrg)&^de79&LCb9!2y?3yK2g&+P0+g^19EsD zs5F>?F*%xVEYSZBQkH~2dY5OV-M857OcRZL-c%pVI$_7zq!rkt(DP&=DKoi$*mhOY zx#_DEh$rgQ?dGQ>ub|H_%5-K8|(hPT7Mn__8eo zoKrPNb~zz7jn=ckS%ZXAX9orLd85(DH{MyE~bJ75nU3iEj2!Nm`U)~ z-17X~Ws4|;Tg2jXo$+i=);rfgNN~5=0B;WRwE&eF)iZ(D?QkU#_yg+UibOp${OArN zH4>@y!Fnn49kDlCpqW=h_q=i1DCqg)1ln*wq?haS8wL!7NwAyuH0Hs+M-+K)Lqd=eU5Zb2I_Ny=WaeHsy2M-?D|Y9bm} z0cjGfIpNDE9_jSjBGlJ~Lq7So z9*a#MF;u9M78R`2@{hd2%vkuO@Qa3~PicRD9`CrkYdOLsKM2KlQAnx35#36J3jgsP z`3OGv_lR-UAj8c_Z}fT3Tck0rnbdyhGxsg?bn|pxeCZj2t;=Rt#?BzxtCxkFr{J*O zgM(cS>-%zNtM7>!5}L>}5%%w8jG+Z!fsnu=y6_!v_Wa}P-4pU#O;fac%OG=*>{dYX z@cj+o-?!H_O!BMUD6FxxPK=z+p#yAdWGdrOJI5^Q`B$gMvx6S&lXxyY%5GZIhSjnL zW)|OvK^qpvf4@fDf5lHU^Q-%>_vq#wAh|`lVqN?%Snm(n>7`g4BBBS`Km+G}mVm7V zvt@(=9{eEGpnkm8>tEDwqyaH)IWDK}S#Ls`lD+gJB$ztD4A*Y2a#B;pO8s$sgG1Xg zN;8QC@nXQ3(~W2!6C+7Czi^)&MXmKjwZFp?Xwfqw4RrfT{fZ~VNZ`azMy_cca@n%I z)>;4O##CZ**BxuMxSF!U%_s$hnBi~mZmdaZ7T$eimSDT7>#TTMDJJO1qf8xn4;=BX zC)!Vt4>x#YeWbfxzG$!Z5wKUlkoL&;Cm`VepcrOZ=HIgSOfn_0N$*YoM&7swS{hmY zDa6#fTLrPYtvOSL4nI8p0@n{Og-)B=#L=gb%_~XJ_r$0$qC+AaLyDOr#NoSw`Cm`Lao`G!p7c##*f+=D1q3PF9(PPyqw#-d($c6Y;5y4T`=?bf zY+@eUa{xI=$o#7EtD7G!IsBd7)wO21*8OX}DlVr7RO zUA%&?(t>|xXevwTNUbT(qU}Vx{FT76ojAxBA|886?K<_QrO%Y{(fIQ(ez*=rd$Uo2 z42q84s+S2Cdqf^>a3mK4c{Q83%c_*n+AG zv9BKc}KZ}!{(PFkohpmo;%uh!(}Hai zhTetg+OILP6WUw)=+zPlDr^qkRlBk|==wg0n7=!6oYPvwVFQ-#L+_N68=r=9yLD|& zIc=O@0sEOm(uUx#y4m<5%Zb_JADk0`L5{0e(psD(^#!Z>Ubdx~6HX`idPJRe*qu-M z1p65Y_)OM$mNb;ClMtqy3Wm>+?0lL0au(G#J}3Fh59c~Q@Baqwi>7+r{PYp~!Q6wd zC14}^FPdeAc?(7B=~!(sPiw;abw-#aU204qnmy0(UHikGp9^>!xs|BNJ*#X|q8Isj zbDe|eDh2MoHbaNu-octn^pItovSyM**;%;tOJ=6l#!!vtzFy=I1yQe?lp4&ft%@^^ zD|t82o5JFklViMnL$|h~rPT4^u8xo0z5E17LQaI!>wQ+(V`|yz)o77YKYt~kvPihn zk`4Gtx7(^YTu_?uo5ktNYtG>=>UgO;HLpC_fnU&i_+jA5ap&KO3wdOR^Iwrl= zH|p=NJQvr?N3L3oN3BB2!Wb+8@W&+?ouEaAfj(5zNavhACwYWP zrt)fi%!4iE>zO8c&V#t1z?sh>>XBsKzl=Hnbvf4G)Rh9P3}HVL+;l?VU30+ z^xe7Re$5Z2y``-16qRDa?4O<0JiBD`Q>{sg;_YsNZ@SY4=FN5vW@^3TV$t*KYZ_I^J ztsG3kKvV(k(e4Q+j=B^qjG2+|E0TNDMhq3DYge~{l@fCsKh*vnwpdsP=SoZ631lQESKO*)MQ`cvv>H==N8G-?v z0{vC1W%&bYwzh1^AK+@03hyKuCbjSzG9)j8&8d(m^AIn1ID3O$QOc8=oMvHAy7|JecU~q>l79WYct`BGRk~z|a4|yaC{YXL~lntGG<3ncraD4vEf&AxF z-yIake|Rk?XC9E!PyTMNE43EowHUg|We#Rh6pgxPR4Q5a6;oI%z%yJ{va78dd3IRU>n{auZ!7*!`=~E3ox{+h@y~5U7U-H@rLY%3wUNR40<>TibwZDg6cpF1 ze)Y8*mk%Ls8n-T|l zJ;_f|m@Ld~2LIgTY0oor2#OD^u06QXj^(_4yRb;0rK?TMq&wvN;JmIumlm>;){7m< zeIAzecgB$&Pv(Z}4qwfK;-sDr8;jzsNS4oYR~OhIb*C4Ar6BIomg7X~$2U?#{@0x^`nv zMpVWOjQrrrBya6z&u!{?nI4n_5Ov}WfQlk}ZUqH|h-HgbWS`x{TWB_s zFN2e*ODhs*lJ@a>tNXl;>!dlg3kNRq)6F{Rx|vlueh&P%6%)d`8``1Jt7FvK!z$Q{ zz%RkR<;|WyKzMxBJBgh+TY?yi#H+*WcGE^2E-1X~>?%ACa>$$afUG*KOECgI^<;m` zC8o5XB6LZi-vM`{s;A(5kbs>RxVD{iiYhF3BGzva#?^vwwE;h=>`r7CRnA)^#$IGk zfQl|aZgJ-!5q6&$bP0aqPY(s1wXzQhH` z5{xmjv!?xPSNH`okrCTIN5us2TWRo0`z8u*b^o`T6!^?78F=J&=6Icsb#EQ!P2@$W z(ncXz&H0p@wPb;}URUei%qc9EUQJ4sgzDxVI-h;2oZ(h!Ctfzq8 zm&u3UVu7;FE6@^YXYjLyz>*;{XGJP%l9$72m)ooD*(~duZyQ_Rw~~m!Bd>OF*7Pvp zPNP)TjsLWvjulR*>8zd1v#fb64rTuoiE)cfn7dd{%m>{$e_AXH8PXh#5o=K{H*AKw+g=@ROV zZsAdoayel~jEVTXe5G=9By-@&ubaNA^LM8$Ra5X#G9XXQYZZ9n;g4aus_gr~_*wKV z!Op=khY0bwa?0?i#?v+U+w=Q|+zA4IaRrQNVsC}5s50SI+l`HLOYXGg0^CO}8LVsZ zapK+X-`OG&|M=NX*gUWq0S))1FHe*{*rl1JrH9T+}|4j>+9N z64L*8c9FJirs(+YMyOS!H19YHtgm&wTapxlPF>s={{2=lzoaF`L`)r7E?Z z2v?u}pbS_nQ4Ga~viOY$nw4VBZ3gQl!!6xYp@4 zrXhN_{aHW$S>=1{t+=G@5~{!j(u@%t%3WN0Du*dm$3)H&`D_oYtNVEWDXA$OM!CGK zRxKYd3EBdN!9%x2%to+^Vue1Wmc>l{)WmHHd;N*;QmIM5-lNe{Nu4h;zr$?c1>k1RZlNR*VUtCk9^hZM;No#C91>k>hYo1wS@w-yY)jJfG1?$dk6V9))%|NaxLYM}4F2RbT7 zGMJf&44y_^EXk0a-4cRJI=LTZk-bEB#A^*mL32DpTruDYd%b7LPckQ-NvuxHfS(_4 zDlFT>ab}Kis@k2){y~d+^niAcA-yvBh_9~dTnv1cK&)^ZnL5%I4^woHs`xlM$$@5G5ykG z*T_TbCetI$BqV7yH!{3%_)stk8=K%7hHDhXnF_a6qoXqw0OfA!q++NWTd7Tr@Sg$T5jlih72 zSfCIgdO{932p0d4!0l-C!xy89>6IDb$CXY0_8Dbz-QOEoC-H6&E&#`*;EL5(`2!izhB0ZQd4|P00Xtk&-xoe9dTHKn z$=zQgI%Nx43)xuFWMH4zsYB$LCVr`DD&Ll^2gyhgB({hC;W{qtcA-$ar6%RRBiocA z5F4m=D>M>nIM#asq0RLbhU-P~s5s|%-;)7YLBWO7CPE>6Tpx$KXbgM()(L9P)y^YE z41L+>CBPz8KQAb>b21ZiVS5|=9kc#3+Z|^6nisxmaZX<$IyY&YRlWLR(^%|9zv$z_ zN3ONq4~fTQb-E@7BshS(M5yxl**ndZU1QEWL@Kq~9)?)Zb1ba6e*v6SF=mGF?xmVR zozA+omCAaOEJF&jUma?4q?kDN+XH^c%kQ6ZW2;joFMtVBF zotlmJkKRXW3-6$?G@&XPu~TT3y|z>(-F#llV&%1+J>o9s~Cy7so8ibTu@aJwi_+pE6y$OeD}K_cYUIDIg#V}1uCcWi z83QzM?c3GGs2kxX!lE2wEiS8)}B*UT8d!HxQXY@0{b=NnP);*J_ zOLj*Rt}SgfyKlt`iKv4J4l^pI|I=TmEQue^yOrtrwW&|_wLIugw`sVJC z;cs8P_erXAK;pmTLD+%^hgBRiXTi{?9S)~C)1Kc0pqpK&dTsG1H+qMJ7(qW&8?`ry zU$su}bU=2hp4zr#?n9b~h#X@J(TdQ~EK$m|k;Xn9oA{<^40o=A5zO%VrF8G`O%qca z0Masd(#|blH9M{NRc7mC;KA=e2%Mwv#)xbs7gAqO+nhxGWUtAAY%SowL(&*lCp%lrQ+{Sp>axM;!ab@?5QE z_df8f*oq4b_1L{1P>@yRlYT4uo1YSO5lnOh%D!6m_faglKTcZ8;C^@q`1kxkDuF!o zkW~v{s%i_&v0pgo?9RB9>UK87_plcwUJR$q8Nu0!Y zUpZ5IRj;dE)-dOfpxe<*H()(6W_9XrasTPiS7_1xAvR1@+dtdYk}@{=G0jF@ZEtP} z-qAX0iy=d*?&k7k&UKH5D}LTk=e_a5xzX8KXcsipsPM#*{T8$ze_rf`A$;sKV(;@* z<}BE$%cz*uIa*~ycX>j-71{>L)4zErQ-{BqYTWf)<)jC6-Fa7>8J4SPaV`9+jd1`8 zmC`%w9~VsxPC{@jO@-uG^GdDsBIy-B1d&74nA+5Kd#DUND>Sx+s{`nl#RKSmeazX6};<*S73cn94l#uP}_C7uSqeauMwZ|7(JbnFuy zW#^O)QlM>Tv6Qs#QkP?c?h}-U5S>`KZY_EbaAxy%T~p+xo&65BlY(gscWv?$nvQ4$ zq*k0rK9MuOnB*K0eg(aKckQ5Ot`S89Gn9@NA0bM-5Z<0#3d{!upDxBpR}bG20REjA zw&W;ocsw8i%uC|6^8UQKQpqs+{QNCPsp)NJZCqFaTbQ(Mz!U#!mFv)z+h8 zuN)G(q;csQ>)7>t)Tf`F1$kNzF|F_VrdsmI$Xa`)($yMx15ov*ICD1K|HnyVgR`(d zDSig#!nHnlL+FI<%=6B}JOHxxpV`1xVr+N!q&@|?t_-b0X0r#wbq?R;qBBJe)TCh} zHx;&tYk>h*@=t*`9vyMNR4&&2Y9S(d28p$jNt>7RQgA7Oid%(gmF6lE7&-5X9{`lL zw&HjQ@c(=ls7y{E47RO=%ucn}HYzA&>SbZgq$Ht1 zwN5I`?Ll~%`K;hePnVeGgX*=~M<@WzSn^FFTvEKH;Ca>%numD9Jc7>jzsBm=@Mxw~U#Iw?bXV-g* za=PUC6zPv@;BwB_)+Jvnja2pgv`Vh+W>-U3cPBoi9AuD+TU!xWM3wL(0qZoQ{yTw^>#O{9AjjVGK2pwQS>|H2 zo`!BoEY?LXk;t3((d%vI7D4QevdQB6I`BSOQ{7i$OKFucPnG_K9k;Po*oN~GNld9Q zrl1Wo(aGmvmkGtpV!Vu@|RiXsm!m*avOeM=URx_2F9jMAyPx3g2l|K#mCgM=)$uCon2hl z({I;kA8p7aJ+QGAo*E)TRM8*Ju~snTr=}rR-D1-id&Si79y%y(m$E45VzNqv?O`_p zY4G=~>$FWXJV6Ni+F^~_XF@4&MIVe&56cPQZZC}rpw4P?sTMBlYu1GW;f?E%osz8n z=^Ut=At~RhWPQjo^xNqx9mxZT^wu&2VcOeo)8%E5s4;`G!z4O-+MU8ITyT1DgOkV^ zqJa7+NqyOOU6cNw6t#xuTXO<->==1r9d{81^>fOA8d!>F7Ah$eG7yS?CpAbgcGg>o zjE-!x2z{T^{wb#l7LC=ynMpLQ#!M^L{DqQi55#Q>aiqp=+X#dqmXL3Nq>?ZKu3?^~ zf{kJL(&A$q;P>NCY9!AhXSW;=^85`?t`0~1yp&Zj-*Wrzg(;=dSlbW>V zYjp4SAeQSkQxd;=t%I?m8sUt=^jaq%d-$P9b>paOaC7sto*59h_x^d2_}sb4j~?OE zObYW|+`Za+nV5C@NC3}1=MHNwwm*boLRkEHz)pzU?kLSNGXTVS3N@n|WItOv4KHl_ z4V2Hj+}gQt(T2RS!`!)NvsU`N89{%?4LpIfWU?n zrzW*gQ_`Axwl(PV&e(NXFq%*Ji&#Xii+kWzUDj65*zV3YaFK)~qTjV{?g(+P4%p!Pj1;-&k>ZPy0XFd7JzUjP%+#uIJ~g zI;5}R;G5{50^tzmRX>kP5$&cje5_m#wh*US8+bvk$a4@C)#5FHywtNcw`0#|Doetk zID}*NzGsj~exLz#9S#2bM&|7!8zQpp+thj#tD=K=F zjn{A=8ULE>7-#;M1rB(K-h%1a56s`Pyj2pxDAyzXHNYl@a_ju)=8uvc;@#dapMEyT!)V)+nU{Z+KG_mR5>;*f^igwr#H9^Y|ah}?;JBP>jev+8b z9&08o-$38rbFfA_c#f>m-u!G_3f`h4s zWfELK&8pGz%$9?Z50xjq#|EVxTV0!Xe8zj(iZfB&Vbz%?^GW4A#mYW3#*IvgT`&)* z*K%|Ym+D@?G26aqVp78(aY?)~a0BCwJLj{k#7$rrD2&QPWGPvA$izq+SkvUpjxcEd z%sM6``qm*u+AV486$zIIzpR;-#a4fHWb6efX|i&csZyNfTe18tvPs`%$ z=Cr%JR43`C`&WXE)=ig-~d^T(;?p3V&cmD(07enQ;f(KqjAA(gt0ncxd zkr0&}9=5}zwC0n|eUjmGTl-f_V z#20#F5FPc&n@h$`RWtAFgrgFsv3tRijy-y3*RyhX8$=9G$5Guv!XQ;5qWdUGo5ZHR z{Fwiq*}l${2c_PZ@2^KFv(v(6VT)dPHY=*a?bB;|x{(L&ihQ1!YjSjZO0I~Uz&f{3 zNmoLiW71&@*ieE5Wz2P2QcipKTC6_mVm$+jsg2ZE*rOaV(l7ndWf!ZX`k%gg;s zwkg;cEHDo#xA#89EOf|CNsKUDPMi%1B>ovr_dJdu%lyUQbABOoKV={cA1Hgeqk;5p z1?10)E!&v-JETFA)mD5tq~nWM;@4ST6qFY>Z0J%|7v&OygJ;}9| zg#Pon^`6)9SF0f)es&b8^_wX%hVPbfX=h#-UhI>-96!|e?Ch&7HwEgx$au}9Wmnn$ z`n+(OBdc+lW4iboWdUv_U|RrxciTmeIR>e;~!n8WY{GACHw?hsaWwc zVhh>J?LQ*rP3lKUxLzy!5&T?0VD9~{iM&l}WFvWSU6LJQrW@ehZ1k)Ux0wXg<>HSF zA<_lBhT@}LW}C-i(BG8nkZ2?vuVsbL)gH&oK-5-Q;aWXgLiJwAyz}J zgO_*xJfc}$W)D!r(zizmTXp7j5Uc{J2>8p?oF4kwQZZ9 zDqdsaAfFWzp>kcxGq*$+U;dC8=Ry$3R;E#oD$=}d$4ri|`eQ{w%=T((KbHaVu54`L zyep%`OMZNDs(Qm7ZNK(&C`C5`C7oXlV$E(UJ+EVTXS6xR{T2zAb_h`3!YX(3!2|q)m*WtC?TQ5h{1rq=;Qoy`q&x(i-ssbNvy$2yT~`=&;p9O{3a& zxj#DejmPjNQRb)jj4X~XRE%X4X@|{7sWWM9*SG#-*@hy^HXS)Q4jto6b>FLpeGT>w z-xd`RYpj3J>_pL4uq3J~epiLvfk!RzrEd|XoOe#Q;u?KziO=ph0p%cb~f#m>57*pW#{&rv65Ms6EU;1BRENUM1kF-bS0f{ z`bMq+Ms9*0+7`JvzmxjVUm4$q2)J>7Jfg>ymigp%MVo}vh-$)GOei~CR4p3^2A~Vv z>_!sIM1xF$DplRQpI*EOexW2Mt=of45m2G>zuA=>?t1H>L*%h&RH)J!r0k}bU>QTd z;cVZx#qH&_)!M1H2ljFuXz{TXc0?@|)1HCwyq(u=8C}w5?updEK72>cPr~Op(-Ba@mj!x(2{gMQYH!15M z>UcGOjm2GoFSR!!qso8#cRD5!rF>tjV(?)PTOSe$)V|E7pcIjr5vT)Y^_$gh{q@I1 zV}L%1qGu|%iT6E4$_0Jt`jW#EH~g{%*)v7+Dpu6BQLS05RaH(7suB2I(#mX05Y)i+ z4$t$M(=uxn|2z4$;`Z`R{YUMF2?+*bsu?-6E8z9V18s_J=j-hoRYCXK=SgpVNCQ_S0^Js(;}2V0t?abwf9K$R_{bW6$##vT%+e zQBnyeK&^fLW)57Mj|Y<;UG4injs%atl6v zugK03dZozoNj(`L30sL>Q&d_`l(wPJCVdAE_K+=|V3Fv7JB4A^&-x=783!>Y9;myT*M+*Me z0aJXQh9Hx6cgL7T`@DSNJEYs_5T{S^e~wkF&!)dpQWf)T-VykHj+ zwl-^9?B23r@7C?@-4;XvY!MAVGx{k!s3nI}ROimjLENA)b!!$8dN~-Y%1tq#llJv~ z;=eLt@8k+YwvU6CXKDY*3b9)@?zk4F!)~;v# zrsML_wSrHkl`H4wPg>+1yjFraU+;u+mFz?3hYhnk6v-;zGa}U_k^jWF=1$d8k@l(i z3VO%|FK3%G#Z?z+FXGtMeH9EuifZ71pVcV!1CZA>dMzQiE?enlI`-~1>DYd=5|nzf zMQ=U!B%7Oq1iiW*bIe>%ZR^q^|Ij3T^9z8S+z2Ffm#!*&Le7&w|3;a5ZPHPRRded9 zHxBpppoKEkg{!y1vPhQ6m0R<{V9mofC1QD|8A#M&Ue~!F%c#n{%X6Nc zy?u19->q=rSXQaNQrvUaeoD~5)IxIB{J*|BbHg~GTX#-x+R~Rv?8qLmb)NPeI4M!` zHk81x7Y2ycec1}{4Z`EOnp~uynA9p4(lUKZ-7#(cu)1{E7mDslY?!lNxI1U8*m1iQ z_yjrH&?!rpM!P)v!F8Ce-4wa6-av;0=oSXGHN>oy?C*xHQ!wnj%5aD%PLM>Lr4+wKFp~$+bbq z@&atr+BMv6g1VldD;!r!f{@#YzAz%`9P8F{8CiWkh`+^Q8~0f!EX<_-P2!>5*!_lh zaC)@t7bP6nxPHobeiZIbbV}@!NY_`Lnv@&KZ6+?aA5K8z9&*$CV=g}o z&ezw)?tO4)#A;QC7k!dO*x%wVKTYSzFkLe7>?)VgR@y`QPFWZ58lDsueT|1onZ(y4 zAYoeLkP($dbq6lFga&`k01X%{UhHCZ;%YT~OA~L%a+cUsWe%E5EmlV-#=H1Ng2k|i zUefsnd?ny{Cnjd5<7=A8{EuDjGsqjj!9Gdp`my;7qxJhHN9?AqnJ7dtiimnqfzlh{ zuHY+GF-m71v(|oi*VfXjitWEI)Iz+&6c5M-dWUIj@YZhlxvWI_M=++J8Jd=+1OQ!U zp@pe7x62IlV_{q`LAHj3ybnbvMxR0G4i=R}DnMaho;NH>gy#RK78y zlOJ7AEHy)9;3>`u;g|Z0a zi;Qd16pE=j#y*i+8k-&HZk=4ef4k=MLDYcI-~r_G?GV?lG2f7g5$F< z6CJcK{f>4p@oDO!o%x!n=w3CpjqW~lx(4%LHhzkT+~~Qb7V^FYaO6{ui}}G?sPpDN zo{X)Z?aFXCAnlpWUgVP9O==s~QnA=#1__)O6f0_4uG4t>U|?9|hqom1x+xm>W~Oe8 zO+R33D+uo1hYu2mG!Jv(mr1=rLeUNm=E4RdGAp`N34K^X+Xd*uIrP?p^uM z=G*TM{Lo9#dv-;k@o!*;Y;pYOy;KzYTil52fO9&|+sm=jCtApKNA44_^SxV%bajVE zqSx&yz^Szi^Dw`TfoD03Vfkl&1v3SfGm8R^r29|s*;L-PxIPhLxvwyUT3g@NDXR%| zY}oyLy><{GfFniHBc!l&2wR)?UP;CeJiwqj_-V$qP$;5l5 zv{{l4nJ%foXcQph9b9^we!q1GF2Z0DlLDYv4ydherT{%zlv3a>To381c`48F$LvSc z;n*awLlP!eQhk|mdS#}^I;FzWMsvQ=4Vrz=%^O~^U}enm^AP)Rcbl5%H+68_yn|h5 zhh%G%ikn0{Zv?ZGYdx|NxR9BCY>1FbdQRRp+RvJQ>kE)GiED*&r#xe-I^+XTHE*G- zxnE#tv@so7D2(!>Yhr&C7o2{9mItoM0qB-E*EE{a%UP1=-lOOgpk=|54Q}3R$&x&Z z+~LtTzT7_C+H=~F;NYLjv}JyN?1fAA;4xK=aX+p+FT|NU8d(iB!f6fyvT@rNVXxFq z4d$~69f%CKu6%Ag@<)OksG7i%s_s67YpKG~4FwqP)Z+$IRDA87rLVv8E9HFj5)wL& zB;-9EnvwwS?mJ%hu5Xq~ws#_AA%-l^uL&O2cJrQ}pK>)YOkpUW-hs8suHM(w<`yK1 zKgTliItWNC>wl`pV%rgW&x`kVqyHmhkOj6L${n49Xu}IUb!V!#wc6`B+)J(hz?^|a zRrb_EQ>{lMZWM0`H0VLEAzE$5ul&Pm&Z#9i;R`4jcyUDEeKvX(P9mevjvtbG@M>r9@Q zd8l9h?Hv6jsdzU)&Ku7HucIAAfsgVBzF?%o;pzH^FZ#*YgUaOdUg+se67qgFFA>^} zKW=v3Bs(ANcR(%MFtG`^8O4YgNRX!|pdC(&0r`rnG?quy1%iZ+DT+kje>N%Q+7#|4}yko*OHQD$Q&ZlQFn0;dk zpYbysH%pvX!at_lN@1|sH$S6`3;dv?e^z9cRGV*gDqP)nXw>SB=QG{YL72wV(L0c) z0>zWwNBQo5B-`vIy#=T2RgkFi;gvE$iC=P!Lj%VFeCK; zC_BrCCf~P>t0<*(Nh1hImvpzJba!`;9!Ph0jqV2NQfl<*4#@!{Bq#ms`yc$Cw|jYS zyRYj!j`R2&)517L2QyePpX0z3DP;+#ExL6#y@#pa_}&Q$k#?~4Y8&ye55H3`bL;N@ zj8%+wf2#G+27rAw$bVb-jWapJP>Oy9&hUZ8qNqP%M>>rG()A$d-PkxN*{%k;l90Hd z1zkYzhI7vW_Ex&{P^#U5Y>uvy|7-*~W#oogy>_N|?JsSmg7?o{&bM?QX*S536 z2p1ydrZYhM1(s!-9oO` z$(Px<5UchVW{&AJB^bv(KTrzZ+d$`_9kDUMo@YSNdLS(3zs|g^z%0lnC5zTC>y+BIqEAa0XN2$Y3%iZ6w`!|Tn$$Er2FLF}aO#koIeaiPMXbUo>l`$=_ zU4MtR@{F4D7sWt~9v+$aXHL;tqB5K}qZrZ$Uy6_Q)D4R<*CMj0*-lSBDV`%;tGf^0 zM4>#cIAjV)+@d`b<+;s69!0dUk_T@a9u&w4%!)blj(@6m59*qUr0x=9Jp_E?IBiO^ z4EWQ`4l&p6#~zOfD>DGzc*dg^9Hme<=vhB(BHzB0rdkIPFl z-}1Mqhl;#pz5GFprH3=+eDh!rzG1+D{}-ma?Qq2QL)_Lg;^O6dTFtxgU6LLT0Xe-gFlny89k+_Mwo(VqY-Mp!y7?6Hq$K{hyi7iUPZJ#sDF4)cv%zxj z8vCRjeAo5lg)N#YqR|4 z&N`FutEx`FJ=!rTnHS#r;f$ zKcYc$H47T#L~_)|Ten#@XKhq&{5XoYP{b&ywK@}6CPtAXKFOBL&<;r-6yjXE3B1VZ z<^`U%@x9eX+{&jN^5Gc|NJj2XaVx!jj@_Y6DDSmeB}51M<|@ND1J z44FhJs?wmmjjr(ZITv2*YJso7+7KRZA>_%C;C6~dgj9I_poMv8Xs7XnW4f1S9Hae^ zK_^gS?dsf&s(Sq+iQ~+WCFpHNf$;-f{%c3azomtDKD~dgXCTkn=v;om@I{P|SWly( z4=)In=t1<3NlHp1Pc+I7QKw@Z5XUNf!Rw(pKE!g}@p}idh<{0Z=fp5~~lg7&Y*8!)Y-W6vYsw^7*yeVp7*n$Dyl{BcU-s~#vkL=pY zyshD3O{wCLX5sFL%ZWNXAk%B5Jr{=fU0)GRRk4qfFv%wf-7sL14onKH);5m;<~oLb z0{$N5tDBZn+zTzyPk~Y~nuV-@_*~MwwPRejWZgjLU^Pb^#n zz+en@i|+`08((WLudH63lUVdZGE^&0x&NLD%F*bsnnz@?lfc{L)FhbmmOEngeYRZC zm`3_z%*JOVRDfyKo>|0q^zm=oZgGZFa{5uTOSP&OlG`m8gOf9BG(MmdPgN&l(BF)S zXOZaWn9u+;M`y&5m*Ul2bZH5#Oe8P1w_tRzc*0i|H_z0-^B(poWVIk2$Lh{oihXqE z0=86))s3h=Z?ULpZO@ABJ(w?Ot}w+(YT zI5uWMhlfz+_i-_uogMy^dR$ncflXsqkS+!SLRgCIRWKJy-+ZZb+!gcgWErG!KrGO? zaMFKvOE<~2mr_x2|B{N4nLHv5{=|B$@xd%25xW)cBgqYnfyz3hcm z`)W_TRD8@%uBk==I<;Y@o(+)%2HJ+f9v%lCFP|PG`YK>tuPenIsfTSup`0nI^zUNu z8#_JE8ol9yQ~n2MNJUXEmvNKH3cttn=$iW5)5)J>;-1qM&Q~_%+V)n~JD6>hFNQ*_ zu5hC}lG7+L(vzJjaSC4T&BV`5FT<;Zq z40JL%bKYD`=Y$FSypG~;FyZ?Xh-TW-;A?u`dhxkbY}J4@xzJ!r+yew1 z6JSVd47ra{Ng_~rrOfiTG_w%Y zF_32M(cnW;Z@zb%N3!-dJS1~_-Wv4nLi@QzHT3>e|8WNpXhbPfmkTZpLWGx{oL%p` z+QSSgT?{eQm2{G6Rg7$~{!+IJk6(zmfQ%zq6qzc-ejp3Fr%@+f@J4 z(w>w{ENi?7aonFs6!hbTbjLt0Xi^*GR00|4~nGm>$({Z*O7eMnuO$dR?(G`i-iL z-ijwQEWEc*{^n*-HXz9~PIjK!ml4{br;jrI3$D!GLvuN1&Xn^W27&F_n&ELGkO zOExxu#YIGJ3T!fk^eh{Q&~)XZS=>{USiaH@aiJYh6ut(_56zP{a4hCge8G@7NET4> z{eZ@=3dz?ru$X0wN)lO>{chlDc zIP8>|i*guyJY%~R?jEgWt>_q)o&lagH@zF6nq3gT#8i@s$P5=HFcdJyb6pnraQfe1 z@cgZBx{f*_x`ZdaQ$l~cWBVJ-(zR4R&ML>~S1$l3quuXgf`Zb=@%5d1!}gjZe2G)_ zPGIQ!?{?1npluy)OU>oaZ-VFW1>%!qm}K#wX7SOTLUrpMgT>9Jxn-SgO6bs>%WC(^ zekRYSyF(d)jwZKuqFkV$XN&HqB;b&w0M5k{`SE06V*0;>E7_||oV?g8ZqBB-AZgmSXBF)Qy**fKW zLYy@_FG5{)Dn95&of)|#yO~p(f>1{dlv|zB)TMmzE3c4J8Z_9mwe3sh zlhl!mnWN7>?YnMrpslcTvf>9G%uyotZayteod>`m7tD}-j1zkp&}dDW1tvU&0{YX? zcdLCjan?BQpOsfokA}vOFmeAAV+6l);ZyQq%!?D#5gUMD<=%v6-fu32YVZa8k|@W) z);mblxyn!atM75c8ZkAJKnr4IfSZWAt-PQzH}T&hOVLVrEE=_RL}OiIHG%DjXf|Vv=DX=sC0+~g|xR~+f z$od+8<-!WaKZu;%Ag?wkVpIT<-m?6BPu?*r)6JJ5Dn(lB?2<3i_p`cRan}G!;St+x zeRpE@LnJL&8TidWc5N+((LsIe6H!ALo#3Q3mu9YPrXPkQ)p55olh4xEm5-ZVszZHC z^xDA4M^oy0&TG$}Fo3%2@vrLT)fEQj;%DtKyz%1mu}!L>@AJU7jJ$uR-X{5nPgW+@*9Ix52>O)HG>4Q(e9+4D=uUJWc96v=mKejI%9B1nz5D`la3VCcI^B5&*ThRfvO5JY(-R47T~%r3wx2v9PirOPWYEi$sH6PvM=66Zf~Q2-F1< zmcK*N_>A4JQmpmR58Kv4+zk_zA%03T;A)qnl(=`Fs+tYODM^1X4gRJu4<@p1XT|mY zd-x&Ii^kzYNnn>+F*CKiy9{)y{}lW{Y3Bb|S-UH=ebbcevH)UPS8NMIE7z|5rG#k! z)x_|k!da<f2`@$~Nv_~jRRaS$625&mmSpQ>)i`qxOr+#c%{ z_OWea7KixDpAiZ{OH_TlB}xM1_ATj*EkMcc*^HqSMpUlmGJqUAtu8|5(PAmgvkfYa z34InAK~G6A8B+S$6xTsOxu*(p>+aaS45w_G)jW==2I4B;YY2ZAOAEDD7o{r48`|8YPP_vO)!PRH;ojb^cihfKO^+hCn zytI<*T-7w(??kPvdFb#Q{jq7hJ3VeFE-vm1&zfH0xoYg&v3a!ihH7oVT@|TNf&*E9 z?a1=tKna%3p(ls%QQ#O&a`C`$nco}mX}H^XkdXb4pEE%VqCrl|C8L({;M|~YkYGzu zGUulEvPlU2mnDP5s@e9DT(kg*z{)4= z0v2a~GFugKiwoywqW`XQ%JyK4M{9 zN1+7e0{$VL@3(6y+j_nALy3i+f6yUX?j3g8&IY$DuPPXT^z7xJNrM>S z2*Okpzi8dCJquQyg1l}%eBLSR&rD?k~21Cn1X-;zIG z(HRg$_j)vd9edjP#I>=sZJqNUUcNH!a8WLueRRKmke4(lHzUW^)*8#Ob9Jt|p&`wo zG~XB>DzDntj1`s2^teiWxGse^!;)VheRmMV+J(otF1gvM00JU9mG5r+yvxhC*(>oF zLum_Iy3BU^V=&2`nE)1ItpZFHA6B?JwCieF(;LtO+JUvNFGNKrS@{?VoKlRw!!vLU zK(-m9YT7$*v@x@LoOu20iTMY!`k%sxTm+1!k_DG(hw zod(b*=fp@-m*!bmR1V3{Vps2A>N(-|D!;8=XgfvUq@#KqqecR3K6lp1P5?zHu%%Fc zp#ih>?`gVp{APL%P_XT}^K2!R$auFw$*$Ze;|V8%_*2hJ=C~-u5x`j}`RT`@fQxEG zhj>S+IyAIX*+OKrkVYozkio@Pb_gIb_T|Bxn9EOJC=k+8Uei$4hT?ih%}SFtR!ozT zdn8ol!_o4*$XKKxPj*WJ&f0a;V5~W3nfi+$6c>>ykP~+XQlI7U=W!9W=QD${5SjF? zr%5)%gy)n2t?S%&!lht4Dx9nF!q~pwk6RO>*HY;lNa9F>a#;FE2%o$JULODFk@-+U z09={8&c;u#5sHvdiQ&@z*v-#tGS^*;1O~4(St=M9H^MM}S)iA6xJ{cmx5ekS-t#ks zsH5F?oBF(GvekQ!y>`+lA@?Lge$+Mye@k@(T7;>cQR*e#ZL!` zKTQAZ_C@aO)@-MDC%4fLqOCwuHEnd}(<6)C$M0T3ui3-PD#-mct){8j+S-VNv~Yq} zWxHaMs}FzbYp!s^)l_KpFHin5z}a%toIk^kR}?g!#d*#hr~YN^ zKeaW+*cU*7%7ay9T@R|&*Y*pJ)9g}2 zf77aMlfpN`fVW`FeeU9SOLmlxZ}Yk08??!P)m{fa2>z!Bh4j@BY#^_fCY1CR_{BI; zvF( zz$>}&Ad3ZkSPy#y;Z<>Lpr=`Jf|JL1(LFLMuh)0tzq!O}X~@D@H>j2KU9C8{`{sYgNBJxvx?Orw zlJ`^NWU|e6y4VkKBj&@LmWn__O&)E(R3gG^{r>ePpr+E z-LNgPG^9tnJu?&CneU1i5{}loq}f0BnWOC$^QP$%Ds__SQeC$%G4-UAIgwc&$T=BM zM6LhZU@CNm=IyLYeaB9c)N^y@V={|O;XMzt?^2iU0J<*+JM(=yvp2ND`IXy^Uk4_{ zV~)|j7t8Iy(kok86qWCc!7FpgTar)6U0b)pyy5#{DQ^X2mN~BeVtsPBbLYgN;Bz9> z<*xc$p51NCArvP@#gR|$pH62N*{}u04ACMl!`5aS@f&x)udLP-83k zt8H;qb5O=f8~PJWP8TXre@E4-4jv2gIKi1D3e7hNW5PshQr!j^9s9;_KK>?wpODEu z{)*!N@BMa-hCpB6F3a-Q@V7VNtj@Q1XZUE?$Q<}v>9;VzE*`Kk>7R6RSLr{Lt-nOx zsn*c^q_snPn!Ey@=~N$RH1YW1(`BUU=&>@L2aK!NJs9Bqq-*+=RvCHKeE2!*K{JS& zn4tgAl_=;7jr*^UPoj{}q96b46(u<1X4G`{0Vq`baVB{c%#WkdIgww2ER6}?C;#|N z4cC>Wq@^BPN8p63Nv5-q|B(~AB0z!P{SoDC0;2a^Q!pL~#w3GI^zSi8p*@at;u7qh z-YD9{dGq+r?N0s7CHL6@rPfP>Wm2kooa0F7a|lx1($o*8NZ2+e&ePg^6CUUcwtsq@nxOKR#W6Od4^Kf0r_w6NRL zt#7u?GGz$+Cn+=?@kKia@=T3}aLkspKd*zKR2WY?5H9kQ^QRDFM2k=0z33z9e_dGz zu5Ltwh!5=T6%Ce8+ywe=+n$A$owH%}&67W)fhrM^k(dQ|Kg+%S4d0I1`lQ1wkUM`p zzXm_C1;FhYPfW-5`5K!d-CTXVmfFv`O)&UH+bVL5nE#a2FW6NetXiHCc`V_nPPx(r z4O8{&0OBg^;p6r4+QOr=71!#@Qicxv29482Nz7yT1d9Zt;n z?{DH22m7}iKmD%9k;t{@3D>&aT0e*F?EWTpoSq?#p-@aZpx%L$<(-iM8z(o~vVHk< zK=`!z8O2}k#$;8H)w+}Ji5i%0QNB>gJyYPp@|CTQyMMiyhMu4U+#WjCi=#^ZR5s_K7 z4uI5}d-^8qL_-p&sY>MTE+jJerblqzk>dwNJ+ot&V$E=TS3MQAN=O+8itzm*ZRKY~ zpD0XKb8oIXPnd=Rl)WR6mA$wN^ztKzxCoEwYIGqpc^>W&FSZXB(2ja-P-M6xL}lOJ z(R}9<4BM|~YC}{gQXiWI8yfQS2=s7t19uIM$39bzIwxI`+UVP)3>E}qHlCdZ@k~b` z!oFxxQeW!zoGVQN2=&yM-NV$xrM7Pli{*)0Ypc}{(>sp8OSg7Mvn18HX8PqQp5_n= z)HP->lIga~axuCUe@9i){Br%TR!ym<;n?95*V?N+ltWG?CdEhvqb(`7DPlUDIB_09 zV0cspbc((7gvr<}d2Ur;@z4(G2=>g0eDUv+M$sHWqrG-|t_}>j4SlvP;r)ndYh5on zNe8|B6vsiR_zwZJCXFFc`gb+@Bqk$wO;nkOI^8weJS&z;g#@vEV z_8|Bo@=q&+f7U;fRNW|5d~5m+S7-dURdi09uZU>N&b)~ z2$(Y$Eg>l%`AB#n2hxL}4mca!p&?R#4vq2f`CUqcchA%P`9p+&V$bM)7cd9@aS73~ z=Z$HxOgANpTgCZ9c-ER&x4-Ykm4}n!(pN9bRM>rbAM*ZvHW~B%v`Z+L)4WgVj9Az% zu2d?I&odn@*$dlbEv))OWk0u-0^Zh}R-- z2QdEE#fblrM*P(qu{>QXkdMr!w8d?JZV!w*1eIk)H`?8rWyZIcRf+KdSK333jWDl< zXe;W=rO$R#NC{MTVBHTX>BY+)S)0*()Nh+pDnr*8 zPtE0&pR0Mr%^r*T0X=2?q_vMIYU5SztH3k?EIBf_l}(RNY};H9#DGFFtr}IQxtxE3 zQ7Sb=p=zIc_d5Lc!^6}MbZW;iJb|(X%v(?Uw?G&!$PEI}u@us8_x5?|N`nKb^RHdd zg!>uJ*FLE_C8w|Jmv)}ikt^C7Uxg--{$@=Zs9SPdO=+W`Z=L2a*g z`9YsN9qg}x)#%r zGs%k?)vW0YM`|6j8TPHrd;MhNQNcn_x41QU_ii2wT(n%oD`f^8!nrY7=xiKcq>OQ7 zeQ6kwiYaq_-~0OgRri<{R|tjvJ!);Kt|hEOPpSUBp-uukG2_!AHgW&8Zv!6+bCu<^ zo&d&klNt?4g1Y4|{n~;LlGBx#o`AIZW!#5l<~HfokRd#h4&8|T`rQPIwEnFQY)TbZ zGo5D2>#xF=sGU>j%#-01O4NBPKD zC7@WgP{C@Js283_^Sq+-YWRrw2&=SE!Sj=}nw8zknd=+eRVM#-8;vyGJGc;_71|E4 zK(PrEB0J^(_05CsQZiptF`_w1KD}(*^`o>I&cOr(|NODQmAxsr>sqDVp{ky7l-2%1KGoie-A zBx2?rr3WFt4?)p;IvgATd^y^=YH~2*)36SumWz}W|G_NT#rtgDvdPPx~zEJY{Tc>yHwp`u2kM%&$7Fia%%ha02TbCgcS zm=M)sxvL_B4PK)PuL%Y!lFU1g$>gzjjtn}-3c7e4DP*BJ+67wdS zv>V!NerEoduL&|q97vwAxzaP7#?5^(zI$Xt%#-7gErfeO2~1$Y3e%b89Uf4OS*l|T z*#0k$(=XRb-Q${fBsZp}0((}J-%ly{bSUTRu zH@=u~Y8zk$KVxCVa=o)k_>DeWU|K@cNVxxx>0>n@w%HspFnUeDxsp;Bolh=8mHk&M z=FdKv$c0d`5FL2V%C7qGvJNMi0$cJjUy7XSU`{-DQU0!9`+n}>YtF!wr8{1yzgw~t z#ww=T@$RDEg3?Ga+8yUOc2J(I*EiHmWg;HWS%)=|#|=NBRL_3S4RAWt$y&`oy@|`G z2*%E+2r7qFyph(2ge7{EI6F}3ne zx2|m%AHpVleX;!w-ts9@h&bq^BwOy9zL5P`fY>}1Bm({%YEBQifU_!z>!Og}9PRj% z-PFvO>8)M=EL)`=Rr-l{@baNV^aJd3e{TGgHiw>XY~xDACg=P9ZCjNV(Ap%!6esM& zo+Pw=l7)`aLxlkh_1=tThgVW(KE0!4jAjpYXZ9!ifxmKU%PB$mKt1yi`l$JxFQI9P zebnkqS9*`)aWu95Krp4@GuF6IZY^m7E#)v@eKL7M*@oEGi5X?8n{kePrhLgst)p;* z%dlmMcEc;84P?K)5n&|u1IQObP6Bw${_deVRr#q`VOx-iqSRMW@WVm`g+C(q(0iTs zpC?G_<$a=sHjr#mJ^v=F_-s5NrWZI*3n;MTru{fIK^kYrE zn}1K{-c&WtAI0F($7S+z^~`tjd{nHyCy}8I{Wj$jp&;LKE%p#AH&t@^Wd|;FX#}=I z%D}cvm|SOQC)U~|vaI5ef@q9j`#Ud&O>9pumBwlM_=u2WSeiS&Rr>tmS=&LuL`QA8 z&Z7#|Q|A5%NI7P!u`Uu~9gd?6>(9eL5DIL(M>>xheHM*Doxl7#&jYR!G^X$I>#M7s zjS#cd4R4lwXWJ0;?L&lO&ItfZGc$<#(WGb6aYKLDC7dg*lA(uJNvw2Z=*|{B_-vpc zgcUJ-!%;f@{T^~}pI_IH#wc{xX%{jjT=;P=eIAR#HMd!qe(@~yvYhT1(wC%zUNk!r z(9zDch>L(by8mjMC#K_K|0;@hdZe3Tj~1OsO?+x<9X6>odT3sN3Ng8z>Lan$Fm4B zx&j+Ek=lLpi+L-&h?1_Tvg}K9Q!)^m<$;*nC84S=hc{^FS>D$Sk zE!mE85%g3nK?f(<6AZQ3mPbM_qXxHI{fWQLwCSd_nwB@VmU6TgT_MX1eQi?lN;+t9 zV~DQtkIJ01yMrHKQv@RRU2fHN4+$)JL|)379uJ$XC0@??vSDjGzKV*FJj6vDXEsOl z_hLE_JCBDqOO0bgq#ViXuI+V=F6Tdnj61bQ2VQE&eNL478DwUL;k{^}`xa-j7NO=; z?RBuGp$016Z$|kVEf{x)?Uavm>vBV)QxvLF0V81#od!m|%Go}cuGO?nLmfD}Vn-*qQ{xl0<4~-1(|p+pe(b^S&bO%CJL5_7Bx^TT9cz3_ z*EJ=mW=$t~cBDQ3Q41@e)@Yr7I-|9QH=rp+J0Y>p4%Ku*%|X<<^qgLUpj>rJF@h(( zmsXza-Xru*?2e1R=o9nSJ&ng8qkb9&`x>?7%Vek>_?F=8z8fo26f7Rd^k9c-H$+4 zxB%o+3u8iKmE60u&S5Wx;jCL;Hei3lr-63+B1|=v+C?5814;@L5xn5^?PihiG;2~* zYjHSnY=@(70|^-hH@}#P)IbonrO5)_z-A*)Tv2XSqj33>m^VoesJJD!f(m1;pF(UV~c=XipzW~rjRABS8e0v+qwOa0o~gngIb$whDCX< z_+HPrcN6ydCqPF5({Hd$0V}5i$%s3lXQEZ!QZf%SCf%{B1IB@8Y;TS1C+#ru5wpAv-?xMzykrG7%r*c~^1LV!XyI>%tLPAc6~`2mzT zIC(lIFnJH6Y|u9M<&bv0`%^#y!{^B`bH)>)Z?eU#@NJ`vaSkr9M+M^-n%Sku4^M9a zD&qO}Qn}?3tXwQEXCK<^t%8G6he|wH?_g8X!`aE!4z`gT{9&zp6>fs@e>=D~HN{t{ zDrhtDt;9n*y>r2bG30d*+D5zg!T>9yFvpgTIH>hZStjhPHYE6ydx3aQ(z6Pl8)=lt zr@*29O!|SwN-l5_bVV!pl<`1)0%NQyC$dZ&c6`RMt#FtdwR~H37*=GvT5*5$ql#sx z@yfszOGv__I&+Tqel}XRjfWdifhME&$dWSI4G#>#ml*&QouG#wY{Pc_VY|Z+@0T3?Q7COyE_$0BUgpt>^dCyX>KBI}pfD#A_AM%U7jFp{ElMNRMddHBq5&nU-@Hbj1^TK|ND$#l1`EKr# zz?2Pg!A84QO)tgH8Km?#WB1}j?V%4>z+`~d7YBkvt{ajFf=d$zGGp{RJJd&00-$M~ zNPQFHB&o31>7-vj&n9pRVbbr`S|AkyLl`=>W{w5Le-BH3LcPrWxwPN$W$4lBcqi>! zMJ{*OX0BaqoMfwF9;CxVBtt5he+#cPy1_{wKPIeonpR0uI7Z4V_SAYo7iUMxP(vv< z*u9;Q-;b1EVIuA=SDGx^0D04=xu5eu&4UYSPFWju^=7ieZIt%!Ksd_MU858vC_!Wb zc1XHpjCe)zp8vhi6I&uF=2MDoT&E(@YV1?YUT0gS;y3hItr zuw3EV*VjA=MfSS=?n0(=P$vur65M``RK90M7w9~BaLYpRf53+q`<1CUH1)64Un%g1 zMHp1HH-Z@pPqNf-TmSyJ&^K!8%lW|NH5K~U=R3zrcFItdCmiXB86r91s{V_PsTtGx zv4io%-ksM;@bL5Z*Nbdn!5zz4xVXvZT_eWzguf^Go!N4U51j6V1{qsG4@-VmVbK%Z zs>B^M>8?g4rqCp=K=e=iZrA9=7-Lg$8v@N!g!8TuTrz;qo;pk-^gYSNHdpJ$5*Ae~ zWMl1qbf^3%Gu*7ZfHbgNQMnxSS3%JA6Av|Z3l#w)-9+qSYzhb@iqI+$IqMt%U3!wHPs?;>+YqklQYC= zF&xvKaCgrYSkxcywy6=RrCW2g*4cluYcC6|LPQ6e1%^4?lh>gChCzjkIEIEH!n+Qaoc!qT<=7YwZ zEG*i4Q}72X%DgH$`q1_>wq>@u>HReEelGn`c3&I#0e*lF50aVi1(uo}j_`f7QJT~R zn#RIk#n~>33K|;HXHe{Li>~hUoUi5~1O^YUv{4BCl+m7t`(ggQP882=Yt0#zxp$!}ki!>ZOnA9d?8z+xJc zqtXb;HC%-#^F4Z=cmMjCKWp)+&R{#|QIIC$nDMGi zAJaXsa!QQb7cv!8U7cfLkzoW?G163ymHYzqIM038RZpY==7t)SWQ_8^J{G(EcMPoa zIShM1RrBPpkLMKhO zUq2&alFEooyhGJgHX8Sjv!|hrxV8vmp?Ss6dkAz?H8b7r0sBaKJi z*c)-B95d|;5Iqe`D!8o`;9r`)yIkt=n-gU87cJZwlwX#7ad8&w0y28}BYiic%>u|- ztUq(lF^!u4UY+pDS)Hu*d%s~_r1fpuXPCA)b4dFtTwQIc{CtmTY{)x~@1!%+;s*9| zA1PV!Ieql1y#B{5rJ2V+j}P`QueYk|TM&3Vo7;ah2#x9LX=9(1McekDQ_QB_Q!^OPX_B=NpuabfjRqD2J6 zbuW3Km$Cw@2~bhN2zSF?a}NqX=3A__3a(4?j*@b9#q?ltY~e1^6k3yDxr7*pQ8?8O z(C!I-kFOEnsv32@Iz_X$Os;Mg(@<~JGexvH)DY#NNFjd>R>`^bL-Maznq$P#pN|`i z#(b(zchAfNwvLf#dJBEPAW?dQ8-g7iN<~2P{NYIZLw~XkwsZrk!qC0ZSRwPH>O(kz zMF}eCTe*qcyXfSZ{QFFOro-w5!i3TxaQphhDG|aa`@^HZZjF3eRfMlsNNu_~UPsQjE@$qb$TBt~Q8Jc-cv(#Av~T&5{sNqEM`C)YlR`?{+RuE@=+xr1J>7?vxm zhsSmQ+QNRig2rz_0u7k{fVe9y+qT5bRCKQOT@O~!-mR}~-crzq>pBEkS01-bj_bF; z*9EcehR=hz$%9l@zl%~LZG58oy8Q3nAh79o3Vn#n8O-avP?_&pGLbuAdyZ1WRP;fv zj7#`seH`&y{Qh!^7(ovYPS*?wb$mpg{^=4NT)tz~E*`t!DO(uy^i zadXm5k(*6jimi2Qb%+)FYcuIWmgK7phoG;vznPVLmtHi-efIwR=?_Y~lL>#;fpkn? zCfRIsQ#SnYSv8cNKToeV-h(4tJW&CofBcoBeh8Z5+vA}NAJ#3#`S6V%!~ZB%ry#^4 z7g_z5riz+!%@36bjus!(>OWPWlwrwh@Se5Wu7%RP2$U<}( z@B@cTsV4432FdNAPAG}}4}}j4`cj`{&;a8S$k;eI8d9AIVy8<_h_#{nH~Z0`x)1@r zz-?SmsPy?F>zKXDL&5GhA)5Jmok%+Fc@rKPU~Fu|tuM+i^o6Qc3e%$n%(#ALCA0a3 zldlOezLQivCQ7L-(qF>lG(B{??9kCZE~IrmP*FC@A7V_;feU_YN>Li2NL)h z-fUy#A!3~6qK^uQC%*N#>x_e=>NRmChH>Sw@KNE|SVGZbWOes7tSv5jQL~uC28agE zFqz8C+37I)5^Riovb);o zL%02z$wW&*ieg$-gAza98op00M6Ph&c&`W|;O?2U7~rN5 zCdbjnHg&arEfcYn6DM5unpyFRBr%wok7u!%rHK{)(_3#(1p2}H?m*s${zn5 z9wc$p4^9P8jh=QGp&k~JmVsb)el=XO9>Q!wn&vh<=7etYI>Fxhdm5$D!E9%KeA)#=X8p6GGw`*N{ zT{1# z%BXbas?!_sV*J}UMelXh{St8n_!Qs{grINfy82Wo_6oG_x?S^dSw`%o678gRKuXZ| zl^>P)4X}-z)EF)LSlw%C2b3<2u+sunQSp+>oArWnJ4b58Ex<6c^#hU5Dmcs<6RBD6 zA^1sMd-bRx>vtA$g%4%tz}UHa#& zy0l(fjy`31{p_sQe!2sDdD2OLlV#7yKA$fN`C-)P>V_>>G#4J z>skEFdngvf{_x-Z*UBK^cYsDc>vy(@e>j%3s3~1fR{ab)S_mU!1%v^eoC_dUP*tKy zKmXPl{ypIfDl@ac)ew&1s}9QUg8t9TqZmuZVr%Z1(7t;V1P=PtE!Uk1YGYq4Zf|Wg zcf@k#BimyJ3lfBT*Z27+M@=`6&oNF+-3V5Ys??UX$0HjW1-5y4Avg?iPxo0VV8BL! zKI%#nX3x3UJxw?22(ci7JO*XL68#Ou6%_3H!V5nFV1um6{wbRJs?N0xQz4z7o#+aG z(X{S+wBB-QY-j=BUrWTmX%y5Arq=44d)>|&;qHP(qWc6&*2f-8s)6enTIqL>(yuW% zT47xGkHuXBH|ZgEX|lAikYqH0$Sx5dWA;^hvz6?pxo%Zod)jhNHvUd;R?QKrv1%@B z!J2!+yo5~O7D+co9~K!9cg-JiDO829B@8QHgsy# zE?4!*m|Spk-NQAiVf{ZARza)K8ACBN{qvanz8I3W9v6eYpkhX3D9sF38{zNnw6 zxVaLqPj&#C3Y+ZNRe!k78M=ZGb&&be2^Uj3R224Ft#&ZRA$)Cc*BiB(2{rINUlX&G zV|BXORLtAdb)T`G?W1OX2K(fEbOm<}A5u1A*^b+H*?y~=rxL81<2_-D7CP#JKiQYg zd-lD0O(u8L6xOe!2{nBVbg;I+zgDpbhm6;8Y`yR}?ip;v<+@s{>z!DyTNEWl`K459j1TLxxzG;S?f57sXO*hzCBpIZdpvtw+E&1AT3e`RX_OO13}?iT zw2Gtmi;@k=6+c2foXsWQ0S~|GN7gtulnyaD8%UC6LR?5ic$iDEOgOqlv0){n0E;bI zPk%5GGufrt$B7qBohwuVxo{0NQzj7e&Sjj8Afrv!)Z%BP5-%95{=vjolMQsH6N|4} zrd29TB~{hju`tGnDDhfsd5zktg+!@sJh$V|1jpoVlddknS)c}wZE?ik z>*kux#c;BbJ1H@@NwKEMLx0fHTtn|Wb1ufqQXN5Mc5taehZd=fY;<0W8kT9!v?K+S zeNoYkwC>`KKN~FA-p4M(bQZrxQs78tsC=CoW=Y?AX^Fe=)n8(f^ryN=f8U&hu*?{l zNTb?>R2X3uHZ!rT`Nn~vM;qoB0!bBM=)v6U#%fa?wOS+V_f>1viiNt!!e+=C@ufou zJVDh0--NeAO;*Dz%6>K4*RLgxWk%kZ4@k(2kVVHI)EFMCKGN`h$y1}1h*aM&v>~&L znmf`g*wVt+ee*S&PJbPeYb`G$u#VVhofLdvJaPF2;R$<%!+`&0Rcho7@}$&(>4G@l zlU4{wR$8|ROp#zA(ru< zrgMtFkByB;RbU}~%0+BXznF)9Dz1Zd5=cZ#GfBC%um5Q+@5h; z2uvj;OB%~MO@36nuaPIkLKqe`wGA3u57vrOM-JEg9=qde&yvA=r^H{$(J+AIHA5A~ z-}vWtE!XZVBP8k&i3{y3imZ{8h5OYLwG7)~H+`zhCAjaGRZGX1?TL@5`J+J370ksH z?f6d{mTtH~Z)0}2(k*!8pAC2{m!}_pW{j_-fBd)pwKllt=HS2iw=K_dfeTvE-+r=> z=k_iu(q+TgL!MPgfm9#;nAn|35sf6bGUGt#f}X$ogztgq0By-z)+L17srAJ~fO#VG zqLpN&!wiD0jMl_Q+#f9_imxXh+ZGZ!sr9>$@kBZV`=)9FXI;-v+L1bbJ!Vyi^BlQ| zwB2IN@wBtl8O{(N3FoNuvWQWs_UWTMnWIUyQ3TIpTXTId=0%f)FCXq6PN(>%b;wZ8 zBUzi|S3|x?s2K@cL1dAr{Z-Dw++o&!Q+l?tL;rB1rmKhPYy-u*nIIQ3O%accse&}R zKFOW5cH-s`EoTs}IFvV(uS!2Xq&k1;Nee+4)iQ`*`4*8QhHIVwYH}MotRWpqtKq}x z6OSp4sj(+9F$Xx}Q9~7?LA~Scr9QMgMrIo{#X(*f$;0Be1sM12(jyOIVCe=o&0QFf z^zmqUv^|T}$+>z1@+z4=&;nc{A!Bd*j;uQe0gqQium<}Hrcw~D+gCdTajDebKePj|!*i7{H_1@%>yVgeDOH>y$COJLSDHDlp_D!?^M z{O^gu8s2fd$qr7Wry8d|;gj4Qc}#zaAb6|kOWuL`1Jm)k%K*Dz?Vl}vxaXShLz%En zZ!wofG8$pndu3r+A`gd3*6^pSXS-l<2_Hrkw|gtB%8nK29GoxCE(d0r;Izjb{2FOgyG>z5ZQ%Y~ui8 zJKE=RocRX+2sja_7d7>|_L5I4sqm2Z*o82yyNqScWI$;hrro%U(efvQn20jA348wd z2YRCGul1nez1L&(fFPLs2ca=q!2Lockpd4H6tlwNCoFAs{^Kn#@}3JYttI+&6ds!- zILYyiQh|4y&Xh)?xaXddB{uX;gzjwLl^oDOJDqE1BC~Tg7`2$AB{$hD2uLEKlMF&B z&BO(2zFX@JOyRhQ>GChae0XJj{MDT<&^+R?tA)du8`}=PqnANelUfDsgjWDH$fPm*5PO~f92 z38c==$~10*#um$=HW{nVNTW~O$yAX%DFl}90^qC_<{~l8E*NX5Op!JyJCM?4o!zH@uYjd zyvDQHzpX}h_H4W|U#3ju@)rjAKQ6t|!!k^QqdprQwO1=v0lAQ(b68GM%AnfA9nCA} z6cTFpSqQ_j8#Q}t64(h_%7`xFrW1O;$7t%8=GGqXpY68S2Db@qws^2J#hdpdFW4aw z@j3SifN@v19=o;DRWZjQ21x0epWzRGBWltg(83R+JXE)96oLV7E0&446ZhH|7|(+NU-_eymnrTG+CRB$0HVqOo?6K1EB zNtSBTZ}bVrf|s6GT84hK^sTF;xKp*{rGjFfqwA96ML+GefiT+8?z6^a`h1pyNv;#IcByo+T;_EX z?pNF~dy}+96C*09ZXhj(%v!tJjJmoFc7k+;OLo1a=Da4bDL=|Ihx53ktpZ1+LJq&f z%CA5qb>rh3A-swN6g5kLr)NSib(O4wXfp#>y0w&vU-um5y5{$}dQU#v6ydtuyvzBE zp$YJ(hqyPW$Z7?A+uSJw{k9Zv6`~`7=mUXgfkM6v6Nq`ecAu+FW22CE4sB0>-K%#%a|G zhV2u0b&VYDsLZ)Lof9prVHIC5ImcPCwHt?6#{%xtTS)ll_HVgcR(`)U+qaagAh;Ex z@ehDSyj4QIw!f8xjf?c+sn1!i1X-gzCTTa6t-VO;;S77jRcdA+jNbuhl@o<>X`>Nl zh!uF%c9=Wt$V2Cr}*K=Ug&a7fCuI)`z$6LqyZI6vKHVm z^wkLUItaalnI?EmqM3FW=Z)D~LR`}<+b*>jbW`w8YdRO3Dy8z!thNLf7O!l$MME`N zEwIhm=*|ZdX-7X}4x|rO#PzsZf31Ivm%+v?fDc$AavE99tHT`h`h5c(LvJ|P8UzBB zc`n(j%W$uFb8P`W1Gqjf&5!6`SluFlglVN4`@DFEUfnud(`L~sgZ2y|LF#3;V#8Rg z->Xj5l&9)(TM)>#aF3(PJ(V&S=d7GN2A%|$HaZ5p_`HGwdYpnroPEL;%mwlIKbES= ze{U2Q1`7Yx^mV*A&nL0aSQdW#i$jaEuw0^2?EnCROI*_t0Vgie;8{vzhJp7HN@6RK zDz7#gdhfVbVcZ<@Cd7PWC;q}sSe#SHQwcj&Rh!oTQhLhSFaMEWNa^zV7}j_`cJy5F zz@~5)#ERIDX>Vs94;>mUC&~Vqz2uO;jrzH1$~Ns0RaDNs_Vr$WG^+yct4VJzqviFd z++Mo^^450W;g#EC7@bVuUB|ql3r+meFYjIpa1BaOQzKpc8%ksf$%+qpQnHNM53d-kL-WxbUFH}!(dr2* zW5o|?nBgfjH1S^4Uf>=d_ytS*w6SgxSGspC8hK3gO*uQip4tcqhoYz>g^!BE%8@h!3VGE4bI*)Z z47i2L@p(9!SU!#^dHOb!u}Iu0MKV=w8;-jQG7>dz<%`vW1V5K*Z=Ri}jk{XlT{KKE z>{2a6H8T$%s?ZhYp4mm7h>Uz;A*z=nw?#T5Z$HIQgN|plu3+FYFY<@3?WuJQ(uk^-X7_9QVe=V^uL?+rWV1sdufqBq8PP{ zZDy!$5WOvj$xTP=2Ie>G$;nC@%T!Oah|6kGFymvKdNNz!OuXsA}M&L08F-*e4S5gAQy#08fo77wec2EwS`No${#)1_7c! zlArbpGo7^64^?8EH>I>v`unhK;ADrCLcZ&DRL|}>YRFnHw~VueA75eWrR|3O?X%Mc z3p2pyPRhIXKGs%2wyd2DzoI}$v=@8S#ss4%k7l7lEI2{%W=lC>7Y4v^g$$5ZvSww8 zpFr=dza%eg2%WXf7*+C35ic28%+41h#8uXH36xUZPqKKkjyWGp4iv53WT zudJ3Z-(;lf(fmN;T!h@D-n`+m$DMobjiQm>7XG+1&hMlE->1dH57Z-sj-x(77$aTA z2Zbdq`)!y@Mf^W=b&PgsES$f`J>WJ%IMj9v#-aFAB621hhnVSP%V7N3J zUb8iCq9)SdL;kSt+0&pRx^|x1f?$$U`Bp8R9=~Insj@o!Ndq$Sg5o4FZx=n{zTaXs zJg>-RXGdl4*Ry{;(6xA&9sPOg1(sEXICf1Qv=4jl*1mR?9`n2%C?Aas_2l(#b`N-g z+`!DjTYGiHN{&9k(6p@9nsU}s5)=B1GdAHR#gO#S!%E{fVT703xtYgLf&R&#j}Z?N zyA;CsD-{(h$pp%J(k@(l{0^gYVLC9v6jNbaCFYO4w*#}WG>@kNqC`qWp zdAY@Sz^RPD&ewVix#SLX

    #9;P3F8T#IVo(|&p*V>zcSX+>>Pq>7YADXBxj!&f@8P8lbO;8Dz*{X0=qFfhwhReIB(g*W2oi_e9vekbtzTAhC$hRi3;=79@OJG_OwUQdsD2?d`D)Dr$T7WpOwhKz#yADHDZuKB(J%U`z* z0Y<$2`Jq^~Ezrf`Gm5_m-n27c(wep=5ra*~C}wg`FX*$OKz%L`MU?yx$F{L`j#nMS zJC`CoOgGPfXFc`r)L?UTya49vrx7FN$te}UE8d98Gj2OGIvf>mdBBI}OggBn*$da) z!ppQ2jtzZrEEebIE=i~Y_lGU8U(GZzz><+~?+@HbrWXdK@7bq@!Gt|5nYVYH1t28V z^gfd;S{rv+5^QWSeW!^%G7!ynE`*~#M`#^Q;t)7KbZcI>h&(XZu=R zJ4Yf*kkjA0F#0l2vhEHRt@OIYyJ%Fzq~of)wl+pj@mGPs=}~QG5bB{Gw?Bxl8}AE! z5Gc-*%pIbx`U&+dQ7D{6-Z3_w22Hp=6ww&?mw_f{MD&*OZ447f5-KgjxQ@4i;d>E#t2ThO-tad z5?!~-i3zr%n^Rb_Q-4CCwJjGVto@v)l~*~VkaVOV!~EiFRTAdL_m0TleCQ5L(>2y4 zbMG$P(WXWEO{d?@EfDdv#qm4Y176oZr|5t5YmaY_ARnxb9x4C~wdtoINqfKi`Iip| zt$eYgjU5k|aRlt2a<4PO+)NcRS%CH%rdJ=91Iv<3ZM{sVHD1mi_hngfIhe<>^h*Oy z{Se<{f^fh4B6qgOJ%*S}qb)OqSI=R$Zr&l8`?qZ#|JbTm8&dOIb5y06(0ZD7x!F`w!G$%O8410fwkV6Ka-C z43(!mASLt;C$Esl(Hv(2@O77t@R@S*7-6Z!JOQ^K%Z{>HZR7=s>Tzhvnn1%6ab$Nc zz`#x%thctX=Rmu#2dYTYpHzTtSZTjy#l+;&YY%W(H}%l-aZ1v*XuwlZX`N-}-YKES zGLTzOku&0W#Dupm?mZ~i8gv(G7q;?ku5o=$-z^g(yloipBB6=I)Lgfu)|N^7k^A<{NW1+Bq>b}3$hs5gLwzsD4 zggb04rj*RZF-@iV(}c>}&LGcxQ)9pCzxL8yyDMY)`4vuqYk?gNE0Q4D>cQlB)6o-e z6u;Y>9$33>^fU@H&&~KIQRuf1KM>q`RUa3x0}B<<8!Y?ki(Vue%l zwz$~h-ORrQopP+~Wf`KSk*R*CHX2Q|oV0X`wTRZ#rF5U;o-$Hg}KpXdLnq&+ozH*;b>sg`Se$CjYmm z+p*jyc~>y}CC$=hgFxnskh?*fOZJl~E^|`plt@{xlCj}^=1Er9R-NUcerLtimHP>!1OU_lPZ+)4# z$iCd90_sxYiBW@QDoBEjC;B92+E4(Qq;pjNhD6jCoCAd*fNdY2N)pmuRb~G01!ryJ zl>VTpdFmgJTD(CE8t3bi?Nk43(kc=W2L{D(x;ZZq=Ys`1(_MD{d_eh-}z} zstzkm4%unB)hJmW!~E}P>;RVRgF(wm)gNeJUwVcITl&W0ixRmn(~Mphs467*xSe0T zW*LOH@9v&jwKNeKZjv|GmMy32k6S(yjbrN17K^)IyJo@Z)9EH#G9ufpO|M z`&V3SZQ>##m<6wkaKiRDS1aO#p2c!*kvE zPFEl9=)UeAgoDspbkg*?`oM_L#a34mBQIE8p6a24Amaaf>R;)$oY$v~fb`v}lG3Sy z#mk1QgF74%wZKYf$&s{yLy~4wLGL*8zqY|K9$xgGpqqW}Nd>HI$F9qdzK72_j{frD zp~!+>q_`}94(`%#>Z3Un0cc;vhm3}Hj7{U03IPCpAU|-;GYN8meK}*fp~h4*l;w2L z)iGG}mU**lg3q7s9A;$uFGH4xzn>>=Geh9!7o81#=i5E=XB+B}H-Vcnh=0A{tsb?G zdiOVaU%Z!+vf)#zb_MXL{2mJkq#;Vvm3Y^h)Kjv~F}?1s+17Cjiq&$s_{#I=zxzVR16|Mc_WrkF0lNQvo1RD4r-C^FI?S#6 zIUf0Fy!Vf@1@?rxo$OXZ7D9W5K}$^^r|ea5MI7iY7Nza;3&`2XHKk}SxTJb;;Sx)b z%#@~klYm(_*UI($V<`iDFLXZ!v@f2vC2T35JRYOR);yazO7+P|4Sy%M{AnE1sdHz$ zE~}zUK1d{vlwYiyt5@hcOYqrzN;roHR^mXfz*?q9CzuJB;I+e}4Y84P>yE1+?7HifatP$a4peM zvJiC4{noK$c^VV^O|Q{ay3XZ2qy*1a4eE_6fl!41m)?akwfwh+eot!zEqh%E$*!uwyx6c2M>^!1I82t$6XoGX{gUYI~*OHI;zL(%+EQ?lygPK zGQdTW_d03uU26s)Cp2a1i^ z{4bd2u2P|bC*H|!!zEE5+c;~L-{xYo+dV^gZCf$z+3}<=N3aX!R6rd?8z!WP;mJ2B z;~(0>?7qyD;QHoLb~swquG+Q5>J{@HH%}e7`6pCN*@#1az3(~VN$#FcuqIT9qd+CT=?_cjK{NMgQ$%^n`SMLr!J z*=RDn;uw|h=JP(OZ5oX0Kq^X{?bT}VPQ_;*2>U_#M;8uSj!9hvs3U>344{ zUwK<0Lz_c*6;oaA@}UniV_Kli?~0fo`taYb|FeqCBk38vdc55Szyf_~-#<{0M}4=C zzzK}r;;yPTty%~clBYeq7H0oUWou%ZennK;nrmS4ZyLHYC(2Zw%K5Oeq| zmX>I>)x1VJ|A{yKp{MZGh!Mqo`jo#jhiw} z#&52@hd^e5qVgGn6mH)NiVZ!R=Udh^)~mbrefe_w12-9pQl&RUpx2x^32SAz_Sm4% zNvDvzs)Bif0Mm?jQRYir+jc*N7O%a{-4`9D1GKzb^Rdk)NkBZiJ*^&||1MBib9E;y z9GkGJbZC_RX?HsT*9@(KPKi$Gt$L>168~iCMlfV@hf|LGr2|0;YDztF`nd&Z78Q%G z%SGg_ACD616_IFFEuud$s*#hA<^_+Bw_N3s1pNM(4;+AhiIItC%IeO?YO3V%INVk^ zd{4{`R}HyCZLzy_eQ5k)S|Q`qUJkBLNugqh$8}A14}Ch{L7S?qgnBY(Iv#KG8i893 zg$Lb?gr;!vA4)fe&=qd7IV(=w%8I>;$1VKP0y}4JJ1g1`hN4 zXP)MviJ6rSnbHI^Ylspd&Wx^am8M5$s^K<~F5Xx#vJ^0ul&P|@+DHIsK(EY({Ngb1 zspHK$rydwW2gjHHQT}z}r3Og=-hnL$u4i6S5>+q(Xp&$kH%keUT3IT zFGo~LGKC)YTKAB5joq;KWqd~xL@u_>f}CT7sW*j+>nM|iKGTA=Jyq=^g>brtGm_*U z11?_7a@pQoO&6XGGbYdC!e)9eR8D+TLB+Oj?Mvl8VuhjB3y4Jxefj0q!K?htN z@b^&CuHx46H|cK)1oWerHasj!s>O=iaXBNkXX_BOraW3YbV^I*kA~uSU%r;a-3hFl zpG*$OcgFj_WKxHcp51u;sY7r%{tv|U1zlol+ck7nQDPpb3;XjP(=Cbs60V1M5w^5V zb&Xrc+Iwkw?%{Cn(q8%Bo*3S+X%zxSZ^zrPs{k5!-{IwMzc8t%(jCd-o~5OUKw!)p zn;ivjdg31e9x1Cs@s)KvwJu(0=nsr1jFVp`1Cu>>&tSvycJBjR+`~J?yY9Mx_$h)% zpH2jAJ~vqDbU3B|U5M41KGUJHPW)`*4hmwj7|;`=5bYAP{A#n|Y#n!6-#oBoe|Fsl zDW{q|MdZ91BJ~Lwb5+bWUk@vNzhb+jx~au7>=W)LTzHIjyD}|vD4*~{3td!3(djVk zas2z)CdflAROo%fEyPEmw;hml3SEYyHm8bhS#Z1;_@PE|VcGzWAh#s>_v00U;R2Qb zf4+eWe?0cbE^(ZC^$!`XR&?q0^fG$^|JRC%-j{~M<%lT}D*GI}?wAcGzqu%pU#J%!omiPS9nz(we@Kc&ImMCe z!W5|<2){z_tI@>FIU}n2&10^;6Lz+%Ctv7^EXgZS#FQl{V*arsG-zWBG7r z#UujF)@7ukFu9tY))dJW%9>I;s`{4FNcN9ykn`{)+#5T{c|WO)VxEa}ZQ7j$@oQiG zdi-EHE(kqJg}kWHwWwD~W7&ifPSg~^H5Bu4hG4J3Ulf#%KEVFRYr`&KNi@jB+yU>b^iUWC>i<2Et%aqb`D%Z5WK59^ z-hKzM*6#1}f@mn=7g4ExqC;DINBE5^Mo#(fmu`>Dp%r+4{hmovNL!lG;a1`+!W5Ai zvUV(zTONAFy0J|yQ*~xd((-YK7!O%#_O&F_%!{jYD$_j_z1`~L+V7=vqUW5RT;wAL zQkQgL#>=qam^+XAEe_enBx#cYxl_pnpNa~v$5kcY;#f1EJ z(DNb=6Z&pQjikS!Agfr`U^nc91Aj&@VV6bg8ibekMM0!R%&z;oQ0LdaCKV29FQKE~ zVU_~-*J7zx6*ETuP)p4h3AYK?n=AU+-GEd~fFw)zNZ{j_2EauKKW4$$Y4^)w9)xQ9st_Q2h1 zL*a?V21pc%Bmi|%jsK$<<)F0Xvb4Y14pU7d+-j{-u=|(kfK@?ar=15&E z-yBq%@sxpk-Z|jT^FVKkKP?0R>}$cZ9~r0P8(*e9HX;rREwP> z2i{vl|9xGxM#e&iLt6)rIq(x@XtP_sYOPy`BySz)Q8y@uzWIxXgb~V`-ef4UT4BW< z{Bz%z=L-sU2**V;=DWmkCVcHx^Q=~I2o!-6NXH}km<*4s!v&r-zhxe&{p5yBN-Ebj zpK;&Z5%XQ7l6W80$N^n!BQ!?{1*CMDqqHrvL||`29pS%w_BNSAheruFMhGKyLQ?@? z{EUQu%O7bpmdDTyB-#PA2!jEyyo^xN3N67V9CnuYJdf??*bO(A*? z0o;AOTgSH{hGC7*%a$C>_O`i&QHHcW9pe!in1%b_?uxm)+QJ+dMGQgr;Yo<%;HL*G*1K!8qt>~#a1ExJfy_XI@7|Ee>Z zb+@U<-8BHJ;MWWKmlL+Kg})`Af>pR4xJ~Hqr9-NQF7v1hEyI}n_SnfnK+}mY^tum| zJa6T~Atg%jZV5>Yx|SPfY+XmI+;a^07CKA1f=@7Jes%Vq(AD#JHquif zX@n;!cR$H}8>!HL4*&bZR*mHsuFcZifO{d>8@^l$!b<9Z*P$NRtGRDPG`trlpAF1b zOt;NI@4NVi3{N7%fiMLyXTz_88~u3P^is_j99NIl*7#SwM95PecwQM1JVl46d__2P1wgN;TR0&H27*8KC#q|cesyoNcW>p^NasLS zh~N+SJw<@_T}ja-A7tt$rgeWd<)<3@QoZ#e1hdSXU9U_jV24=8j1?0)oC@(Vk{7%r zDkhy7$JB_0r@WlGBn4~*f|1AzZaAuFUZ*L3N4F$}{DeD2&M7deo!vu1UkY-hVu(8Gum93}VdgG6e~ZyB ziAc$#<{4Ntdhx9%+0c8nKur_M5#Z60kJWqqfX_5BmSK(`f{f3*6^NXpQ?w?0t-~5E znJbQ>(i-CzI&wzT)Pmqsz=(@XoD^m(Qkc|OF6s5R$8*Moa>9-SLnt*yZznFW^$S8= zXkjgB+hY7Ew9>ZP%ynD>UNQ2s>8D;;IC+ewo_sliDs5L~C7_xb3tP*2j$EZzZn()+ zt2KkzR^QFGeffy5J3gB)Z$8uE_fEQL+ixGo_%!YH&Xiv?r-Plu&RoW0QLiL=Rr+36 zT;$|(Y*Y3Zw+oHUU-Sge+*c}!Q|oZ$)Zqy8*KBhZP|0U*F@`VkEA(=VIWBT^Q|yw2|B{aTGj)GAgB|M^iDPaF_}#*u)Juo(U|EoB za!gEvF8A0Qyerx)ZW+^zX{2N{D$R85cy+&<%fkH0^KUYUko4+~Px`ol?RfaBz$Px5 zL*e5T6FztFA=iG6tUN+^htx)dPPY&bRR!`tC{yqwH^)H6>YDj=?>~&=i-zXiJLaLS z39qa>xiUTi_U7y(y2Sn}0s zHM}Lyt`%fZQVJ60@ql9VR1alQtQ6-*YOKi=NYYd-d@rojuzDYo@KvG<$GF7e`|d}= zvMq$ryqZXjC73y?f~n=7K>eSWE|r5$d5@EWwR?Y+wAw+y&&vex)JZycbuOCy3E)4; zqFl}@U{JH?*wZ^-j9vP$!T~1P?nzq?x)~)l6fp8WK%loP9kcJ?9B>VVNk*JQUc(1Z zlZ|$6tLIh?KR?i~4oLI8#{1s?cLqah{i9*V-G>QFzEW$u1qL4eLA1yFkv)ALQm-H; z2HVf2b9NIIWZ@qjaz*YNF9F1XljNy)g~E$UG0?l@nk<5S>iXa(uU}dpA{(s$V(lgq;a84lPfeNICsSfA|7L{mMRXiZw>xc6(~gR?RuKW>Xa;%c zT?NM${?hY_@01w{{79VnYU^e<0y_V+KfOZSPPv-=f28)RJD(T$;GvFX4@Utt7 zhv>J_%C^*+zGt+ z4rK5Y>_Ck)CrRpf($^C3dG=rggt6t)o&4s=#f5k>5f0Xe;3CBweY)TT5+paUQDfB4 zrdZCdQ_Js%Sy1~Z*C&j}G=>Pqmy2N0!y{Uj)O`4zNS(fV5S`N%@t|k?me&qgR1 z2Dx8YvuhUm#HZBaiW{@Q{lleHiLs1TjGZVx6p7-I=(I!oXbDeL&tOnn zF+mtHHW5gEL=^DP+;`||JjY~pybRf(bIkVmcu(Il;4R>R0hU;E71jx`8MY<9(T%EC zplFO=k@yUUDXNG3jUi6%WCPKlu0blDaZVy{m9rLs!O}BM+hDKFcwN5QRWE(b2Y$vH z;kMj7K^xr>;H9a=Hjv^VDWOv&8z&)=rzM#OYRO-Ms>St0-5CrvacC_VSLUH~b}vdA zy$fVKXupg_1|dl*BwJ+@cWXivq9RSdRXz5|7bTPHSQ55uR+XnVDAVa`RdNUtZX;6O zt`dZ7XdlUH%CDs^k#r}5eP()o1k{h?vJ(b|zz`?Z)lzsIO@7>Xas*{&To_H{;+Oqj zo-tgneSDtBN3r5hO=D-WCXojnvM2>#(a&;AtOMX2>Sq+OBoyo$Ir)k zyj;{*b`|Q3=u)38eoxDrNv7$(XdVqEV21`w3iYj1#Yj$)R*H0p+z!LAL^i`tvaH5tPn_>(;OM@u#$f@Yg~kw7;|!Jd2^a1x-{|!g-~5u<6SB?XH1>6Tl@6f0E8Z6*yF}-y zV16Bj_zU^$hWF=wJKHfG>qf{Hjcu08#cq4m(s~7v%@;*l%ir(&9;Hg2Hsz}~3bcse zV)B(8?5aL8v{SBm~R>zYLgM=Kz1W1g?WJ21a`yW=Hk%ibP+}# z=OvriPA|o%)BMCqEgjwV*3bG#ji)~JyodxuMnq&r>&J1gI`VGcreX_iRc&u&2`DtD z-4rsXwrTue!v68kGPc|X+pG$(Y->mAWU$r!x2f{j{8d=#R*Fit&QZF(+>W38ZJqc1 zr1~}YDDIPx2_2*KahKP(mew0LI|sAL_3G8)dPvOhjjB#{WQ&dAzY^2Mz*S4Wkf~kU zu+9XafFge9y=UbzpO#yf)(C^FDHFbGE&twcXc0YW3j!9}-eO^P^hz4p?Pjw~uxfk7 zstkycuCe*-C1NcuQ9henHfvHxNODEs`c)(%_5X<9%t@v#pe?szK#9Mc9ljDTf023| zXd)XOpjU^p}DWRIz`Q!G)2i-&?es=fzmyQz^=n zMU$VG#mr%(sgf= z)_@gVp^xW@2CYI(XlhLGc)jnis{KKRfT;xIcVtbYjD^bTPP)_l;kJbsqRx61bZ0X? zii#eu5iUz|@;0Gb2gvAzf%bmjGgctC$)-QeLHue--a*`!_SmQz?&?;COL(f;O!In$ z3Vt4q-Y#+Ro>B|1i+{`+;UKcM%ghgHLIMAu;TNrm;6Xu3cV^G6_L1%iX%~jB5xjeF zoUN)T%Gd^Etpnx|X&J%8U`pUBiOYeFS{(|iKb_Vw6W%?#lb8d?4_0<3u1&nogEWml z3ok6*CP@XZpBNHkp;p4Mlli^LaBq4W?!_uBH{KhIN@T#qu3@WBLb>cwHMzD zOquMgb03yn{JP;h0&{+evqEo5MfyS$c5ur&=Qb^hik#$!@yY++ zqd}oBtZ}~G?>mDEInhp=5X!rPX)4uT{LQ{qu!FXC83;8v%!D?i}%8*;*P%aDPHvoFJ`jk8R^6!(o6fGEF z&M$TZ*+Xlk!PX{I_Cw0Ky>iC`Q=LncvcsD3i`}#O!~AJo^9&M5 zFV0MCW%8XySGt~)u>|vBXbxyZCS19U#Zlw z88dGAhxH{SQo{g#AT}9QgG*&#U$xn|`Efg+} zXJT;%q9X{>K-$x>XXwjSdPe_oxgEnlSB4`wF&QxZM@F=J@6IucL2pxiajrT_#}At(N!C z?@mp@#T#Ny9sP2g``^Jye7k0oGsezt(}{*99_RivoMiXj$2akmy7pgYV;!id*B89< zpKJ9_5hz^(PHO|+1iE4LAJwwm+QrdW_PUtGwU4PT4|pRxC3cN@FGKsWs#5HGIrqa;3U<3N z6ulNZu|$WN$(gvyW90+n5q`+o{Jg~hkeOO$Yd+D+w0ZRSre$)5cu%6{p-|> zvjzWHkVgiaHot)VfLRp&G^lM&3t7)h&^W;dXMl>Oh$cCjfO4t`?y=O=z$WU1&&1j0 z40lLJiSLeIw%4ylch1j`5u(#zG()*uP$Q0JuA+i(P8v0}w$?#^gvQu4r+)}02zY=F zNCKxUEVnqp8IPe>bnf`(aVFGnpI}jR@{y^Sg7#B52cqpw~>ehv@!qR513} zo3zN3SLN_CV!>PlcoXF*nsO1~0OwVqS%)CGQA9SENPbJ;iZmpr(MmHLYd5BsYxOcq zwNfTGKN0SCl_76u{PuVg0K;5;{CTd5(hq+W^YBLo!L^yM%4f;Yl=x`(DL>qtc(n1G zip@A?dY}1aSLZNb7U%JfpolTb>lHH-W|R_(K6TFjn{ni(bD5R1cXvwagm6Ld=m&Qb zfcnJ7=Nrqe2g}$1I((kD-{r(ih|cI5i0uBzH}QBYpv$&djX!U5qU=WqjpsRxP#@O& z-7W9*`^pkS?CWk+4B@xkVllX1(Lm1f-kFD>Rk0&WMb2RML`1ne6#8w&aSw zNJjn1dx~yw)k+`*k5A0aCIU!U6Dt6ubYBnJ%xKs@+bd~%eZ3zyr zPr609sSIlwlO9h>Hqg+LitpFZ*<5O)BtFp^bbHsGU>`Umc)#b3rJz^zuSr zB>l%aC927C|MQ;68ht`))#RZF>5q10^|MpB)c8sn1=>WQ-i8O3mo*NwRwzFz-OJ@v zzJF7|d&+8^BCkPIAkt(%pCjWqNmkT#PbL0P(4XB0b=%6`0OX{^EgMLyVCg^u&CyCr z%toSOsn&vKtmkt*K-HDJMh_{~z;s2ym!=)@YE?!H4y4zax6NR$+S?A1eL%5Iid#;b z*P^8VJ&h5}lw{me+Ux(Xu?H5sW58#DH4(zJlN44IiZke_8!C(21W!j%Dk zy=8QS3z&jaIg#7d$>$}fvu&9YXl<)G`0`_&t;2Z$i4U`3a?_+% z*Jq&sSV)HD+UqaF6bIW=y>v#wg4OPL$;`rm_!6JbD~t;Rqr3>45{ZwT1jTr_2H&(t zQOlSMR1GPy{973*L~r!(Y8eGn;G^HKcd~U<^+vRk%vkG>7BbwmyXCSGDn^Ywm9YgJ zhW_zh^?foNSBhyfd$T(gY(S`!-@oZrjo8#7yEy;@KfC)Ud!7{&)AY|fL3=rljpouQM&Ji0nDr$fyPC}bjdy(WFPe)wH@^0v z%Khk;Q#H3 z+6j_1p$hp=Y4NU#NiiE%d}iu+*R*3Nl$EMp{hIJDN!expY_H*3x4wOyx^!D!)uVmy zRdP&J(Utdl_!CX?L}ZP$HRs2`XqIc}&M$CS(wH3`vpO7k!TDOF8$6zF&jdg6G`E-(d~kZdD=@jbDiD=C9XJPXOiv(f`s_XP3`kF5g3e~u)Q7uqlf}zM7G!$* zJribs!>1aGjbd8xyyd=HyZov50`j1v!N^Q?p*v29$RY_Y?x^fyrDIpc21V;i)&9;N zu_Ho_c}#+kejoK^n*T3ih37##@A&no3_psh@V`7H(Ws{zy+Hk8E!xHUu4VUKvm>m7 zKNOC?K|(a$OCD0)&{iwJ1RpPdg}&wboP1dQMO4EzcAFf?h7hpVu?0hRN+}M@)v0Te z!B2l+E7_Hp!WCOrtz=%U*FA7v7E8~lkoxU=ho3$>t8HdLp)pT9<3ao~cLH0P0+{%a zQ_H0K9w1I>Na!f`7lYl*4&$ffrNU1GL2CaNo_&5tu>*_-wZ>|+G&SkFx-+rh`)m@r5Ig2MCDQ>Z!!vHZ9?u-6|20RYFC7L>`%-itS^xdm#&&EbamL zQhehJBxsI(?cwJ*3}2dar926y}Jtb0KuV%oP>4&CzCNXcNSohoIiCu`Lt zd#YNJ5$b6*7oWyt0ld`)P2G8(>EIGk3;8;*3R}4~CriKHA5;lUN$08)>KfT6LZ7eU ztU0{%@x$W2n#n^bet7NHB?=z}ySsaF2vP{r;!bgQ zcbA|o?!h&X;u55|!^!gx&ifrcBvYn;n+E;Mcci?|3@&vlsgu zf6cdm$ZsONEmS;)ubQU*a)8o4wi_*M>>51!eGSW_X%HrOV`R73rTz_(nb4m;~;1;=#eW!FA z=z-vRJuSoD@|%b<0i_O8ywhpxpVA*=GSl?fu944Q8D~W^>LA5NM+$8D}<%#`(SY0{)n_z#Vt@?2|S`5d{i$h2gjO12C2C71iJ|ADE!$&t#WGHp= z%cJ*0nOI^)feRul{^ruF9edfM=AGgI54yV`|DECRX^vuhKjWTJD*s?Zg-5uSD6JfL z`{vGJSAI9Xu&2~DA{3c-M1FbN-r`^^{z~s!AEB~!kJ`{dpc_xB=YLE8dnGFLHKK!s zL<83~?UmHBG?{p1yTedBoiGN(B91vfUg_DB+CZ1E$D0IHQrG*ulYtQiUV?F@*0)tJ z<0Ddpo^J`x7IUpcMC5h1ggs*+#B4cxjk~y$w-Mpz&y?L3YXxzQk+_q!WJ|!|IVYz@ zyecM>+qwUGl~MNqm6e8jL$3ZfWT;3=(|5v#DhiE;u@jE_Qp8~tIK>IE3zgiAB>XjJ z4^gGLrfb$zTfWEl|FK1`BLoShv%ghx%e#NP>Uu~R)RdS@edKJ|vw2#vm=Rv@+y>=J z=HNJowVfhCMO;VHpK;~?e)iZ{Yg6yfx=?;8+MbAbFrLl=MtNb6UZSfg?Rk<%;A{uG zv7D+*bYNkn8x)sZyPvNw$YAz=uhaVXhG)v|H7Zz(I;{dWW+JIzTqscb@I^GJa{#YG zSoZ%H#6v*JiLwI`A-n%a!SQ)b>fiPgiX_HJ#&T_p8n_!3|Kz}7JKOO#>RY2qwfdSK z`nD}qS-!XD4Ey|HT(xVFg5d%|V0zte6K0Jsqo?HqqA}I(BOX=^`-jlJxDIS^&!3CwTwI=&D1w%JTe zLhMxF6CK;t@yr##IWWA!`KwFI+|U7NQfO~5{12@0pZz5!^XS9hx{o!LP{0Shm-ZS# z$UHN2W1Qo;MSa>^vYtS~6S3N~)AG0G*$lQWCARSOEh+BxLXmIgj!tw^?z-g zm9+YbwgCM;tPMs(L{b|{p$g6zRdgi5nHTbq=9MoY)&Yo2oV_%gSnE)Ec{VBh6uajd zdRr@ybS=1s@@sUD%KAnr_d&`N+x=k_AuZf9FW!wrVIxc((X&JFp?n|9n<5YR zCOpV!*w$59hKzp1^xouaVn+8s-YGkUO^iry5Dn~+nKyKd3~%*OM>uqL>IaDUNRsf~ z+AbNT9v_=DDf+fW?Z)8e@bmMvR>3rEvWN#X>_dfR?!XNVlm8e$=|}Rg<&{OJZnxWd1?eMwl=V|v>y*9F^)$FB_rfv~w#UQfOeAo% zOvs)Q9M!h)dJ}z!Uu@uFi_P#GCQ8FIT>s#ANI{tpP@@H_Xcuidu^@}9ONa$LY#TZxypK zYKo>KD$@4dPUQkP!Q|Je>TLcz{#QM(H-OBetvGOXa0p`G`ik9nRq`1undvwAa!ooY zhOUp#Z=q$xP%TtyB(v6WQZu+eX7Lqv{B|u)jHj14;Y>h+I9;}mYmLqoa zs&ty)kVYJ$$n9!i)=@s1?pb?~56pi=9a<*fkRulN&2jg6I#H5OA{_;V!=hdh z_AAMTNc<$YgTF{8zwZhM+~U3X>2)kt_6=AY#)Gk*aM{+-fNoe}7U|7miIELA@EQ#o zFPR}RL7!4k3QZ5$2~k0>3COvu3yq;#`v`}AqikGU|J$X~HR`D4tWuuG1bxGAUh}ZaRU05Y zb%nBNw@Qqy#pBlK1V6R7-BaT9lnK3OdkEA7*Wl@FTnnZgCZ`-a$H{q_Brx5m?!J3> z35f0>9kj&sQ8)B>P;qtMnpC<+D}}0ru4pWqRCe8Fgji2}u!Rtt65Fd-PmP{# zP-ge_eC-Ux?>tdbQgcXDf8rRtwJNd9(^;WJMcMXBRy%sM;j|M=U^b?}zh?>`mi5$f1 zJ9Yi<6Pz1%zlQ*9!W(P+H#ci5>L&EoO_~RiZ-{G-I9ahdhOj?})(DNYD`DE}pzF-a z1#P8C7&1(ri{7t9!PLxZ{r990M$F8B2SnO;|6V0$$6csXI>*q`$bJvgk6z)_X3?pV ztTV@H-9Hgw{5x|MWiON7l&F<*)vTA+%xHM#4Sv>%7qLGYXBY%zZ@^Gd5!#HV%3oR% zwt~HS%JHVQ6VdB>mGZiqlLk=^uR+qU{IB10VJy!bHJQ?~70vzDUfYSbvU%BCD~iC{>5=xz|=KBSH8geV$zC@}oR z%k}JL5j@^K(Q#gVlhf~!-Bxh3JqDJ+0eci{c9>fyS5#aBCbM5v^3;6(-J2;T zEW9h6yM(a#70f)m5?}xDzk91T!;8pvAtcl4}^;b3H^!Gk+dHmF?^S(Igf zvo8tQYlki|mQX5*SlhksdX(VqPYHKQsg-QRw9 zM*<~}BcF*X2pf?4OlQT)m~squM3$f&<1yMEzo#XOl524suul<`KfYIg#an;W%BXry z);s!3ZAA7d(9}YAv)pV~JzX`TcdRPDf5ZS)`lR@@YTj51 zn>T8en3ZIO3Q@)XOkaKWrG8gH%KpNURAQk498PW7T}GX!4wO5ik)>v;+WwplEowco zYom-mttW;>?R2*X$6fW+<&B#r8^qv8R=#6>O>(6JyFo+TdNxKF5YJLxxyHlU;&O&H zs%4->>eAuObQl7aI2|T>%k*DrBWU%Iz6yaL5`BEvf`@qiPXAjS-!iq(>hve-R-pqH z@J@Q%^8J&b=QnbH8a&luE!7fPJ8L%RwwD2m8FTgj!U6UrUxk>*>38)vYZkrl!f!MK z@pUP$W^2bE8S0h}-Io%2u;GX3`{EYVtmd;bAD)!-#zr#;cNoL>B?nmKVHAP%?i=Ip zlmjxWi@Bnkm1|1_yC2bKBRy}tp`R1*M|lT*l1f`@Oy?^d+X|`-te*Lz*$7=fp*TvP zyFKl)R%Q&LoD?qazMhA>Q7&rhWM31=XDTgmOg(6wgVK%iM%Zw#871xposk@4_R*VtR{NJkCW*Q6(feTNaBk(B zO0_GerV!rlH;Tf#2<%1rF7w0^KJ^Sk&_1bVtGZ2{QW5Nj~cGFEuVCjpTO`#CmRg`X+IbxxWwoS(FR zc#zoa_aQ*{ZBemdXW-h^8=;v@iJziZcP1N`MCmR6e!pu$J0f`~5PQUL!82O5oRL6R zxPJesk@$cwqp^(4sC#xO9p@Z_>P29W5JAi*c^0h%3O`?`c31aq>*`cClO6^RP1(Lz z4^w>%p5af5{a$POBwtQ%wB)v?}#*=RM1Qt$fTwR{)xk6sLON*#jz*~m#}DvIi=U2z+u zlnGaVd=i-5nKj_fETBycsJRbz?GNHp9;zciL2;@dFrx(gar`7%3eA&pIHG}3yA}uj z>dVklOHu%?Cy9p0#1H*pEbcn_b#D}F;pK<%no>jD>M_PrOgaJUQn^`x3?wDB(62jw zd@7Sxcv9m^b%c4DMws0eD5{D|=;|L)uFZ?{XPhsb5G*$ubxN2$STf)5xb}fVzVv;{ zh3oji5p0_mj?F>Dt3S9)@~OEUF<&k($_t`sCrd7X6S5`*F3Z(tO7(tP24o6aVm7OA zUcX|-rfbhWJwiI8*UAA+ii|&P-02waUH2KXduUIGo+S0Icwr_ry`TGOCuJ)psFtzv zpdZ60A$&HZVWaZb-U)6UMOG=oTN!xm)t0UA7_Bzv(GhV~5Y>>@&wMAGvip_>^{wHc zxAlB-SF18!y=MzV?2u5!uY&Q>`rm!lWDvp$Q)%`dW0|S^$CpsoT#|Iw9P{>zqEdE& z4T17UaJU);w z15LK4qIo8U8oe}p+C_+%XglKEx1TZg%quW)_{vGQ06T)mJE`EB+<;^Bm8jgV$KQy1 zozFkK7f0Spa^fM0l`YrmoBAox{PXxxn}kg3Sf+5M=^20;BO`4hxtVV=i`TnTste@miup; ze(JeV-w(k>`yrc>-W!}ApP1t;cOdPYa0{Z$?IK3UoUdIHM&G;i)8aG5dGs@#{-L4<3(kN~Ux^ls0o^Hg zgIOjVL`)R&yAo4Y;ycfi7pu(UcDaxYAi2K7+SWyJb*eEU0K~jd!!|sg+`eFNEe;?h zKld+6Zmgl3-QGOFKx~S3d+7*wm7Ni%)1bgB5(%PTTmJ?G*JW}Y{ym#@`Wc1znLUjm z{>&i+Vh+0~$3}>MxlfbM2$(LbIUO7CLed$ZMt`nP+G4bgiRshn@*dcih}~${jqfuc z_I>KB0@z_8kDliyFrhS-c9FusoAvqphnLabZZ9W77-6fQ5<^+1;!*LRJn^*V2n zA8!Hsu*{55R-5Vr+aG-Cz8}bybdk|ZA&DvDA0zqqSLK%?E}x+y0Ivgaw)V)#3zvAW z1HJ9Jj@J)!+y0Ilgg1{y)!**?ET#oJda%@Qi~oMhzilcoD*ue;e^{sVtM@Le;HUhm zfZ4?62#ER$Tm-0CpE#v6CQ(?1%moBJUjDDN^h7)<0v-II&A?jLO1@R|^5$rf##Iwm`^rmixr|_05Us z7Mz5cwR9{c22?BHp4o|`z4vur@`=qrPO*>6{k<4WqG9;6BGrD;S3+%HT@}_kI>qKc zAGpf7c7u4Ol^(_^X|lBm&CLF|9&i~JP#EoYu>6+0g#0Gjq+$oE){woBzKfF01QJV1Zy(Tai2-x6usCT=gHNZ9M z7&G&~-J(KhPxvZg#l6qY&wm0Cwc!d3OOYT(%h)$hQ^a4bo_eCc?AA|t!pltSzoEEx zyH`7)L-b%^ZQKH#+Y2*k&88w3p#6#q105uZ<@>I?b{RcrGOklTmcrJ#C+akRX3+de z&~uY-w6scmyjke{o->stJUO6a#EFUQi;#)ND=6>Oa(K9L&wVIin3Gt41TP(L zxH7mf)%GjZ>b)-Ro#Fs(%Zqh=SNB+Ab4mF#um`4V@R7D4sPFCPT4V*nLN`*(93n`z zRb_L!cgw%R;H^0Es|ZYq;d_dfR|Y*pNxZMC&@3y^Y5QIU*Dy}Mi}iV2y{F&vb{Z_f z;xY5iooLcZlMk}V-nbSW9eSceiO-L4qpQdoXxC}6+Gjt$Cdd(yY^Ohyy+mz#y`oJ5 z*%SoM$=c@Y6@!0e7rCkOdptuC-Ft+^3@*`KSYptuT^sCamAz?{M(zx^x(GonM%!8L zPHhVJ^iIu~`GNxcq`RJ2-cPu0D6-gjf1`ipelL3f682|xcr8hs{|Wov{cQ4b|DVnW zyRQyFGz0bAl$vOnVSRZdjRnr-Dh=B4io<@+o8x_p8ie>AzD3*?o&WXq(JYSC<111= zOk(FE{x$Qzyp6Oy$^qItH0|6vbqC(Ink0{GPQwru?I1eq#>pqkV6MkUlLwyG0X>8{ z@u#_}^N*6mh??+l?!^XJld6U-p5@>(`NL%~fMFC^3}Ggv=|v-Hn4VcE3KCr`&rl(# zr|0uQQp2|7)`LZaTU&oOhOTd&EuOlHP@4SZ1%VQ`)|Zx4%@ElLj|yioNK*JXGJBep z>nHVKnqMqmrtOu)#qeq6D&T6@$TMQ_Jm}7TM~Cpt&9EH^A#i3ttleEG?q%5l!R>iK zO3z>vt)lB>y&W5@ov#b;Xhjf=xECBQ`y33`ulV8Wy380JyS-dDW3y3){9A~^Ygh>k z7gy??SVv>u@nVSba=#@n%Em;alA1d&4H_kuv^%i0^8Ee?{-4c^2&>7sWoh?}_Xo1i zu4)Ze{?=|rTY)={R`xZeuT9uqqmt^zpoLKwS6ta0(q(Z-G2aa8+NartNkZMZsH?8% zJ~W|l)o-+yF=Zt~cv^xmJ>)HN?H!YcnO4Mp#)Axr%mQ;vntIaC3dxa8(|FZxEpD>@ z9lL&9T{-bO$E1Kpdsx^?=0|qBnlDR596pht4Fcc>`Tm>F3@V7b&i(=>;CGJ-zd^fD zzD4IPS0ZB^g^gc#0*|}eIkZHo5{NzbdgZ%o#Eqs3;19ua^Xek*qW4FZn`Y^#A#a=E zdr3l9zB(`RxM<*;gE(UDh$)dTaWzq+rh)YYbkR7{-KhaftX7lgSh5Bhb;++AdxJjA zREopw0-L5JsMe`yv7*0K%9NEzi_>=0N_Ce*M!YI^zvRD*sRj%VX3$mvH!3!Si#rwJ?t7CdrhR|%Sh#^bEJ+bw&&e%tuWA^2Dy6)3C4FLy zoZxfe@AHrHVKTN$h@7YX(=B7MKOwfTKBgxh{iNzT`Pmm&7-TNE>SZgJ_{od^1$imX zm2CraZ=#r=jvvbz>;}7cNlIhTO1ksVq#RUxgm#tHsAzCs#Jw$U6}BOJzK|8BmqO8i z=d!CVlNB^sBC@qssK1I)Qg>-{PR8|xK=l!IguDr zoDdWp6vFaRLqeZLdstQhOtfoTX1U^{y@W}y^k0f`L(C5Ih^j>)_RtZHA+4!<+M$=2 zJrhKz@5cY65%I+ZAq<+~;e5^}TbJ+6pN~(uCoX@oKNBKm(EB~Hp@ZxCR#dC{wa7C4 zN_%sG__Jrt>vz`xin~G5Yxuii)o*c-*ZqZkqjKw|ur-SYO+Rt`2CgGQ*n_yJMVoir z6+~@RXb26IGe3`*_|V!n>NNzshSuG~FQ7zU`2EjWT5ag~$`S;qdM=n3_xO8yJ(_*u zR!!05kEKgIa*F4A5VSXOrKYCoSUj#hm7R%1m zYK^6b#(I2hAK62E;N;S!M_b*Cq@C?*d^jzqXn#sqP;S`vb-v(n-_@<_^?jug7b;&Zi zKokWYhLh)>mZL{P>(b~>T_fVB;HXNTA%QFaLL?z}_m-K#i}RADeQ#S_h>nIXd4>%B zq>=QQ^YYn>sdvBEZj)deHf^3o8u>`pKscP|JpQT-qh2Dy)GYHix)qBf!8a{hR3FLv zC0#vOA)6{>rm&LGv7T#Cx1vO=LRI3l>-Y1tN_G}vsz`O>65NABjI_+`6dX1#FT<9+ z9(qF%oAt|0dxzK0PgLC_u36UR3oj>Bk8cS*Nm5`I`3I6U#e!8e6M|D72}+YTUZPi| z;z9(dsfK%ncqyht6yMWZG#OwSwg&YYqGmXPDIW(oEdlz0%+XM{@0TfVTPR`X=A>46 z*+nLvLJlzmeJctEqj!h#FN3jKXi~BtuMb$!d;XivE}(l(JtIx=2TU!oD@&H>tBsJZ z3JL4ThSyz;3daKT4MmIj<8)5R6W;jll$!p!5@WO+@dPB^2PWl0U8SmGMx%Jx2e&~xv}&$g5p zMmcYFNvn&OdMQ}(+&+MoWq-)xuoTv8GMv`Xj3)UGE zqGMD&i%XO(K3Sv|7^+p`O&bt=$8(i!e~a@zdeHfY?mVGef<`QoUoCJL_;`@0!F)vA zKH-$gwR=}>8l;&G@FsLbx(ejZ}RVSsO0WuLQBaG0CtNG4_B^rNz1J4$TA)={!Jj|CPBxO zw^hZ`C|cixI)lfUYV8+M!|L4)MEyh}mG$ZvX$}$BP{4Mfs{DyGbL=sF{kC7vFb*ox z-BjLTZDp4}jBb{^lCX?DW~dg0!aV+V43Gn%+^SbsX)~ex(U83R=%>B`&KI7$EbuF5 zh;AG}bQ1d|HHv)*Oq#sO8`}u`xH{_d3-9>Kt@taVVS4Mi_T`FSbBWzQ34S4hoh`W* z#wSlYA%sFepA1dCfc|!SINy5p7E&VG?Th);hUj9d!keeV;zUu*&Q{r!!x8TpHdJe6`0lF!<(1_^@Cj<$nIA#;fi z;}QBIVbotgy8|{4uIHW4VhUE$l#&k!#wzHR$xgc<-b@r_dFV;{1d(|2bzC|%R!cDN z^R;(PX6CM7MPxHrZFYYQ_xzXHme4EjeH_c_deU}I|3!P<1ljDur{M7DHuKqqrljucb{K!!8$5O-^z`#X=-{!rrrD4E zuJk_@m3|Ip%HG8^@<|C3J}rziuCR|l9Tp<|x^*GOgtddI-@l(%-VR9!*KhXBDXq7AE zj$uby$D8D-SM=j%t{X#ia2>?KkD>hD7s{0DC6anNx^B?s%~vma!VkWYqdFF5e@CV^ zX`#Yo=}jZT9~G~00=+T)GyBI+!3!zkODhTmeizEdN1C49BX&YN?lw11gz+&_5>r)W_JfJPEg>>h;Oj64q*o|->6)yMNF-ueTvSaSKa>& z>4Vhn+5WowriCkN z^TZ4T2In}l#qywmua6Tf+OW=mez5Hiq{1!`KU9(6bHGdDf5Y+QhfXeHp+8+7qJ5Kf zzbAeOk?MHox&VXV&oizI2G(}>P$|tms^@Jhgd&1+itXj~rF#I}|4{`{(OWg%a8iGU zGD{dneeZO7-WY{p*rRkJeR+HePzXVqw%HNsqjBlsKRtFcrkW$DWl8qZp1fnd8}L`r zbBiTcBKA@)+`Xs5&*i4_e)z78RNQPS&ic#K>X}onjxBlo-9bKe`xHa#eL;eEGLdt%EK}E;w9N{-k-bt}#=m~m|9m+!;f;+fYPa@~#;hT|> z^woKg3v;CY;+4>iCtiOb0fL3_|94q^arX(Mi?yKLYbo>tW4Ce-yqRm}8)JYvWV>9z ze1ErllsO3vYLoMDqU^z@gTrjk9hbQR@??5>o(5_zKtYF)?#z2S1p5FPNV^~zdal@= zy)J~oQ8?V*Zok9nb#e5$JCF z+3E5^Zv6H#JP7LSNOjfw2{NN*r5C_!@~3 zvp(+wMu-mr`D_7F32_{+<2AR$$rPZd7eI3S!)W6eDu)aL{U;p%L{_dGaeXfXbpiq% zo&?3jO1F?hnBK@)Oj#*l)&C%jn!0MnB(&zRw7)E(O)0DUHzE*MfYhHS=MJLC&LJ(3 z=-3pJm8r`Thf$Kyzt*U;JdJUv2-D4rQ_q+E2TZPTivIIsY_^I)vvTk5Ya&80wyg)Uz|C)LGnRHL(&yh_$W+twax3;EhS)QWrURLeIJP?57OGZA z8{4ego5)1$?^vb$>?5D6O?R!uzEDP?GCT!R_-T?4AR`KEvj|~NC|Nceap-&+bWDm| z!%R4`S%RZYltaX8r*1ts#Ohh$bl)SWoVfN}0A#DVA9)3dlei>X!|Mh18+ZIEfmF4D zEB_L0mS^m2_EbY+2oGcy-U_RjKPAM*2qp1K;7tzT4Ytf_UzET8fqSUFTf*S_PW*Qs z=8;1q?_XO>RS@8qk9$npk%(P1500;GiMtz$vdfuIx%)9E;AFi!zxOBz>m#q4c*lsz zdxa~I#dT9nMmge+Vb>K}z;mR41sB82asx7r{(6!-x=|dHU*hoZ zb*aq~W|*(lx_@EeyhS=RIYtRb6KP`Ie`k?YsqRtr{X!O(5nuPY2(09pAVWAX za3u52HbF~w-K@HT$%pDil=R|p<g0YJgF+sL!o(gCiRb%(N7#!3;qK{U(94g$ z%P$scNQyWPT$2W@yU!0HaefjZ+0H+!=FAjEmMt9oZb7i;cL>x3_zzs#!g|?Oj^^|7 zf?LH}ux5yZByU$Jofex3mbw|mT+z!s>>e@m^zYQn+i0Z`TQDLEhMEu5ec^-tbeimv ziW22M#g9-Xw$)mT!lSW z8AajFf8joiU3R-0s$4mLyn+S9BUI|!BSc2>9*XZU@bsJRnT!Dt%7w9PX7B@@bB}VL z$zU}r7tOK{YOAB?wSq}GHS0myp@r9uX3H8ccoIxXKVfsqSzw3h(Z3UAH%R%~krUF3C2yUk{a&g=@YD&wz=GHZ*wc{owrCD5` zF^WwQ+#pdK^HNe09*Mt)>~__GDu=|oq{ zP;Fk?qlg}boN^&^AXhu@EFp@MweXkW{~EUk6HMn=Z+5;h*l)7N?Z}>U;2*}osB>Zu%#=(ZS}4se5nbchwE?XU zCx^Wiq)GyOC^rl7|K`INJ}y#T4r=obuXbmc&wh9=(9PIfFRen3oiQvbQ80*2%v_cF^UI4f@kZra1U=t@F%_m|HG(#1NMgKGM<%APihp*=zmJ zzm9!xI@dY@f8w07vwL_?=z(m-Uc43Z&}q*Ic_gbv91Do^M(3X)$Sj4=6QUZ@UC_&x zy#Xu_NqlTo-)gpeg;;Z4Ws!E}$MSN>3&O&tkQ1&E%^JtC;Aj0M4PLy&mX9{P&=M8V zJAzc3%+=a}TfipIA(GG7pvd~F>iC&5O;>f6M<84vG$79@Yqt9Q`JAB^D!%HnM4q(6 zv~NKL+7=Ot`#P!M*c8Q4rE_$1<{zXhc1Zs3banz!Ffi3;jN_BX0^6*%1f{MPtxwrF zMtqlb-6bqmVKnNO5o|y;_9aNr5I-7dmo2@CS!+FGt$OXwoT8Ca?5v@ZOTq*7yz6jPhYuRUa(E;b}y%z3!e6@P0=dDyh#f zr;wiI4L&`b(4t3J#e4eA!jfFm!vzEtXe+)-AxL^&9{a*pa}o4`O8nYb8Eec4;OzEm%ehU zl{iP9m<6!HhElZT%|$Amwye!vafy2S-AoAhcRs3O($Wb3dBcC9`*&v(vcy#XE5|V4 z*l+>CNV{`6fnH8>UwGDQ49GO-GU3h(DDMf4?%cMXy?NTM`fcu!H}ZN$YaX`Lf>))v zq;E!K8RZmE)vFB$$_~ph0go0Z3=XM9B~>gnTJOk(<1W)W}}+iK!L|eai;Kg!ik4 zexN+Q^q`~?81ZoP0u5DUB3YD#K3P5u-%*FF?&A zQ9{b=ze$mNAgNWq!i-}9jOm?jv4tM_>L&)pKPQhS(ssgceplmEre22C3We2mOXR9k z7a3M9L~Z{Vo)*+}WTvIs95pFRt*n9TgIn`AtYlCEeczaM;ma2Wl-_pM#MFiCG1H}3}^{RnS z*J15XhZD@bE-y!zA;YHZit`x@xxrs(E2JD$+XcApD3a(cCP^{8@qitVbAiQcX@j?8 zuH^1b1G~^4)xzxA)}Mz{YurqnegFho`#l04?u`hgFMAYY*e`Wxy2B@b?kSQ^;P9jo zSf;-ZF7yq8U!tS?%8&-wPF<9_DA#af{=j`hLu%&@q>+e{Y|Lczye_=^^#Jn2ic_=4OBd@Vt+n4 zIHOufNd=f`W82CyznzRgguGnoc<1;$A7UfqI13d+#1qo<$XVh$!FJ#wPH_7kzIKhZ zkevz0mDBbZGtZ3KZ+0~IsY{VXZF;aQuq}dvTF0usCR2XW z>S;u0S^oJhwe94y$2W_r{P=-YPJfzFae#Va%|2Ru6;sI$qIjsFuqA?V643$os|~+3f&=p`}RR^LiEWg;($Wjn`&M6`PVO=ZIG=7 z)R|-3Dj?GfL6qfF;x9*4nJH&WW9pf9O|l-XA5;Wgw29s;)QV&G3DU|PF~Qa&uEk4@ zJA+x7BZjFMu^J1qncKMOLzA{I%!8A}7bAHXMjqn#o_0Iwh#0QCC875^D$RKq|93ws zdK(;V$VmNyHh41sZD~3VC+9OzuwxqTh?3FJ0D!1rNqyO9P*geSI=DP~pWWl0bC^a{ zT!PB9OHK3l7)a?1Ypdza3HVEUAC(ts8PgJXd~EE9JzD0nA98Bc704s27;YlC@U!;$ z9bB%~&}?(&@llQfd$*~mZm4y&{ik>Jx-IdYb@``9Bjg|t`&9U5U7y9_98(w81mp}M z!TU+H0&g-S3h2^#KW@MJhD_tNdUu8kq;77 z0u^2{=VZ&!1^As3LMgX@<;RSVke7;eKt6y9K_3z;@7{JPXX~g4^+Ar>&Ocrj&M0T4 zidL1ITG=?^WBnPkH9P-y9>u>0%G@_gs7mrdMOO}NTtEJr^Kkvodx080`C}ZGVYPM> zCgz<|xDQNAr^ie2D6E8dm$=ZoIppk3p8|$#AP)j!lvH(;J{R|u%;OU}w~Fwq(*T4L zchWhMMEe@^-8UDzoE!X9NAB)TUPL1n1 z!=mp!XtpohkJ;w+xq1AJ_O7loeXl#}#_i{pF%;DeJBI`Ck1)ap*OjiX{jzAt|N54{ z?(!p=n=fxsmAJb9e4HxbCF~y!$xG3`B{#<^y6hI`u4SCT*)szLEzYMSm)Om#G_0Q= zGUpnQ8?@#1UV92StBCyRFQMuj_pK!GQ6!w3>gwYqEQx(uL*HB*(0dw#xEV#DhH5An z@?XpXg+#L0uOAc>5-tjfp8}K@fL~QeF}J%CFF~L+4PcnhURANL$nVzfdTp*}^JL|_ zEq#W(R;7ZEs#y%(s9ux6O9BTFYn^)@m(Kz&VjMbw9(FUZZ5zF8x8!78%vt2{>URY+ zdayn%E-c@5BsA-J_qtAM(pS9{4>VG`;b@(VQI%pUim2gFL^H0R+~kV0{7)*Kp*#Bj zC+LUwX}H5U5Z>;kN=qBbRQTo%)GxfLgDFJhv$%&erI)U~i zk}S>YhJ2rRQ+cNzkM7WX`W7Fn8&rCEfc1iKdlba;cA; z2)dYdVo?->z2ReJpS#BIzL7vj$+6-ISYX4?a53Q_4*&e&PX_u*a?k0tpo2r(&;jjn zHjNlJam+6UHXFh#-=J__+!y4bw&O z+_iU|e|D5%Y%-Og+j9h9m^SajLtE^kw>C|Cat~jtDsv*3+tZC9`(sR*-1|qaXLx*D z9o+~R*tt=m@NfP}^!}saShNO6G?}_3s$eOSU;RXowm>s(S*>D?FjCewW z@^j;CblG!Xt#2}dbKYl`Z1M@_~t!W^6k(gDK3o0b{ z=<#>H(gn0gWS1JTKh zBiHm_5tBbz=JMXkdJoLc5pP)w%v^z6At(8hIlFwuSzEA{&}d~7(Mh&GJ|}z0$Gjmc zA}_^Jg@43O`%`y=oJ2f)ht|Q;lvuaRYUl`LcUz(q-P1Ic-`9}4J9huj@bG8I%fJg_ ziSj%xcHi??Z_*y~;3*m67Z@I1V&~Jfwzkny)wEnZe)`*L?OC*SdhSht7?&4aL+ekF zqi4Ov z(L~2$EDgvxnNs@wS^syZmJG;aW2V`z2DC4P2>_w_{X0SFP;!`Cl2Yw(>_FYD8txfr z&TktJi~>9YgiF`>2AJTjtF?`lf8sadozrmVR{_@dh-8Z_yov-Wr4h1a0P*&FIo?|y z7*J^SW_e1E>of`RMn4%FBuTaL@*_JA304ar99kp7o#r{jT}wc;Wl+AKq9ViCESRzV zZD@!tP zFf4Zs*@fjA{m!rgzm1iBXlO(~-ezru%*~O+Z%90zG6|N4$#nYQ;|b z+K2lxhe$#ev}_5SCN`a(m_t6gy-6lMMuWo=Cjezwy z*0Z$qKiw{tZGPHT(vLy7h6OfL;JjZ8(XMPx2Qn7ZXW2lR@ndzFa$SI2 zU&ST?Y0>Vc9f0TV?Q(IlQb}7ZJ6fah!xVwf@+`YI2 zcXtc!?oKIIihHr(?(R@rf;$9x^PC^>&N*M0FtcY*X3x%A_qwzQaQ)lZzPvYAmD0Wy z+s-7)?GkYzg^p!HCb7YaX$SoU+1``KUEp{b-R63R->3GhigksTejt1^F@Lk zzZt{X;)PxW`>ua059F!4`N(v7?9#Cx#|awQ&s2Vl{JqK=4QV~g&m{E@Vx=ioYK7=; zy@Q>L_+G8ojTtm0lK)IQotI9|UL_s)C2iiPL)(~h5)yW<${zmo2FUI|?8e-?4UXyun!!CNMb9*QMy7a37rPG=Dj6&GjqyS|47(qP+IZmg>VA^ea@ zZ421RF7B4EDtq(E1jd!U9&EyZs^D0dNNEB9SrI!_#lZC=@M$uSyq*Rg z$St_GpbKezNlW*{YOJ~X0`pB>YXjbv+8<$sxVe7YGXK@z2zQ?Z0Y>@m-`!ZAup9Wm z8gC=1ng&^~&&R#hLXUdCy6hg#^S8JRhVaX3)VyH1eIirHF{;oS(fnuaUR^6o@~&>qSwjWCSx17^wT50H!d*Q z2$(n}&W|cllYOj}HCjv@frhLm=B@q&Z|35*d#P$rr1QrcA*zKqJyd+#07S0o!onIl zam5dHYBV`2S&FMn@bdLpB#^Jn2NX4R8C!U(qrF@)W*WF7XoV&I)Fx{ZBx>k|md`}p z6`*&2=nVvul{ZbIULMz4ElQ-c9cAo@9?Cb_X-OJyom(*y71at$i6@!}Lk55iy8F?K zL-iW8{7MyLc|Y6gXGPP~VxQXAb9*3;hTl;plh3dtBd*$}UUrpT z!x+NKL)7)pE=%iV$tbNqWBY2(03YV*;u^me-k2TPa3BqqDdT^WJc@FQnr;RH1-djl z;B@yJb~9r}g;(ePglO&ET@DFVxPSg>YwOyVr!f}Jy=?52b)J`rS`6@QG&!kX1N>BkDpV-SzVs|J>mzBA_Uf9N&uaVMORb`%=KksNK^D+ zOLgUjDO#zG=F(@m5+l2Md!38A7>V@gQ)fBw*w|jwRmh_Rk-e-R+HF@1iVdo&V*iMa z-y|?3qvyzz$uQz@jlap)hHE*<+b4d|Bq<~9S&#R7S2F+6{ygI|kxMH5duGcZnlHB+ zc0EtFTYMu(#%sUJd$*6Y_Vu(f9Bf?#TxOXe9`#qLq=NfB#r#b%#6jPi+j{rP=RY(2 z{&?hlXiGH~*(k6m%3W(EE1pI84Mdcs>l%0pj&X&s4o%M?; zGPLdwl&k;e{8r{?X|eDBK3yfeW4Wq5V}sW+#|&E|SIm7Exwit>bEW6wYbKFiJ(-dQ zM2Gm_95uwdVJ-x6oDD=Ovcl(59v5KN{J0a1jrg`BbMNZ#TrXlKH#-U1`cL@Q{K}&% z`x*_pnuLL0WrO>$zxCwiXoKUt=VdiB3l8nwra#X`K)Llx2H*Tf!2MeH&J@C5CT9>2 z)r@bo%jYkizlG}a5A4T*?$2LI8%|+N88fpZ8Py@NmEkM^7f*6V1CpR%FjVIII#(o6 z2Z(;P$M(KT`DH85PA9)2J2|aEmHd<9ZNJrW{7TF3-^_olT~GTkTk^4OJthaw5b2*d z759SgT*R}U?)i}VG9;D8;m7smy~{-ev(s&_g>={$Qu#v{uZd=!DvfR+M_i#v@l-?f za2QjCw_gVr`_>!VG|t6hvXHc;!*>qc18)CVYk@t9bAU~B&QT4N2X0uYyDcT7*~00^ z{#CrY^MGwGp!C^HyK53Hb}O2xPWM`xGjeAyoiG0y*`%bON+hWE+{smKP%Lv!wYA_h z(XGi{l_|($l<8q!y#b^)*QXDYmu^#pI41AMLoAU|f#?F32768ZZsDu{I-xUi3}c(? zo3Qwxdr-hZwK)c4f@9F|yw6gkYSLWnKH~@aEuQy{WNWBt${^hOnw>NceZ0>zpnK+vjxd9 zfQQpjfK-7|LLuYZ+cLEJr*7Se&_~@&ujlji+opEA%~(nJahgCHAo8aV7>8j7pXkLV zgy?XirsU~vIFiVUP^@rqs8k9vQ9c#X1yO%VdMER7gKH}G_)pcbbMv37`%aHRixRSh z<|gfy>or{r^)j-%sK58mv`Y5PcN;d99h{vGnjdF3g4&cjWyUln>wXd`hv2C!aHtW% zU&o|5%+$&FyzxM`C!hP2YA4W$L=iNwin|@*#42(8>6@`Ivcjf<; z<5o6jY?aMA*|HqF9-~jLV{7#)3U_Z}VJ%N!NV!+?4G3r~U78wxnTIIM-YTM(5pK&i zk|nkXxn;027uLt)D|M~W?a)cZXvUmooCQRde!b?C65{*kQ?+@pWWC!*hMzjIsjKj6 zg2VGRKr^{@Fv0xOa}_LqC(^Z@kY<-Md3#7zWmT+SD#WI`*JF=hE~za|_Z>I>k*GF? z%@Wzfs(f^hrMhlihU9Kvh}DXZObr#^5@^j_kWIql!DO2jY1Z`DFL@`mk(=!Pl;wnT z8_=tMAbpx&{1pi9Vj;ClV71xr$t}J1+o9u@H;5@B`*y``EK^+|)*~S;OVx+K=oB zvgQq54LNT?!}smjc=*Ap#hLwdRL}}l%{Nno-W%QIwZ`N6rUen9WHo-OO0eqSZey+qIqFw` z-_+E~irv!D#?v2y-(>cFn9RD=sEK@OYMJGK6}1DKi~){)Hv*-yA8 z*)usdN7$3-Q20dd^+r>za6k2W0C>|#-haNQ* z?BQato#yqv{u>dhrihQ$Pc9L}TDYJBHwUX>he_!*hx0y$gcpx06?T$mHCW_#jy;M5 zbK@CTZ3p<>V&4tBH=S;5v}l-re|gc|fUOfYnpK{%N&9Q>pz|Z!Niu@pawiPU5ogmy zpniJsZhcng?E|L{0zSt^bPC+7zn%@Q_2yHflvLal-V+@=pXgYmRc2haUt!6N)K#!a zY8+FKa}74|eO5*nzpEkIR7BE_w%)Zlkz$w+I*vE`!p?_Agl2duQ=eL_cDBH6ciPOE`TNR+8y``zcJqN$&J+VFtJi)BR zP9U|NB4^u{?|NR5yXO5mG;|GPW}#&@iu5I4)eb%;$t8pWjO7xi=&YR)HWQXTP$_fvPLWQE#Uqt6|SW^)e< z3g)Ap*Saxv{7z@>^T}Umka9rq5t}dLq$#?xVhUOK8Sqcv^5tce?}HW)uI@4*OO`8~ zt=ZqMcmjqp;TgY0akhotj+m_;!LzfXzo-2{MB!XBN|$_u`+GM9vNTj-zd#V+PWDk@ zK)mw?I(Czg9;2s?;L`OJC2<6}{zPTyzdQNH)$EZ-B(3_h3=JrVy`MVe%XY}|^CtGq ztD%6!28|ddyv*c+RIcy}wL6@@U4jRjFml6-R=Eb}tW-srUP(vxFmzq$ex|AA)G zI=eHe3BFZ;jRsgxbehLIbwFtw++WQXCT&M^9PPM4ENYo47k?3*9E?=FiiLo`hcO^H z%9B&`?|4E$*Mr#)&5sCqZSd-iD7&t`W^fr-B&0FgNYGW=XhbQW9D*~Kfaf_lc)bnW zIf_Z>9-bt9TFvmUUnv##W4K8Z6MXSL&~LM`S{~Q>#1&0h&mP35)(WA1Q7Uf-tZWQU z@B3ah?!Ypu9|Xrfyv!n&OQ8+9_o8PCUgDgX!|_z|WW1~x84+UiEA~3b%YFVftUYk} z%3mad=lx^*aV(QxttOh80ZS< zRVZ)`(+a!F19amuJ&cw56zgLDIwrncKnE)h`hd06Y$Ze=m`1E9@{T6hO{7?xqYjPp zPRX4B9#xzx51jelVbBNsLE!!Q}VzE~{m!X|ELO0t$ z(lRXb#ufy@^QUhsXBb+8*TQkdE3s*sq;2@f6=m`WeVf;R&%5G0NNyg0Bdz#`Oa(_Z zOh;_2ha(u0EF#cdoHdJyEQY~6QOu@hXMq9XDeRLK9_^b;&^2+4^=o-ehoMg-)Cm}O zol(`0SXxuFe5FIAwHK$I|MlZ}FaX-rD{Q~{REE<8tszTzOn{ruX#igDcjf#Yw0k^% zg>JH2bv}|Etcu4>2Y@)ieM~uPZY4Fpw+(=B8J1!1xx-s}sR=sCEozL^7XrA)M&}_D zyp4QK*ts!}3`t8TXhUFZE%?>)G4+cv0xx-o^=2M$s`F;v2l!&(-CXqR$K1#$&RggD zoZ6ak>{2s~v*=0RGnlMcM{idER?e_WBZIYLhYj|k-B~hm^TQrTVvOs(X~sw!fum7j zRD&YS1U2YLwHQk#e3wi=o>ib0$oTz21suZu5j@-n%;&JRUo*_bzaOq7w#~;1@fu#9 zOCU7Iv}weD@<$hOdSMwPAXxCqbIo3u)X9(Z3b#$~=4j}^TA&XA zC(@=_svX?UJy@$)hu${ZY1QVC_@dyExD%0T)>N6U=o@zaaw(z!lSph^{MS{(lH;>c zlv|a%*C2MHWC&ca6EJsQD?;cz0C*;Fv)%DV1r3g_37pGyUWkod)%!+j$N0Z2f<~!3 z!U;PuI$t()#|~Y$M%#aiM5>`zo!Vt_$zA(8ge`67I=tkSHrHD$vASiUoRW;IQ8oJb z^p>&d{Q-xKgloO|-8a7#%5aj^#AoU5EP>sUM5;HJ@bc~Q!D};8^?l^37jq*fNskg?MO`#5 zUqlTFY>z|X`NwJV1BWyJ^asf2W_G@giTr*+B!F7I(ZmyxvWZ^fQcU|6Lgr)eb3|t9 zJTuJup8ClX`P?hx3RwJvZmlEItjW_^C%lbF@x7V#b?B{uDe!C*$^Ti+a@Am&xBO|W zh{Il;_`8pT%s8Rq@mcxP?-0QD7Je~h;xzsLX3BzH0~>E+6v@j|)c3vi>}2ozMWG8V z-|2BtRX%+?(kUT%D>dGS1i!Av;*lsHTkLnZu~xq;4LV_Lp9}iTibkODW%-egNuNA6 z>%yPi!gD11=hc8CGIPPkif>2W%D@hB#?$h)#0q$%9W+xe>ZCrr>s28o*I@BeTY z%KL$3#&b|G_MSF<8x-KEjrNNa)W}s>dCB47Kt9YnY_A@ zF@Yb6-0d!CFd{OwPKc`^#L2gMuvjg z8TjbC$NVKXiDGY-J{K?^Q47#2gt2W#$b48_%a!FZ^3Z?BNCxEc-3h9H$Kk00*?th3 z)2=Z($)D9^?gmLS+8BTI#Yf5TB?+ens^mSsQsCgfe>YPS7n@L<^)=|nffwJq6;?|P=t8OY%jD+8vCmuYFoN_t+RA*v9`h*&R5;q%v|6!= zK1Ta%FzpME{+%Lvh7*OY+SrKe)-Einr}gq5p-C6Vd2XvO(asL6BjmJ@G#Q2Joy*cc z*Y`!BQ5Noc`Zs+-F8!ls*N=DblBVVk|H;c<3Et}e%Wqc7UxqOdQ1WM% z_&~6P=xdt;`{z5FXNV9Xo*BMbDESVyb{cImSc44)%;~#*Tvt@*nq7e%s?J>cUHl8L zli-i;HP17lLV!c319p*EP0Fs?S-LsmK&v>R3LE*sDWA5sd44Bo%$qp&!3AUy4~yjR z%pyt$yW|qFdEDR0uk?Sdik44o@tS~S9%QDTz{@*E%E0W4wrrG-V?>g|Xu7bie&xC~ zNYAv%K>Tq?2I!R0ny30?_;JI$vU_tCLs1ZGy@*N|3rKww#LcA8^(7o&6>N25WR%zu z%>K5Zs|R}`KYFFEO3N^9-w!D?HjOAB;Gf7Z0$pVT?{bg1`Ch>-<2)X~yy>+AMf;3R z;)_hxQf$|x&yr$lQI9rD#^hI=otUnC#@ixKW|Dc$-C!Cg4+DW!!>`b`(6GLJTMHU7 zu*Ki;CIAX8(0SSCGbT;iv#o>ybEO5P1_iNuwa1 z5*+Eq^v)-;65T9~4>><^A@$h1C2x8s@%Jo8+3@JNM!!3!Y%LAjtv^FwI`tZ_9HWq8 z8n5C?gQbtka=l8S{r)dE{MivIbvVIwalP6&x6QjGvq1&o9{+*+7;M@-F)+BjMjlq6 z^K&mU!udnfpstS|rh0N9`%n3~S5YIzLN*%`LtfzJ{hsV68bJP|bVhJ?84eO9fY8{_ z!?CZztVdk{sU)ue$2+3qGuopd{yxSB!9wf|h&vx*i>LQ;5#GX=+RM5)eRyn0Tee=l zjD4myJsdpTHm)jq`Y*%fdifkeIb-KbjZvdlNI;}^8c8wEAi-?TKrl)yHYENdlj8mI zIr6m@j(h!TottoDSM4Fo_T>A^-ZBe7bZhs5z;#WqXN3MX>W#-xPhp8kFcu9}Yo=Rw=aeX6huIn)4H;hc#&f(87NDqED>D6c4b7eSd* z+;`~h(2G5OVsV;nKKT30Rq6w+y)WjShtFurlbm(H+%443ka_hE{ z>HJbU!GINst#vfDOBUMbAKx;KT9ZRsV0N#}o^ZS{8A3lc(hM$5Lr`c$ zM4s2twcZ&ebT|CG9k!MkzS)TM+Z|ngrX?4IxO)vymQw#rR_ohEGx8JidCHM-f!wu8 z2m4|6RY8n6Hv#`z9X2~)eNnV|Z@*-G4gm4twCVig*A{$l`GULLO7QYW>jie3)$7Jh zRbuGZ$yz4)hWq}+MjcZytD^lgB_v7jaA}&>N{n!`J4)DX_5r+H;b4;yp;u;N!s+5U z(3@YBm8oej{pWQb%W!6{(F3g16ry_k;X^Y~F}V~WRCO5#2F@QYiES3K_pZaLVozrzztfi=40iFI}hx}_z@}87G@yRz%e|`Q;y7E>3v8$HGP*ax?FmT#I z24M-(kDfETM_mca{a?W?IvJUiG>HH+x*ODj?{zlrMXG+@2xXI~Z8GnQv(-1nsq3U^ z;V?=RSAJcUw2lVkU&)^kS{RWgnfZJ-9v5q@VbJ>&wjo}s47Ei5R(b$MSjc+NF4|V7SsY~gM{&~h) zd{QR+0Xr^vn&@wQXLaFbQS0omZz}t&<`$!PcDWd&%!pC0OsJCd0i3~`JO1}(6F;38 z&Ei#~#1w)52cC;fr9kq(msf?SSYHj_2(wcBN@~sEC1y8*jUWPCR~Ac)Y)S-gE~Kjl z6s~`->{Aqd$ODZyF@HTh-@;_t{K69xmqSztmGXeD!^^B-*cymaqj|z_VNQ8<-%YZ;OI!R>1)IDmt_RDBD!^}T-@`4GLouzd<$w01<7OOvru|4?6 zeWzW&L|aL#K=s3xX=7h#S`>RP-&yJR5tb6&J~q3Sg}T?ycmzgxZIKlEDOPbQtduur zAndHKhn(5PTRMe~W+P>_VKh9Kf}in{&FzDUsAIy|(>X-7hIL;@z%4t46*`u;>!FUq zL8)U)cSH*v&k2hfc+a|xoH7i&8ibU1SCk1wIz%ou^VPK6*R6RZls~gk(Nz=3gvi59 z!htf%QbuN)>Vqfoj5Cz`hfS#15dY-wDZwZTU{%z&S)Pq;V z+@UZA?#u%W`<>y$>_xIEBBKSu3UNi@3gm4q27=JxTQxFlBbZPP&40kp6TQA3p4sJ?=pi8R3&#bnf_tm^!Ij8vIQPt@KP44-FV zm(R0y*v^ohoc)Slu5RXJ;}7f*UHUF&TNH`v$Zb6t3o7ibcW@_QF8`#S+$#c4{=5qUM|H(=zh{vKe2czjC zjIJF2=b_;DTUcxD7`H{)_IHjsZPOJ3kSB;-)zeC%?UhvbFvu%?%0Evvx zcSOd@+#FJ!eB}Y^L!mJ}JrwS`S0m^G%L578^zLdTe4q*z#}@vPRksydr@RoPo|xp~ z*P)iq{@Teh?$LzQV0u2@ihQB-{VwX}*1qd;lw`}L16W;*_d5kv4$vB5*bk4G0+!Lk z)w8wtVF4lrF5zD8Sp;04u@o#$FqiJo<2)ytYQXj$-3_}BSJUkE;%{TTuNW}L9Q4y_ zt;nUC2y8pdf9)0t_SP<$8&EIYAvQ3iB^s>hyp|)OJw4I#NefiQqAs5cVLmZ>Wv;l! z;%JJD5UAq@HvM|;Sbjt}tL~**@B!5Mply>2=z|Z4-?m^1sKcXDul&6e0u~nomTNQo zCe2TBvDiY*AK$@r*kKYw_bzGLD7IaqVn6SA$N8pD-pz-){+dZUZXK=4IuzEl%T`~X z2}oD`{j(@zML2dYUZ#ig{sBsnrP4bpcFL^&@@@UBnfTyoPyLr-zV-Jbojp8bUj{cp zYL#CzKOkD9h@rALt*klu=1mtJ%A}0q1y|L8`YG>nE5M^`?{Tf+-iP<~nL$N?jbWHn z&kPG}*)lJ^#JlDvp*(Gj%TEZP!6F-~-<>+(Xt!6|!WM+Q$ z(h`8IZ~@8dT1J~*UQFT$N@`5L!g>(~7wir4OlV3uPhsfgQ}f$yzM}zBJBz@QY17WF zMpOBsy|(#!rT$$9mIEi+*?@Lj{WV;3LGUc1V%Gu=b|sUuP=~-IyEGEo!`3S^3?AHh z`cM9~w}SC|;1Xm~BWhx&q4)sJ-h9S*eF<1@UR+3*&$1_o8LblufD}?d|5VzU^R>I5 z(kMh7SPHB+KZR6V0}Yk$giF*SO=_w<dY^Sn0bKE+rBkVoY49)KFp2A<`tw_da$!OEZC3~>f zrIdejPpy4_qkV8pk%#h&K+t<$wi87oEI()h%v{K_MBTPT?nGk50>FkQiuDn2&d|#I57b&z6~lxIS`6;IeAN*|`WzQINn1@s$Vi^g)V6pN!2U&0QkU>?Jz! zvnB5i^T_LjX+AKMwX7+n9TLK@?N-Q4OY%jowG zRMKzrDO*)dCd_Pus{Q85S^Qik0d%CA3E%#Z#QVu=e69Qz^ZoG6y5ptXt%A=U@Y@BW zkM|Pq_+D;(^#YEb5&4}VlA5SQn^nNsSV*N!4|254Vihb0WQ$_6Bm8{-#EnwGEiMt4 zxRfxI@4fN$3-eEfK!Nek3-(Qc@6NZ!T!0Rlzp9c$K&%6L@px=7UZ=8>?P1({VsM}6d;rQ99J*TX%FP;hWXi^x6Scwcv7{*p{+@^_d${p9q4+o^4%e!$ z6_iHK!`(aqoL!S{L=IOs5~5wYTti4$EgMj;;HTt}g+QHBD#;u0&DcHcOZHocn9Rfk zcF}kBrJ{~%?C1NC@{z3&-F;IYUQ<;LcMe;xsAo;(uv|cXB_sL1Jt;Vj*aNbrE@?U) za1{B$+_6nwI^yOe5rAF&UKh_LtZepNS3R3e3pXrwO7sjzg{BGnK32+oVnq9<+8>Iy z+rP7)Nt<5~8hSnj179SJncx#|U$b+}uP6KtzbRYzR*xa2t1u&=dZD@+l%j>@kx1X` zO3#1~B+Yx@*p=;~8Epqqfq#M~bg%WQ zem2EPZwMxSNz8IN&ff2mz+=2k>~_V z4!);YOXi*xTE+wzji_2~Y~fi$^+4qY_jVx{t5m(j*CcSlxmtDzjoMq*Prf}UAxQqx zOUR&<97-WsLmsea<&wWT4XcjIc^73LbGP0OT=n=MZeHGfD&H-X5;V-fiB9*tEM0+w zn+5=~(kU{MqD<*iT^|%>;HrQ{ZDK}VB@OeMjv%d0cJiTGWoKVHQT9CJb_vEhN!GGr;EQQeknoTu5;Kk+sl zYgq&{9Fq#gR>vW8dG~C6=lOL@#LT^I(Y|nvhfo(Me0YG3C-j~pNt|EY`I#*8JO!@E z4SPi}vzA^A*WkSDUG+jmhR|`bZ-pOLG=pl3W_`~bXYG&J z0{yI~YoYFyo!$Ountpa;CZe{Z_t1)PBO9&t1FsE7+_iv$6Ifx0ws|Z@Tl(P#rcapV zGG?9qw)rSFS^-<%rs;;QV}}Q63aZh*S}&rp^1!A+%2>f|uH#f>K9o`vK@= zmN{GGzm}BrmV2u_m@SR5bJD3K4eUrsZg{9CtrUGgomN}C>vbRxIeHhwws{DhM1{(j-ei;ao9pnP5< zPB0yx|6HiV^5%;P>fUD7tK=Zq6^plh2I}BovjQypJPYUq(%ndxYeA zUrXo4ryRucGxt_A@y8xq&}tu<-(Qp73DeeStFd8!!p_yVAitczFjsxT>U^ApJ!#O@ zEC_~7Z^%1RzRSo5Kg?azoGyrMG-quWMWNfo6z@s6GA?@g+K%F+?QexZ8bCu}`K90V z7E(EsEN%y(K-D0O{4a=EXPk^`K^^z*i&Z41(#2m7?j5rs?TzC$e#_0r;~qzz3DYZ2 zVKR*JO%fBAJ%GECyBZMyDansE0;t9dRgD=7d+@9#c*1u4#ZTSx@A*9^cH@DTL!CR0 zpm0!pW{F;WWUs8}@dpvk!w#R=Yu?E;Pr#i{#bjYOSu=2!g9?rDJlAJz!_6!8rO>(hf(I z$4x5AxvVoqmfDhi;8G@+RGt|7-ce9~ToT~|P?c%FPvKTj445wr`o_?1_*IEg>cBIV zM`KJ8PTm`j+2EdsNdwxBYIy~^*ht`(m(_^<`%8N!f~i$t-l2f@wPn-nlV`RzE&FdN za)cyJlr&qN(AO`qlpZtcllvM?qMChbm@DP~@(_1ON%Gx-e{`lA#9PbF>HUEavuef) zy(l}}La%GSb#m+B|79=4{cJ=jAOz?!1N*m69>(mMnTPQ?S+7%*zSpm7!Dv95!VZ$2 z+;=hoPOoveJO9*1K8VCojvtN~CAYUL#8{|{LyT#l@6MoLVphnh7G5+B8OEOaEG{lw zqiSk2Lib^q0v*R3^9Vqd74u*K%)rjxfJ-v*uhN%sdAA>WC&cUT5xzQWeM$TTDc2jk zj2H#I|B-cqMw|=9&{k(PtlTJkIy{;hWuBOadU^Kw{B_!04AZJl<0gz9B zEngAd33$ag5p`7@WqmmNZL*A9DEfWxi1BF&vg_k0T|D@4yO4z}Hl=Jph=)}q_9nZ= z#q)G(6KB&Ol|NiJtfuW{-{F5WJO9!<<;BP17A(1bZysDW@HtG+BV?EY9wuzWP2mqz z0JkHP0pIQUB*D1UwZ>L-Y;Sh!wopVVTcr|(JS^rf4QlHL1=pi!W;+;JxB}RCW(%yY zt+v(pfpr_3=6&n9bYS$4uP9n&cbLo^y0!`GZ?L8viAh7iV5=oF43=3Kic1&N^~sq8 zOrHOOH}xspIqLh8fQoc$Ydko1YW>MY-~;OE!x9JCcqD06rWlVTHf~~}X6^a_#^a&h zw8`-V5*xee5Ur+k)%PE`Sh?L@Pw)p z9xLt@-#^YCOk{EKl7ahM&p1b}LM{Ho#Wf9IXkdv< zSYe06H!8<9HfGPda2=_1odHVrX<_?=C7ItGh@gci&p|hj&4&NYPZO0eufVUjtIk)E z>>|*M$O|k)e7e^}(q*D~!n5^LQRisfYM5dE&X)8z{o-Tw^J6|t21@?uWbS-SHQ579 zvoe`z(goUxj4q^ccP;}3ds{5`lZh@>`xkAH_=4HKH4par)bU6N@AE2V`lKmdZ4UC< ze@SGs8S?$tP*@wAjBkXaSaq?xF7ywKRDdJwJH&I$spQ1u_|~;j6j*~FXkNut!RtS^ zQ#kl?8y6QXPlEsL^~itrvR)e^c+brV1Y-X{jRDoDaj~=DENyi69n(y9$)|R+5~lIj zWPeFJ<=s@Ur;d|yzW1%Chggj34POU92zoT^9Aw{hf?&clWAU#KUdc_1|GaX#^5rzL>@L}b z;v_Nc3@u_4H#=V#7WY99EgrCYx#y4C1R`(;3y+hShs@P*Mgn?m<%?$l+AhH#!swoyHLk zIXP=a4o*HvMJ}iISJDu%Ki4jaY+3k(`bn@?z$%d06~*>@Y>7S^)XPazR=bJ#E znanfT>sG$GKUs=6R@2hy38Pt>5H;nqSeYHgUPtm@TwrEp&>g}V@eQQ<`KcL}F0aQS zsIk(-Zt4*CX5Z+!UO!_ZTvg5D`La(&`BT~?_c71g%A2$)6l!$!g_5D9V$~ph^sz_N z)4%QC{2BJtosh)q26aEW8sbt?lG!i8E2_i>RK>5>AK}vk^Q_k}!gmRu5;R2vn=0-mvzMKr7)4*U}zA09_eFJ_IzTL^ZkW9GaGgH{8%AaS_cSHXgxU%?B z;A>R;PjugM_07Y2z(9G;Cb7Hn3645HoDC7@?_CO;XFK-7V(&HeGnW~fR>JX+PahjY z?UyBc@X8?b%3l?pArIQUuzY_i-HIhSrx1;%m+b0i7+82ZaZRS4b}g(BlRwRV4sRCh zmu!ASy*h&g^__e>CVzHl$ze8Ed+n}%#{SPm!1@Yf_1D|((qw#&ga+H`?@FOsi)ZIf zCri}e89s8i=Isj(n>w40T43;#q zQG~*x9B;ZIoiLj^f#H7+=)Au}ub}Od%4VIJg9x~(s@lHyM$r?wk+Vm&ApIO97o3I4 zN*d@PX3p9M#d#&VyWM6yuNFaD&7v-p1YY0&ObvEF;?8d9m)#nU+?<`(HU8~q$xt?8 z=iDcw8iIl6JvU+;`Kbe|fqcK1LCUQM3WsZhS1vCjC>D6;Q*RlPbELybuPz4njldR? z8fSkIa>6D^s9hkGzRbGG{M@hYUcJeX%tWTx4tSfHb+XJ?oLXPs*r|zDQKZqllnnaA zTg;u$1J1a;F{tLfTo19~d~V%9V|n3=bwR5Z#kpk(x3~D>BYU{>*+WH~vQX`Rp%VX3 z;{>?;WcYtjm2XeGkrz^{tLor~oiSm6E$~a0ndTFj3U-!J`|C5aOfIO)rlwb%8F2%% zcB;ba@`hA%f9U>F7!UQ|JB@;ZMsD?Tf66yYfp? zYh@fiDxD?oqr2@{;@aai&U)eGor^yU#V_PfE=din5`ljah+7yItTYrTg zKXs(D!`D$MX(2UwYIYPyPjs2f;2#ON78WplIU{i<*Q4JBtb)~VmWJrYIaV?+?$r(q zjn`wGZf0U_XvSyLd8Y`R<&!oKZf~|Gv@{0I#{i*K`-=&&m5IlE^E`~-W}k!~$tCvw zJnoB0jcH_+&W1c#G={ht0OGV0A(15M1Mp@-?x3B^Gy?GCjC)C!3T|u(hMS?!iy+Ji z?iGKOCi3<;2^(Hq1xkL={qDj>EO$xkc|6kq*zZ12%!=@SBNayEZX_u%!nC*4f;U+^ zN?B#^n~w9^BI`epi}NOM9(zAfXC=iVmGlS>WsNe}`~8)l5@j$MHP_SJt*(8@&Mw$M zKTdi=O3xor_N*br1Z=y$SFJ{yIq`%*@-=nKvZk;b?y0BX9ADu6Q_7N*EzXKCNis$4 z*Aa!aLWp#n)lLJEt$LgfqMBlxi)p;~3LlW9k{7_B`t+JE!JIrsl0@~HIOu>qzUnPje=T;}pIsBXOgVYP#xR&OG@0NC0}VgDsuqB99d^&`Hq#8_bXX z_D|%66?PNEI3c-gxv7pZW?iY_=4^HiDCmmdjRWQeJ&pHEg&Nm{Km9w*Y!b`ITIUgr zK#=7hq4DiPF-&TdAOBm?XA(%2G3GSmT>-uPr9l3V@y!6ApIb(CaNof5>c1Yy`+sEE z*n1JQ;`fnRs^a305$F8%J*^!+`F5|Qd_lqR0Q(9Jw%a$C(i3*EP4M92fTfb!@h`EF zV=LYHoubCyZjI@+07-q7KS-E3yi&qPsPaadD}1eWTRB8rp&(115OY$1s^V~0A}ZAZ z;n!h44O!_q0ZNi5h}K|dGfMA*V;oTyCC>uBreq$;JBmS{R>olfEH71)Z^GviA#XC4 zXRwi~Uce(RMDZ&k-fENH&i-qGO}?4hl}DT%E$tDt3uJ$2k+7mE81_DqbwAtkRPZ(TjO{2N(lnJ47ZQ*<+NBvY9bEONKN+n6?wEBf1Zl5 zRv$s!XHNbB{i}~AhxwnZZ#-RX5u9=hY*Z||@H zhOuai4$E$*E=rdw-4KPi(yvuo{)zGYt&a(Amlwx^Gzx%q*wJ7kz@(4$4SA5cQo}%G zvu%J!?(W@FXk+Vv)0{05kGoY1hJIJxujA^?%_mk2oM ziQ#kRf7ML+K6kLOtiikIE-)g7BD1ZIfQg5i`>FAibC7-e?_v*$jPUL1CoLPTLMo~3 zV_`L-nko?Q0fp><0sp?oc?_?%n$g5isa3GfppR5tbPPRxn4*Xk=-*BL;V_AQDFAIV zJq(MG>aDr%cW3?0PJyhdSup%+UgO^6o$3sdGj3^&n%_e9Do8-_&oa`b?82mLkJLsA zH>i!E;goUI8rG1!U~w|X?}V>5KvrIe!)PL$V9_r%!uekBCN658NN9Vgn3`|E^jUZy z(ar6N%e$gXkz>c;R-gR*;5Lwio7rT9BtB|q9JNVs+0ilye5ug1_;`J>gJIyXKd7}S z8?h+DVdd_m_jLbqNe-*?8%~L@SY>$p-OM>kBGP`-`#&Y@(DT!2ix&!uzwJXl%lGI1 z#V#NVhtc)}{{v7f3T0Usti++G=iw+73zHyR6e!jdkE2gt$ z?>1dtx`=%?Riu~T4-}1wX(5v!EmM$eXzP)lJ1@vQ!31s1jncd-q_k$ivUvHp1{PW$ ze!R74Q;ph1L}gg`VZ0VfxUQVZeM6%E(J%J1Y&G)<80SS`b?@=lg~f7zm=anZ#M8zc zWb1msw}qV~2Qnhn@p2&c!}%mVYvq~R3&{(m;!{r}kb0WMqI%n2azkK9-(w-q`R z$>s%Wam`!lo3>?%NpEQ7j#wRD@i)rrvg%>pf3EIY?~FP4lW)w|rP!R32oz6YGaCKh z+71|hTVBm|kc0A8b=8$ZUy73vOps=0D2Z%i{mF;X1~9FJ=6wm0etF;Ox61OIqbsy+ zv12`#ZjSJ5rx6cjPopjI0N21zJaUr65Km_A>e1MVzNuFJa8`VM{h52oZj*M-29d zxp~T|W_QAaW%!KgdNyI$kZpStIk|ksIcxgvk8Fj|QDXn&K0O<QJmDVpJb$52g@y&vgSyhD9(yNzJhIf+PWpA?TbUoW}5HDhF zKqMn6kXjlYuud2yWrdJJ2jK7^OqQz=1qzA3MZbR>Ya@cg6m~Z0<=hN0sX57o|DApw zSoU>Uy3J63iR`anRy4ynU1Adwkc6HU$+hWO zQ%xA6z6vhdKJHiD8$w66#t9ZNX#HC%j4SlpfnhKWH9hp8D<_5TMk;7v*1g*AY8x%r zuzOJzm}?d~B$7Qv1C~J&`jX_P=!f|u=S%4Lu$jz9yqM#FBfIu}j?I87RKXu`N+(C#c$|!|%;0(i<|cc#O17I$Wa++Hm2chaN{Y`1 zwQcV@4T;?e4Tj#OE9gSz*6RpFe4|whmZ~|zZ#V5NoCJM$h+s{fu(5%B9bob6r01#o z$1i9FoK(qgJg(%g^ZLB$b#UFNS`{6=5TzMV6n988|E2#u+GTpf+g$fGtefvP=5_5& z#QzQYCJkc=?pR|Q8)+=i>FKm`A}Y?j-|F8Uw_qP6SdSm(VnxGMpZkyekR5UTfy6lmk%&Q zFOIQmKKl^5VZT(xJRq z)7|8yF$HC=d*btF`$}l8MmN)dzWiNU-mpdte;P9IHAxQ3E>QK~;oX1i#N!EFSZHY+ zDpQ%FdU)KpkG}2qWu|4V*D-usz=Z{h`fu$pEl$O%@?^4#Gq6RV z<#34dj-N~^JmB#tXkx*hjB4=&lz~J&XB;H6+pqUv$cBuz1tCeEoROi zzu2U+Tm7eO#^-hWi_S&6GqOW%*CCpRv6K zoYSsU`<~*Ukr}e8cO=0P-+Xk-2vhJRRChV4WY(hc?qA|eSDXpk&;O`^TZ2bG>@}3u zT@t<-DKM|)%%OTS{<&l5`^~ac`AYoS`L$hb(MNlVZ)~_#dbMOOk^7Ww60kV;UhE?y zPkWMCtE;coH9a}ebP3Vr>Q-4P)2&W{%k3`)Ee@VGzs;7pwh}y>gq#sp8M(%$6b_mk z3$Rf7(tAs#+M=6|-qWhtw|)ob1^Wwa$l}DaTw=eB22nQg0>3IZanpmi7u?%~7#b8s zb2c=aIy=c>?Bfw{`x(M!=gTkIr}M<6nWztI4^;>jmSdPJSeFi0+5dP#@{V>(MCB!u zCw$me)<#469-v11PHlFgAVDSJcA$R=??R@+!eqx;z%wfq3(%_~0-j9!fH-ggx z($ftAdNcExCoo;kzNfEi1f&J4)`JQv{{rW~wFT5Esj+Nk@BSm`tRPDCq;L$&g7G5z z@l|wy3__uVWd(%j(1}#94XtLn@?G+r2jt1^f?w>bZ%7=kHivdmOCEP&EQXpz=*|(mVk)W%W8xv+)N;#MNG~{8soc5{& z1Iy)H`5X(W5Tkb2H7BTV=^`i+vMyW z6r5HPrU(IYP-po1dxvMgq-MnU;PKU36fIlt)H!?5$yVI1v(mC4JHSt(1{tHc;u z{SOs;rI-j#-}g+26O2>RbXqpJ{CEa#`ft(pBK0tf7m4OS)o?80GU+9)YSj1wlw&SU z*|XD5AKSk<=3~wDS}a9NsNV6)QMsbewfJXnzK&(EwrKTMM^rjgMRmSc39Ad~D>sdq z2Fy*V3cc=~&*I(lc@*R6?%rn6EJ_AI!JpF#&eo086TtF;FE(zi+5KGLstV}pb%7_cETxV2Aj$>^6TeMi-h)dHGL>UN%&H>V8~A;?RTwc#icJS zQV3Wfk+&Zu9UXfW5!_=4B)n${-gpt=f$`9zuo6tO%DAU7vfYk4&&K|CUWTc@q!;T~B#)O1k`OEN9Vs zEW}Mpu?v6b60vI}6%LWp>&LyfQzIh0>;?Z0NaFNy)rGX{AJj;5g1I)|Yba<6Lcge} zuSAWxWgcMT1A^u3dfnkND#j8VNYFzTYzWzLfCG&$1O{vXs$Lo7st(Ttu{-?_X7X(;_4n zLRDI$#}rF^%oWdwv3X|UevsaENldCMgsmagVl%ir&Ae7Rz8g8RsG6B}yf9C!M(TOYane6ZyUiy{6=2TNs|Iibsj zF&A0(P3Mox#h*Xd8-FC{8SO89F#F5ik^5QwA^8WYSgNdMP%o+-n(tbd|J9TqY)|oe zvGpPf`^0p=G`|VJ_Cg?7cKRonz5|W=Pr`6Deu$U7>3*Jih3$;8#0EtlJ^eG*;P7le zp?|f1AWi8kov}Cb8R5TD-P6>+jKsZBm1o+$OM6?Zq}P1AM%D?TuJ1;J_ieFUaYPc| zGwN`Ip-NAo`u71k4kk?bs(SlO3h!80o#?td#*UA)9lo3gjIX?R9cFCFn69p2!9pXCU}qoj?U1jlEJ-FE zWadiFyC+%@$H!`5w!zPA=LHYN;tj`fi}(&lfK7--acjkG7x_FSq69U5p#)(~X778t zlKcHT+@MOdoa6pvj=dla9f&Ty~Jdtm|!&@4tMhiM%@+c?M`2O=K1Ur-9YYT|dHu5E!aORfT6sB=~&y z6M+xh%sf8ni7qA6^L*5vY2l0+nKQCSs9+m3Cu*vF8d&BLz>hJYI&W(RnlS{)KNOUw z+dvr(6zqRVuuI~pV@0_-yd5R-I$!$p|rDhuFr z^3evWg)+`AG4HXeL_;Kqqma0XYc}|u)1mgB!jdEpn+1kS(0#A*nt8;CQ_5Su6IK{* z$faEG=)EVj1l#z%9oi>YU_{oRR)7gO)=hJ+7KOlPx6dV_Fnf9l?=OYpC+Je!NXqs#<2o=G`+Zl9ioWN(f?F4Va^AK^x6?wz5(!MP{8Ugw6wb z0uxps5HmQ_Yz^jNfuWzQ;1N*?mlpqy^u>V@8+Z*RmsrU=Kdt&Y4V{d2>Y%Q|?7jJk z;hxUx6pE4$+0VU{&gSrAeRw&D_mQ(cupPKVOr^g+i=}_8=r(XV;mFfIhx;KrWGQX2 zq}g=EW|(Ge8r>T-VUWF(*8#BjD`4fkITvimcV_P*P%z7!nWwDOjut#p49NJi&=A&{ z{z$Xw5%;o>uAr%I2L};M#*kAYh!sh|+bYpvBR6B)wz7l7d~%BKeImY8{tRiJQ8sa$ zT&Cbn$6%E6$8z8%G(~ap-Y&PkwEDEviltNuO6QJ1tDM4q?r|n>_olz>71@M(Uyffk6_oa-2bsjnlhi1LofJlWS8`IVW%_0UYOjfDMQ9qSw7Va zV;NrJhiYB*X4|6lVE(aXX(ycyst#st63kLxK*=UmMXQ&5R14&3t$#aA6r$ZFJUoR=e@{b?an z0AKR_AcLLq*6v%FS95O--HBzwg*VO)qIUi+WyR6oSI;{W^hPCA^hwjTTS&=aaLX

    O!$ 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 sigz+r8$smW4 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 %^X?3(my`y$Zh94B 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

    =s^YWo= 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 Cpi;CmlJD=FU?vW`N@gUjj*-p(frnn6bn+xu#E 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
    E2s^M+C_y!ZPO2Hp{?+W4Q;$aKJFM7O{2T3+* z4oS(+FuqrP*-$7N9fX+{w(_HEU(-H|t<4 z<8iFkyjCZ40G7F#{m7YpdA546qNa@l38Sf|TQXyv5Px@40eLWM`#$(x}lIC@73FTOMrYs`(Oj zmXvT15zRkRTSV%+bc71K4j`MQg#XzE#je1B3{arIscoHtPBlo&Z=Jse9KKWKb(KQ7 z!v<-v(#Y-#Tf?ieF{DSEC-zWAvk9;6T=gWhp~{hjQF$T^UYcINWMAS6#RmA!HZA zcvqmffnb+kZ)|P!mk-Z|Ny%UKRGGPxFgaDtbZpRE$8|~+h(|7U)v z)qf1$9mOVIvrq!lnQ9To7_pIXcTv?5Ads^Qa|EF5Gy*9OpZ=psr7ey(hGP)NrsK|` zg3Kb4$=+&UWZQ?fI#0T6fFM^7E4Cz@1f6oELm^5W#nS)U845X8kGs z7USC|^FH5^PdC+&dj33PA6dWp6y}N3=BB4*0J`s_q4Su4w@1R(ns?sSy|x0AQpR~) zb?q4ouBZ52+0l7eQ=(3lshuVtUyv0*ja{e*t& z$aU7(`mci-42k+c6DBF2^2_+mk~E_1;gh&bY-%?+_KDf z5+K@%6$?&F_j+L#XZRSL+C9XZ;|T2sv742pQL*-A!{{=h z+4v%Nn%lnEdPdFhyp9r#lb7J|yz!7AK2Y!^@Jnh2@@M1HH&q8aNsf2H$Yo(@eY2{d-NN8O9w+`7V)V--X6=EAZohZ`n12sO$fF23t|!fEQ_- zr4*$7A`@&)NKPK$_o7vP+%ozRVAR96srypXlwU5i#Fv-R7bG`nM8!`OjjOy_(dG+V zbHg_!3tQMEL+O~jL@g4de<(r}+!~To@=LZg3u^0ihsU%S1;hlbK(jbg6hrW6KAbn? zea1K;uq(3|oNz=$bDI9iGD~^Rl1~wdWezBuKeY_Zcfhf=p$OI!@ULeuF7B2&s;_#) zV7riQjKx0SV-I>n`Vu=-m1D4B1Rwkwy*Ji`wU&xg*WN3luY#%sJ6d|&I3?o3wa|Rs-|H|n zN)f9?tqI4S$M}yZgfY6TdDl3^Uh!w+UD_&HH2xXHqhAll{t&%rk94GFT0~#Qmk{mo zXK7BvpmF+&hzP4!*W1RJ&qhpsoa{gT`Q|)u5&A)P>mU53Dqaki3hG(HrDxGB_Lmlt z4o#uWEf{$P^t9l8t!u-g8EP3ejLZTl-k89MvRq`%C}zLU>b$cxBu(1`Y8{EB^qf4)m;rLNt#8op$_kh1>wHIPA3O`xCIO5h2X~y)LR27t5VMx zzcSfrWY0X)Mf<{-V_K;ARe3$3cPJNchq-Yam|i^G@s=?=V#YuS4Zt@W%MbeMrnNB4 z4~>JYd;qA3KrsP33P!KUfSuz=JUd6y6o-HFhKf!dN_2B;EQRJ>c}=OWlBXbpq$HRVe<4mPAhuSztiu*G7>&gwdy|T zwABYd2A_e{UgH_VO-B$qejZFzb%k(kO1uMxPj5%dCjj4;NU_OLL`hp@Z|Z{z9uX`k zg;Ru%K_0)4NFZu~cL*MJgt)7|p7bQHq@T+sabSm5*4EdA2lV@#rO8{Vyi7k>+i)t2 zTI0DdgN`PZK6>}K{guUl;^oYd<3w8n|k))OW?_)s9!q-HqRR#zdLMH=S1HgX00>p{C6=XAcS=Qfa7#W4^ON+ zE_OQS4WPh6TkGOT5^a_>lT4?EUpkV{9`|3?57OOsSa? zmj8}4$nN~1P~@BmOicy{ox%nZ=*!PB)16i1dtrR;g)23i_at+^#Mj}P=BJ%vXG$6f52u$?9~_a#@Jjf< zZ(4%4um=PVGpzv&vpgt!cr)&~&8LV-!t^bXXV2-JUPoq<{-ZP7uG1^D^!h7p3Ug|Y z8v}1L^>10N`(%wQlzL;dX0e=OlLr1hH*Ox zba(ATi&5%r_cPgX;`yVX38D>?d?43MvPhGR(&f^w(D8LfU+!(;=R&7s&)JoME*+9# zX-(m9*TlusYY2ttXE@%rFQ=PROs;;C{nZVtx1K&a2xk9ygx`jWhiso7n^;G>bIZA> zM?SCpblakgv#VJii5t^p@=N8+tD<(gzKyMuFl|B=E^UI@D4G&z5}@$Y!28*0W8V42 zvI3~{&CjIB0tc&ks&*pWImcfeK~e7yqFaESPNBKJozhzhe>NndG9i3CdGa^5CUZtr z3>e`(@a2)ITz(w3SYT97G8`|5XXxIia-!BNr@FPhX?0k=LJuNY;X3WP;~bo$sd;*I zoE+-YpX)T48zxBA{K2;Fnal!_zQqwl<)qq{)-~yOHe0ZjgA{4b+Fg|N(9v_($mX*Na9Po;Ye%C$y)Ukoy?UnTMHC|08dju(ycQE)R$Em#CYjovuYi23YkRPIL zevri`)WO4+Y8|-siFL!K6k%>_qT0H0Z>x-SnSRluY^0`m!K$D8-dY7Jl;e{+)~9A} zrZH#UGGb~TkHv~jHMbx!zuf`!Z7ux#AX`b5m76dW&u5t+7ZWyQWEc?^oLBYqqoOlK<~fUlE23#S3tBbG*ee zpnclzFCT`G#T2BI$NFcfIT5evZ4KUB?J*8n{?uN+WsOpg4RDvY5XSibsTxWPy(w2Y z*ze0FxPTK2VWXhn2Md_fj-4Saczbh8eH$meHLoP9z~(_WS<>}juYzP-#+jcl4yeTohD z{=1gw-4Z6dUJAya6)=I5P2>v!0zGLvmyQ^lTwzS)Vg$e;0kpC}H)Ms{^HVRjM@=fZ z=pqfWLMd5k4!n5Ed1<;3$-PWF-=j8vy04hcPy7Oz{drp~4@~j)c$o7Pe!>qbkF}z9 z#46cG6^a+60pIrGZvbC+>#`>Q(jyX44%$#j$kqC^h3*lL_iQ0iUJO;2-{&~HHXG)b z&s2Z2=aVufmHO~^|3oCVfO~2&` ze*kFLpV34%he%{M-Q6Z6Gt`?YRWa$t%l+8n^ZHv9-ouXzbCGOhK^VVqhIg>3MDfvj zSTQ@A%2IEJ@J-%<9=u9hmP*Le-a_~cMjwu5NEi#VK@7 zYe)|+udxQQ(wVc}CcjFb8dw-uBRQ=LMQ}R^n5p0)6^pv%u*_^91mFw`yz}JQJO_UR zCp%_4g%M4p2{egPl%=1fp`I@U90ALG0qM>+KuyM&Nsl~Cc5%qENx81w6L+B*&{}~f zU4L@2umwSibLzZspE97gmN-Z7#hdK$RN{~0+097?J@|@EqzM@oDAj-X=d6yWRq4TH zeX*w)KFSY8KYyl7X+aN6q82cq~~Aj6X6;PsX^Hs$Ll=6M!oUB76NOi zA%|+-=S=-8y47&f=Xmp(WHsKYY(N+LT}HVr=0jwjhsmVpu+v?a%)Qr`!IQ zYtoVbg3$!#Wd6l_ZM*F>;A-VHcyGJ-nrEB;4=)e@)G%W%ugR5#^mpWD7R6SrIkaxW z#FlSXPxLLbCV55Vpbkn!oYcmvQayrqLGaeoOb z#IUPx;w)b8WD689zsIaAD*BuxDt&k4lJGRVVpQ(6Rdk>JDJ)O$_B#Zf~47b5}PmP&DNlWY4=G? z>;fI;!xwGp{XXcJK)d*8ME z0J^B;KbOB(KKF8YDi#ohN|V>>OknVh)8snfNLjnQd=55%N*43dqgDr#rm`^f>UmB< z5{8dU>T!ykWnaJqW}K=Ls|{R4M^UH3=OpEGZ+>o z>Nw0Zzlv-_f70XgQX{V<6mYGE@w`6=jQ45D5rP8PXHOV8%YMt{;C)vu zabenBB_wQhxDug)&#h4ya&LCKAp#f&9?<{_An@bQx6_$hcfC&pfE|teCz#T~$SsLh z7f0f`%~o4Vq}>^u;jRX`J6~xyR>4k|(9-auW4{^6&y~|>D83OGY#e2F8(1ULFb~m* z&nN)S_YTIXM$F4Q!1q0yWm)PZ^p^Xc^%(F$9Pkm+RecyL6XfID?@XvsJQIy5!5rb) zCWoO%0vxd#egGr6G^k0CDBU4&X7e)lx^369n2Csf(u{ISI<|HH`n>Or>4$Yb_b1^XaGDnP zsm69tyvHDuoPL6yRmBuZ+EHqw6>#E(9J-!;7Npzdy0t4c8(_0bom%Ae*;yW0}Zx1JQi3=8UfpFa_f6&^Pp z8mmQ_Sdd);`pNX!Yvg&#_pM*8pufO zJYv6#VTqkV@0He>=;|xT{5mlg--}%8-+_oUWe+k(oSi7IV&O*7?^9gfm8icdu}?3S z@QI&tY!vF4(L3SnA7QsPay`Yc2^xQN%TlmCn=c<@NvwTx4LGDSG~GkkaIGbg(hwA{ zFF1{jQkjwh5+DxFk9<4}R_WPNq7o>+MdfVaQvywtd{+i?EX)IUw!@U+&Fi@!IT z*}e(o5DbeGZSPRrJ~oxf2vF7uF-xiKdl20I2-xhAu*(9l3WWPFf5;um zmr*f6NZRLa$Q^@FX^UH@~J%t!~Ax}xWi~+wKPSK>V%WXf7_Q3+Y553-b zJ?;Kk>wnGeH27I^(*i!U&4!qFFBe`IIQRp}Acv_p$kde+x_#-l+vbhq94~=;_Dm+K zSUJY^ePC)U`t}F0)ky;0*>W&BVfm=TPk$Vto^vyYw7uE284Uw%!G(>_K-dT*hdpT7 zj|~R-y`Se#X?L3(PM=!I4zrH^j~$3VxSXfGBxtfi4%7v0HjC!Y;i$q26jG=&7CZco zDd{~UFajQ3%YCM9u{T9Z*7M@IE9vILhrhGX1r2>e#+zG8#QAnhzI@j28JEaibznZ}ZqEwm%L|+KEw9|AH4-)m`^L^rH$hCXTN^$ishlu}w=H zfcK>Y^5!&M9PYsuf4S${NmgS)lJ-EF?*}R$U?rl4uF|6y43Ut(veNg|k0av{$v%to z*7TrBUbpt{;ZchRy5qaHDzE12j@FXJqQ@*nPi93drBt~_cesqU#8l9rd3YT2i_N4e z-zhZUb<9QAO($P$p2o|B>-KF^pPnYjXP3>jeo?C(cN5!^3y|_rNOXmFW72BQ~H(GLnO&0A`nU3>X?4YJ&6rY_LFGAZAX(7INWf+*)MC< z6=h&x7aXv83GOGqJl3?#avj?`E%A|0-d}6<^+OaXD!q59tTl}?kcw;C^7h2}FhI;H zf8s62YEMmj-9;Ab!c$)#$n<@H=C8(-nw42HkjZHi9FSn0DsVjigg<7+9J@GFaWv7R z;uy5k4O2^^b`9?h+O*HcnnAAnX^B+zvoRh9E{{j2(OybvSs4+2JC8-@>)sL5TlxtjIm)IJ{cudqNU@ z9k*7o9~h10Rh6KMs(Y&`u3d-sdu%1o>h;3;mPF=7CcVOZl0f1U0)xbfTxQNtMC%W> z(7!gNiqX`H4SCze%S2sKbM%z-WT!uHHs-K9lc_+itIG3sR$s@Sw11UVWmLqRWE2!%dSn!=E6{;l^@5)a-($Ubk0jj-$PPY*r&?hlM1 z;aL?VX|SQW-`T0Mxfrt0EFy*S+1JtiR1QUW!9j66`iH!qS(2=ds`&9};D@*zFRs&s zfDp5(+^5Xe)&*%fde>c!pZ`(gTGZ*zqqFCaWs7+Im zo6SaWiL0jB6hcIqTdOSB4ImK?6!Iy`3YPahExXi^*wbAtUs|F+4lS2wv$gn&6p(cmF1T|WP3-*_?Jh`{+&wbXj|{>LSSr-Viyg6Z_}`p!$n>&nmnS~kZD2E+*RSW?oWZ! z`oNXWdSB{f&9DaXv9CdJ=Q=M0yXw=dE2(@cPPWz>T8NL9PFxmBv(|U=f;|^+_9HLP znk${UBaz3Gy9t9_jPJWnI^;E3e2|F{C{6tCq1uk z?3!`-wrB~jjD7S5Cjzyf00(CzTMD_sS3J(ZzSk=|0!y!$)8ja$MzaX&VL>MI9@@Ar zPT$Wz*b1+}TqmoxX%2ja8rF-z()z05RH!u171{Xly~a9iCg26*_az!*@2uUTN%AS2 z=fK3`DwAts$2D4Q4Bs1#aF}t8rNr3ZK`e;MX*lXvi`+U0KXfNHFE#B_P zIU5^eGTSCgf_5JE@f7Nk(W9E3R}OE!P7rew0};D~W*tOyrV*dpVcVX#Yi5qTCFiBf zt5}3^G`wTa@5R!xyhg|W0?q$mlpeSerE_;GrTesPXK%~aqz?^+VDyt zSTh~OGRLc^Pej}FrVKmJYn08gb6U?%ed#)(p`9d3u2NYh22Jz0bV9^U* zEh-nY&}M-$4qo>8LY{ij&)_ZH*pcZ(76z=1c;wYV$NqbG?!q~$6JIHx{0EMi`a;~~ zDE+v=onnUrW0*!WGM&6s0qU8#-y0K(v5b8T^2+w~jO^DQ0&glzUw8+^VJ&^=PRk#0 z2gd~XH@23Xa4Io4F#BrDk=&*JhHmR{Dy?2vsC*}FJtS@zRyh6hsCPFy@xaD2JBF9) zGa`F-aw-`27EV(wLduq=k(@V%Y7MP>nMp8`)A?SM!d&sJ;5Cf z4b7s!Gwu$rmux)1Bbiw)sL5&b9z<)h%S&pvG9lvl-nRYe&PdVD-FhrNs?A*oz2K>` zkTq2rVFl$+&05@hkY)#2DqZ$9{7RVY05iv$66q`Ip`0Rp}+`f98 zb#k2v3Lu(|>h$Qq)G~n3$q92;Y~CzxBXpFtb7FMzm6_VP1&O-%#W+q0c#4&MON$R| zmAt7KDz9m;PpK+)A)2`M;n^}CkR(0=Tku~A9Z-+_PI8AEC8f70{Ab}Mo^;Z%Lu1=R zTYtx*l%3$R^{wzcW^q@XSji+Vht89qvet^`Sy6w*p*|*OO}eBIv}$`#?3q*qgk1$8 zv=tvD>o;8^WI&hG|8O)40%5z{vfgDn1VvJg;>eVXziQeKF?r$U4T;=p3XR=sX@vs% zIwRjfyaGLcJHPwdY+`DRT>xu*lixwe9t?KL>S#+OvG?V?%VcIg&M&N!r0DST0kU+=@Tx z_x;*DKKUW4HU&H+tm0nNR|6SaojXWYhpzJlJMHbh+M%4e=SrNd);a3L34V0R+G*Ff zKxJ0VW|(gNR~4fNJKo_dhVM0O|Si7}3Q=j4t&|H$dDXFZRpTxvNFp?ngIz z#|z&=Po+`#l@aNYv}M(C-y>q8x=!1c7jjLz)9r6FQMXGUP;?z8!+Uc;k$GK;%~xGV z;|}Z2P|X=wwf*gOCHF^_mmLd~r%II|OhCQy+b<55i@SYCa>a4j-{)%z1eT2wv$~#n z_51wQdpw@u2Ft?Ez|Acs%!~n<>b;)^++0F^%HF+kOE@p+FqLjDb}Jf&T|ccK>T-*( z47$Y5hdnI?32vW#9-lhwoYe4?o!$}$NQm9^^DZ20UZS4RHapN zl(MaoK7mZ(a?f3nMIrE+onfKwIf-`$c z3^X@Hg5?d|G8FmwVOs?12*`G&ipxsMi{snHkzdN`B)$X3pytXMcUBt7#DAfI-i3+h zBcI1DR9n4VDDtl{DlO|R*RWFo2k_cjbHknmy^u~Q#*w!vQKXz`9EUgU;@bPIC)Fe` zl)#4J)e82V0?UGJUo3x(`x9Hja``CbgSA;5eeM|`J%xW(7dvktAuTNRqxyLr+_Q;& z=~gC^v|%1hg(m1mS4=m$lfEbguVC$$2@4rA<%%H;} zu@QxQT0&Y-gP9srhCvlh#gf~V(t6%2xQ1%AsXVoyE3bb zhnn2(iG>?-+Nqq**68@TD>Oc*q7n_Sg9pCKqV*8HCtRd8v+#hspxx8X;Tz_t`sqwb ziPyzE!LFr@39q29@3xdJR^wYIpU^VfWE!#iVxB$ZvjjNb=4kFgb2GgG@(@+6MK|;C zH|cZ7TheI7xsQX(-8nPEwlQd>fQ!a1|8F;sr-9RTJ zdEJ7ePuT6eTvwWS%YPt!cUJwVdl_*80B-NbG`H3`3E5x!*J&-h+-RfT;$0sf=u1*2 z$I2_zR@VK~0&2)pw@h+S8}q52Tta*dc{C@tBX&j>7UMiNqZ{{J#`KZOFFPKlyD}$4 zRO2p~?_2iJud=}V9g`b~a;wWTf?F($R|L3y%D7w07;Q>n0iY?A_9tZYx^Y8_Aha(j zwFf=nz|olNHN#I!Ny)5WlQFX3s$rAT0o7t}NH^grm5-;d!~Wzzc4 zeXi|f73{Jpcm-*_sf_E><4p7q&@eKMO`A*XVF6e37MC_+G-N=*nI%j9d8$BuC$4nn z^%h^%IDxP=Q816mVtf62@H@V@`QQ_}CWCesbqV`T#eOy7BmC$H74 zQi!kHTgMIgRcJ|XzDQPBC1UIkNAG2FYTNZH>V7D$Eki}1`pWqC{vY2+;-MRiPJUj= zJFyc&?@d$iQEzhf?<+fcR}DnCZtdYf77AK}h|H@uzz4pk1*cHVoH6jHr4i)t}nwoTW6?k=m+yFn; z*4{I7f)bZu2<)%d`sIWgorXdRkAiJ-o*NWD4bSQ%aj(zaX(IWSjkJpVGaFgjg<>PO zbTKfWPG`OVerwFWlPZO-R!6yxYr6cZZEN*<&q2b?9w`+fvGWY;ZIgqUWM{H)T~@L| z&<6~e;flf%)=6*jI|6A0-;s*>)ZHvTB(?elt;5seYDrGL5*2$#hJoZrewRYvi{}pJs;cGNkVG~I)YzhP zxK30!-bxm{{%2@@H!|RU<#pg4_}T7zAwh6!r-E6vSog+bFo^NRUIKkR%tXhP#;qgWiWzzZ7UfNPI^vyf(%kA!d_PWFb1|S|-M^K$eM|jvIuif!>DzLvxjy~k z#WTJ};iqTuI?%S=R%+Fnvuq&yN9o5*X#dsu*`VOPk z-!FJt=i5r`C5&CibG#|sS#hnXBNinKs24Vawk0geft-~e=G1y4D0u?+?kF2AEI;^) zr~}D!aId((N>*+Jgp7$KOXIO!o1`A}&hbGX#71*z%x8~%3aL7A;)M3Vnj5+%u?Z5P zX3fSnJ`R5brfE^ab1GM1{w(@+7rpH0i zvje-N55myR#8OJ|u<_Gu_y1^ntDrWZ_T4w7P`p5Ci$ifJ4#lkniaTv_ zmq4-NE`{RmPKrbEP@DvJcL`P~5(rQ%!P)ut`OmpJb7p@R`zDjy%&e^S%Jcl5QOBK3 zlTIdMq7I=n5uxUC^$8=U@Qvo@`SZNB5GDKL^F2FBevl58AvcY{l;UGC&~*~*LPtZ= zJ7ehFQF4;sxkpQte(t~1u{x>SYe9A)@C#N3@}UL%qr2;Td=1zPLhe0srtRoksQBGx zp@&3ptDJ3Oh!A%g-BxICcE6g5#*?l@|Ilc9hV%Gl9_u@5;G5)Ak#pKjJp}~${v&bw zSi1d`ppUj#qa>wQqrHDaMiPAW0P3>+%N$89xSi){Hv)8Q?uMOP%Hz%;&3pHuIA?79 zET-nxT2$J!ijPCRyG-U1fv5QQZ{b8=j|o}wI@So>-Eg*XeW#JhyK=iPZ>!5ZRKqDt zRSdq?IaX$z_Bjui>bt{je7Qg8c5EXgtp|dLQkl&ioZZRkI9#iD$1>_~<9-ix) zqEH*Pk&_Rv(lheEPt@{Y3qx02y~Wq(tw6}wGhuI2M1ctHlFQO0R|!`fvUs<^vi^6! z94PF*3su|rnO*6>m0qzI6wC$?Sdd@2?|~D5I07qK-IF=zmXA-7o_gwIQ z9;w}okk3+DVh6tbqSje_%2uqyZs8f6*sgE%Yy7j@bfo`{B8)%!;LZ1DZzoMKS3H!E z#|`9*aOGPgalVskn#-%H8T#uGe;vm?y{ls=3&Mh|6lw;oleuii7qD`gI4YFWm~X!5 ztmyeS$LBZe{-RekYs9YbJ+CNu62TcVlPq5seQ(ZJc5@F<-{L3Sb%0vy;t8(Gr##@=03z6`}@f2`*AFa%eU|}$Z zp_rE>yx|`M$dU;`@keD>V2wxPpB{rtgzI76uiq6hCafdR<+6ye-b;{dC_3V6n_>wu}G{gS!56is5xD zf-kKymg>33R522~#=3gZn4$x?I4hrUP~m-aci=J?-|o=vTz$LO4*8t(!d~%_I-h;ZpS`@U^ zYY=ECjLA@fPq~t89C*p=nUfMYX5+Y^FTmbDV+1-%A))bPt4(4sI?QRdSeK95n!nIy+O3=~k>nd*gjMJTjZkR~Iiov5UEEH)0t_-`jcYq>o}7XGxc@K|P@zqFj6 zQuN;K+x)AfWlzb>m8f6x&C`YUW`jn$GatV=*Q}Kyv!LvV%uuef!V4X1xTe`)%Rpn0 zH9*yabI95!B}>*S@#`}<%H?sSfuhfK=*pTbu;BfpkVw;$dM;UVHYh{%YRMr*JzlSI z)$C?|t6=!B#W(X+^72lLH`1lRbV$3Y$(K&AyE;?;a6$aB;Az~*ZMG`=K_uFp9(Ppf zsa}u3&41GRj>X!KuV~c}YGQed9K#oTt_V}<#T;ESRUS^|Fh;>S0-;nO>^rHM%@L}- zsGeN-r)gYE%9Hv=3Gb?8vd+^U6k0kLl#J*Kx&{Vf0RElD@H_#O!mMBckFUT)bkJ|= zy;AkE1QMt`#xL0!C@1vkH?om0!x&f>2p*NvUu`SyILa*$AxelBM0{oTOZ%EWJIl3noC`uYG44MmjrwTw9YeP7QfaBGD+;1?ax|l<{+3tm)H-C?q@YX z!GtF0+$ryv{!{*MD#lT9xpj9@TIA2($Q|LH=Ou@-RJZMTP95HH|E~9^aF{cGf&3Rt zyPl0_&$R$199B*-*sb=pZG4S{Aif7wCd6neCZ>n5j6a2|?Nl9cBk8L6l z`l$8`7Mjtbu2@P1GkQ1`6PXI9i2EA*K`xH>fUkL?C z==BOml~MHLooMv-k#L2^y+TlEX5PbJx_dmp=ETKk!pe=XA1?Oprk9YhCt;`l9`P3ZCynLW7@P9;S(3tFvO6zGd{4POs=2|N@uix z&Kh{D_KMOC#6k?yx;X;YeaOw4dGkn4s+65K&IfMP)%1Zb=mQPf_*iTHER?yp+62Cv ziTHe0tp&wyhxi$Hrb;<2OGMM`E-UDyDJ=_lvOt`vly8i^zinUaH@6j%5mmU2T2x)K z_j8DB4y)MTMySE!NGzy^e6>;XZj+if#=Ts-5kQ<7)K9$*6hOu7s{vla2ymZCLsZv{`mbXY z8~N1Y>3^TQ3tXh}$l!%uk*Hw*q^a7l+Rj-j`m+=4#o-uJTZwu4W{e`9Lhk;xIOzDI znfIFuv8br@P{nQ(?yNA$t9d>HTmDz2JP8(`M}A}~9Ah8o&R?g;d2qK4Cy@Cu$;h#L ze-Z|ZrAd{jehyJ23`71+yr`BI<0;D~4S0JS%aM3d@+u>!pJ-RfRV%>%KvEVz8G1`h z;Wl%ppVt-j@wD`XR`S=rZ721JT<$fzvOvv9OH3|U z)#!oUixKShGyKC$ywxJ=<vNtc5V5jdwu>e zjOD7G@?{q`?{KguUbAJ*o8{{`7ZKT)x=^7?)(>@0DNo8C^yU4dR-D$0}3c$$`BzD|wE=T;%-1X`HPYGW- z4|rm1j#wsWXQodT-9K3d-Y1{kEWo^;0EAKShYTr7t!^*WP-zZPdljiNYK)~Q#EWg> zNI-y4fUG$4lTeZ5q|>a2SIY5*ghf-i)JMrtBa8cPq7a$a%9W|F<)`{%{j;z}&iiRB zRD5qL?9o{dS23ogXD02XA0n6q6dkoik7`|2HERMt zUUx!%Ui1WJsiG{;W71|pY)d(TcbZP^3^J&Ci4=8e68y(B%`HRjf`co zMVUhT9{BD9T7F90!=)c$0KuU9RdnCOTAOlA<_yIFT-8GFQ^TzpSgTry#(gA~w~#zS z8}H1k4qBmizRU{6dv2;$2kZ%raelQ|+NX<3D4Ojl9L1zSoRP7K{t>&MKI4NL){oS3 ztgjoXwiSuLns*V)^z=*@FS9jdc1=(eh4IX0z1+aHoSgNNcZlyE$CssjH`)#qqE_~d zq4M*8y;#sX7^Jd_#S(W`$V;NX$a>z^@MK`26;3JItmD7S&&am>K3$Tr{H}3@{Rsbu z2T!V?E*^#8cDuwTkJFfc{%*rN)qi9a(5gg zGYzDYUPHXo_=4RQ&RLhJEd51Bq@H8R1|2B@DL9e1X98@VgRboWU9u>2_OAa4Di9m+ zZ{yaPv|+CqdVdQDCfkTd2xrtxwd?ZCUWz;W69MY{!UHvYs?!d1P{`s`PajO2l)GnP zYZ9H+=0qpp<{yj(bR8FOm-}iVK6x=3xLmq?-5LSO&%PQ8r~^e4Zs$2l>(<+m&-$eg^~o+eQXoh3&~Tpv`_7M-14sOIWHAb~-o$`^ zV-0seI|J)PV62BGcW#8XaCP7ztmgdB(j zS{B#VK+AU*SQMzjR*xFaae7YCQj15ml6c`|XA!`2-vj^kjtKWwT$O)0m*IBBli~nc z*1}tlcP0t(PRg*(|JRtm`?k}7yP4#SuEG^O=eBNdhTF$iOHr31t{}UztsH(m1MqMRbq~p`L6W~dGhb)JIlN` zsz)r3P6cX%f+)KMFGj2jzu)=ULp$O5OV18b@YK>NCb#Gghyt$St{@j^2_$h+Be;2F zV2HL*6FNo82Dn#WG`Ql)erKKw%1Iz>+Eij+5}RBx81Tgp~VB9@3&l^11rbIt%3P8Oy_d9rsW$N7U~gS3apO`uXI} zN#!e6L`%rKvj_9-4~MR;aN~&8kvo_4_&DX?1>~jdX*wEZH#&7{@J7^SxjF1zrY9pD z!?#1%qsD1gsa6ul94r!ld8U z9=Cv+w^$l5`S^pP5L46GZuiHf?3t~`f$%`Li)?K|T}dCv$56L(a=olZ*70RZb$eHeS|3_0+BJ;;A%um;`lgaKB4*3 zTW;{?Q}$LS2b(<k@^)R4`Ylau+SV6%xa=#_g(Lj#ispsn)q)?U zS*K!_jvf8gwr4qtrNb3T-N8TANENe~xE#nx;`*!JN(j}2Mz3?YtfzoaKZk^{g8e4UUK&yA%1+3k{NB%h!gpOpx9#Bp%h&T73>WU(`?MF< zi#zUDbaBl)eBv)|>J!kp>n%6+m6XW5JyT4;YD@hft`@{2ch8So%awcNbexMt4Z zyxr|b5|6dz`Ddy{{IX0GHC4IPt7oN!cAI)H!Ka;FEn6g(V*NOwPhj?8Y>fe8=}-^0 zZkFMXe_Y=pRdsU-MyT;Vky?9>|z#DOa|aGw*TjKU0; zX-sil_Rz3+0p{1`-TTvvmW%|!GhRBOhD#q;EnFM|Fqx{NyB}ynXj)X>KbmAc6)}E3 z!+P?(ZnRsZVon#}O8vk?mgmJGxsw9PFg_+Fr@`(f=C?|}#Cu++uv zOSm^(ZHQick_}&1e3G5Nm{I*hU*O3Vs+(bD{$v%6D8E}0TK?LT=mvkWoRuJP$`0t7 zo%Bc3K?lZ%tj_-?Z{1%hM7Hjp`B><+`5d7UYWFC~RJh!tP+KRXUxfQwWa!8R&rIcA#F$e_NZ0MmzM@cD_F>xPO&qf0C&Ea8X8!o;KxaQg1xGt=^G3 zXFXZ0({VaEqhW(37z$*?9V>@(gPqU)I(ZmuVhNP0r;W`HDcqu$a%_EI$Z0 zFSfvs^UL5$#P(!(m2R8$mT4k9#GVJ~wcwL-MnA1uPpyT0gKkZ<{88Zd)Z{Fy4IZOsl#~Coji_3jxhSaY=o21pKb1D7D;t78tQv^a zV4bBJ0Nrej-`NB8Ko-|P_UJmP@FD+&><#Wk#%uDkJ#z$O`2BMt-C_vc zNn+-3+->!N+YWcY81h+pI2(L~gO^2P7{xX4CT1)nEDE}vI?kB z)&JEXc<=N(i0lS**y*T45iVt0aZ~d@o$CMFvi^U68TlXQuB^0K;Jb*H;8p3LI`_@a z3hsAO4dRywVLg9Go>a$(<4H2tx01lJNc7&h2ZNu7|II(fLBw3k`P{A~a|pn5|9DV&Ekclxo2;?iJnyX8Rzj1gjFS5*zug{eBZG=*31pQbQvI zO68R0#Z13%H_y;C4)XLWJ1iln^pQK`iKoEoh7Rh+4#8P}{5;V0muXF?qNsdDuPtV- zrJ0&03DlP{^om_Q$;6V?ERM_nQHr|h`{2k?Rwkeeer;E~AB!<2a4?$J=j0Gn;N{@o zEr2z2qD~yFFthqM+2i!L69>sBWs;|jd^0}_Gn5SiyH!EAd za>!vv9t9h}XHQTaQ}hyVA*Zn+YEMWu-K)hWcQ4)R>dp<0QP8eBCQHC%cj&=tx?5V8 z+?U*4Wi(=I8}6QZ1dZeDOztwUJ&lI4Ked?s_ttFp0KhU#^st99apsKjh|-^I?Y0ZKAWW*hLpS zj6PiP%vd*MITo&?-E<&W%1uc>x;Gwth zrkCpK)robb+n;oBUSwrT#wa;ujEGM!{FH8sUD3HQ&2P=jSE!GFi7{+oO6$YIN>Zd@ z&hsyZB`1(=Ii41@Po6K6)9}LgM?1gbM+cX5cqX#%phJSjKwdCzelg{cu2g(zJz))h zgxs;1o#oXMM|)&y$hLA10lkQPO=)iYxcaZF5bvB$ilF&w!R(o?+%PGhar8J+4{?>` zI0IQ+-AJ6ttWpEFICgS z2EYL&N!nq=0}=LgR&iN5wb%Gh%NkVf{QZ9UJlP4Xx1h3jd$GMl$Ju~bm%5koOGk_Y zP5lW0-%gXzuA%&g1@sPp9o9-j)VF#u9U+YYxSG(BMrVuE-9rUps-(a|I+&f$4LgL# zgsphYnn-$`9CiG${hHAS2kIWT^>W~C)3|PcRn^V0S0^^$s^9c36cDUH%V0A@X3Any zravy=E zL`VjE5YU5{mc}Y*{`eLZccjt-P65;Nl=vHAS2FLw^KyzqLqi#%wIAv-&rNs*f*PyU zgl!*5U&miXDVG-E0?h|}5vg3^s7lhjs(3a?k?iu`&#PyTN^&!bd%T0xJOo5>u@qGs zJ8uup7vjX-A@ZE&YtQ`N;~19K>?viorT{?4#Y_+`z8y8Pr+*rV~rS?gW(_rplCfH>pxEKBLuT zG}Lx7?6>22tikR>e$6teay(faVBW>Idwii$CX{C=y)TjxctUkOusv$FetP=_`PTBT z>!jGT4EPv}FyJm}`lJnX6W&q(WMbWRwa71ZTi5C+i(2FxX#q~Wv{g5Ac^h+{Xvx4S zp)v|gpDtr_PX^W!`nqG_f1)H@tX{CSXO+;myoQ9676t_M)$*kZE*=!C3H;Sdx?`Es zw6$Wb8C8&|D*o;&#MQaMZ}NU}>S!SN_vM{8phYLt zG|A!-^IgYObC)qC)iLj~wyABW3G)ao*E008-8BA)d5^RvwspTS&?tEG>Z`8G$LtsH zRmcliPp}UQ6$5K;a@Ez1l6`E3Lr6o)pDK)kTBSvj7OC_VgL+$j=pA;_Pe++#qmqPN zA}=f54?>1NlXaHR@GtWQ*9>X)I;&;a^_xY-%i)^IRDMd`yH=1^quCKh} z0Cg6=hp*aQQ(0A<=-f(WOju0%f9SXGNzGOmW+aL6y#rbMj+W}rj!4*7G*vI$y%zQ_ zt8mu90U^&xhX?%%%F@nu`22hy_E+9|RffEe)|EFXkR?jz5!A*MmTE0uOzKHUxh(Ul z%83{YTa4lZ{Tsn`s4&mdfZF`sYwNb-EO@>B-5qg$(N?zEBjHkaZfSkihsqmsRQui{ zU8McI1jbFr?LnJDNeiSbZFhRnY1l1jQw!ZUsOf6(OCHQ>^pILGTbSyxVMfi(hb@5k z27GmWCL}+wn?mV+arcGk<*)$I_M@5OwBLs12Pqa@*15+=C;99v*favJ%E0UP@tYCv zJ$4az!_8cx#9(nvzLi9{X2p4XFWwUxAz{0owyQ1(rHw}i8d)X9g!Y}#TAF(28T~Mp zP~q;baUe;%t88|%U+Vv16iax-0x$!6O9!1WP{{IJ4ar;TMb@b?G zU96KDR>B-Y6n-<$6Dcjr&MncI$GQ zU=A^GH!D1pCi3m**l$73w!mo zG7VNnnC`L|`^(*eB#?`S%g{!YY^8@CXN|2pC-=TyP{MNRz~_85&1T-YG@>%nGpU!k z+CA(n(5}b4l~*cfej;%jRIHY6kbND=i!`H&$Q-&djWuWU9cR_TqpO|CWR=6R{2)BQ zzv+_{8WGDpB8QE@>rr$bnE$zbXNCEONU`9c8xI;dk?&28-Ul0A+={{SfIKI*C>$o+x%#oY=z z17Q?pwE4H_5}N$mdYiN5-bH<*CEcLScPn7wK44_fU&-^~b*+o%!~kU3aovwFASMRL z(k5Ja{MSd4$KDN)*-!}y?-X$FSg#N6whD!`P^}gvjJ>7bUSagL$f3)mU0P(!oxbwPz9%OrRkDgMCEBmJY$-+(zPxnOq=I^^h>IST*H3_(Mol6$_01ZO`$NWO1ywRS?5Md(8kl#E*YE9XsR!uD$51(Qm|`nwVp*b0gTb?m*r` zOI-7bGR$dJV(#Ud*l42z>8*3PP=Zqc>jRg7Ad7wQ=1OLJEj?b|SCMXrQ7es4hKJ+z zLwll5zz3W|x_2i7A`eD`*!#y|2QX9bM`1z zo#mPQ3d*-}U)x*i?u-dPxM;(wuQ`{~i@1RPLns@^>{sipXt)#S{qqUiPr+#S!O> z$;v8|-Rzmerf0nb!^`pMCzl1XHXjW+(N#2gK?(L*T2wdRlUM3897WTS%G<+hnAks0 zufk6>>~(0{g(y5DT$M)x8GjgQG2<4gh$cYz?G%HCVFugkM)(Zk7#yUpg)j-sHB*b? z;O=@D3Eo2hDAF3LH>dOk4bYz*F(9Kyhi68MHTaIq9=iCth~b?)vC|4677vJ{_Y+tN zn-L#kn~0Wv!n7UksI#*B%HVT3=AhZM{M$&zx2hoz3F9Ep4yytPK?R;SuKbVWI$TuoF?1CSC+mqBzm!i zQA{`eseC(gxlsKR%xiW_W2>~3`ufSyL5c|+GNyzTPU#=!kuau>cnxl=vs|<90veO2GWbIAlfz)o` zx2`Jf7S2hC%|VjPm23}&TeE%%hA@rA?qcteJ)JDg(RB?!K0&jtqoc|+?P zw&hd}PX`G#4~yx48e=?`aHp@sLG%c0q4 zw};A_dO5onrB3=u zXSUENl%Keq$ScNPUF0@G%gzJ)t^^~cx#*s_UcqOIUWXIlrlho&9$p8(W)J=3&;t#M z*gE+{Iq5GU1l^IX3CzDg6NF66A(UN>8VCReJ%+Q{g35K3S2`YYxdh^z8cMr2A@0)M3_6G(yEW0DOA_woWn?CS6Wtw zB^1~*8)sXapU1ZCC2~`!J_k={z6fRf1R&x59{>(tg6E|`ZSoPMS!h1eTDZ7x`AXm_XV6cBQS$gdQaXpN@TxLCFIK}KDs2%Nv-SssM z#(u!=a&PNDojzfFu;GIhd$D%dP!U*DE6lFc7f>LKgt{I|-ye%BJG{CJ$^sQikx3pY zY_zCcdj5$d&ux=5fFagO4;PkWD0fppx9Iu&tVYmNz`v!ZsHXsvz%%qtKBjis;2`0i zp}I5hQ8>u3m-ce(Wyw2X&wC?sE{r8vCSX zdDl(6HcAkEdmHt&10GL}+v%UBPk$t@Xj6ALmjq?5kpc%5Xm~kNOe4}%zX)gHKGi1` zW-3%)MG;7o9JHkb)rQYJG$Py#o=KRpnlv`O5xO2bRvSG=T0x96!R(``f`KC{)K|UK zPT6AXc!a&v8mHag{vn4}{}3-f5v9yksHZvpMvVNc4ja1^o$~vCs_ORrmjyN#VN50( zCGE$vdy4)=Z`rhW^mZ!;_{MJ}FHs5Yc4|@7x9(OhjdV7$!#hd?lq?9PhjwMC=lP-P z%Wl57Wy%M~CNs=lDIt&~mf z`*XItkoW#~%3U_QGpHopK5bSAdF!2qGJRX5^M7XX{rvxMv)=1he_4XTbdg!x%=AxQ zk4EBX(rs*!8j?F+S#5RMCVD4}>~KaTp+$Et(^zbI?OjR=G*Kd;U$ zbjK2A6Z7lQnNII{UZSfcEnhVD9M6-RF>1C`p3jPw>9br4?+XwuOV~h zg6Ay~Rd63iw`PKIaV-mfuC(~;$P?qQlsFcywMrEGOCzt)8)*9tbieZL@_U4maIB|E zy|JgedzCqlDWs>r$Q5#SHd-vrJ>lNeeG~7&9oao3#rD}LNq~?u^i|qCU*13K6)n?a ziq?Sq<#K?T2*Yl5k*v%U{2tWI&N+3uyW9PZOy>Yme!>G{PPlILb zpa+b@gxe|pCI2VNcAk4eaN7x0mA(8c^b(pRQW8$ZvoZHZ11ev>bvrpGB54sX)+{@w zzBiFvlPQdUD{Q)0*LQX#7;tvfG|?rNjFIf^OnJyyrsW^-?P76_noYEaO*Hkc)SVd` zK&^F@vo!BkUoAi9I^!8f5M#*T;EH1n7SO1jK?e#cdX`cUH7gj;k6P8qdT~8NgLppD zbHt?Qgr>PPqtoI=FS=I$yyL7|1V)KB+6^F{WeF@+^DM&3&2j8y z;@?olOdEy=C%*Q0mwwp-WB8D+p+{z)T*Iq1a;tP7Rc#qX@-8os4G|OxK};2o>#eKA z8p-BfYeTXJBx>|@TsJZZceM7F@_$@MdK7Z%+OYSVul^&+p_X3!iQeF32Z5dYx0l`s zS#bh4@C72Py00I8trE$;_<|Z<6*LYEr}u7qqEq9)I0SF+YMZ_4Uc+KPB7LX7$+@7K zP+hoiM5S-20-nx|<{D})P4W_aTalCNGB)^UF|Qz#s4SI~ykrJ4s#OTsAewPOBb)s_ z;s}Zg>bS)|==d}Wm0b1QC@v@pT~OdvkW{lVtc7z`s|k3DlVx1!07RN)h2}vIJLr1r zF6AT$UAQ?Wkc)KQF$#uRCKvC!H0?v-gBMYPScdTt3C#y zh*N{jO6fP^-clg@r4mlvGJFJA{B)bt+gMSmlxn@AgNpB+!sS4$g~LC|=jxMXxJUnv zDGbOQz~h}pQ|%EQLaDAbFXXw+HEdn_;98lbIa&VijMp_-U7b_VaPf}7{Vcd=W>w4Y zVe)C*2043o;#{?vR3sD}zmVCI9Zun)6ORAf?Kb#er#h!E)gSqyv5{)guG;N!qUqT+ z9CU{w7xIILK5O?+P!QtzTMxxdE@ZJApd%dqawDKkAzp*Q*d{OHJPRsXm1_X!Vh=ERmJX48|*MBm+|jGqgH~-JcQed@7Fn& z-P?f8-1yp_w3hLpK_w|p&kpAUNR8FT+rRCp=0){8Di{e8?`_DfUG`C6ugQgr{H184 z4DKvDio>*3o|%-qf46Hut`)A20lxBYNR|aoIVIHcyKdR&30(Xa9`^8U(>8JvJe^L8 zKRqw|9((ni#dm(WZA+oF1nlB)ljq!9v_ZDxC%g3>_}9?*8^IRK<-hYptF=Y1+)p?=y1;6~P`@g40SI!5+yq?z+|G)+z#7&r4e`5O;ipl=6ep4b? z_LQcO``q&LW>qtjR`pAh%1BO5szM#20A{GbywCBdTT^ z*Z6JWJa_a1Fs4csgR0*flBo_M!f!T*7e$lUe*8&zU{rRL&w zXWhgv_EaTzRS6%7h2#_W)#AroyleOxtB{+>NWEz`h_9lgzG}~>%$gw_EyZ8A%25JBlraR6jN&%9HD*b(Ff`^wNK#6 zYXeQYx28`%?j_-LH?_V{NltI9KandoKKYcMK3O;@fNaJv%u;xo{tax|7Ig{=-sKh| zp_s(9 zw33gnyHNl6_rCX?ipAmb@|)D-Mnm-S4s<&V`st3`Ut`u0<0ix9pltY^mr@)d?_K z9SJRt@1|xZI<3bdK6(-16mSZ`p9#2K*GS~aiz|_*ysUm}>m6??Wtw?Qk6CqtH8?pY zYt&3dRor~OH!J-9FEe@TDipu z3)+6x_&wBqY~bDM0x#L}b8&;jhj6#zltV9^3JA*aKzxy+WR+)Qp$^y-X?>uRKx(+e zb2o=x?ka+t|f(9%t@qEpI5&USMgMAPOB*`Bd3-7H}N+Diez(erW(R(k}!o0)JKM zx5ep455!NB3o2k#mmE?zd&7N((>Y|F7K<^6a{aydCvK9Zcwna!3kK}~4j?zbNb*H~ z#VeAk>Zan?a{|nNKTZkiG_hJ@6WPnI@R@(BQtgSQxY&bY0=zvy4!br94*!6lAWFc$u0g31^B}~z^mD+Kp+>SA z>OjrnW1DN3!@pae8Q-m)4923_YDhae*?Nq{eP4KJ&3la{JJYROXi{eh&ISHVgc_1c z^_Z^u*+e1jceH|5J@(^Uk#2bL)F1kvgk=B#C%lZD03(Q;&{bI8IUrbEScwc$M&0Cw(|rQL{M8{ts%iLH1JcPh;A<+oJ83iPhEO%bvT;Ex5ID;cWF@Ex3tlo-6Z^Cdyti(@qrBv%~t?jyZUnW9kxoo$QM&Q`f5q!LjhEe(86#IXZACH+lWu`dX7q8LFmPa&>yGTGkoVYG`ee<+(O+rR1nb0Y#*^FjptyUFM4!O{A+K0eGcN+{77*It-jX_4QE=%I5gJ2YMJq9>O7d`+ERU4 z9cOx`v!pS@Hyn`S>@HP@O|A`84K)PHr*ue6l$^%bFAO-_h4C%c7bOU6q_6y-A+^xV z2via-rRxYfs#fMsoBl7zS!iSj+Mg2K+yBB%zF#;bS&!q3{%UiyMc*`7X5x%y-&&`1fU-q;y99P%JCxXxKy4oLg19L?@T;ix(?YqVV>~&itx=t4(YYd14nTLd9}bFC}Tjmvjy#~j5yB@ zdnssDXGe*a>qa*b5PDj0__Vhpr@$tqt{RzkX7^BP>~^NB@d|ch-;f}YXYdHWueQA7eQocruwl(i0DbkBOVIQ4huAAcX2Y<${HRgcSQSM(t_%)V%rxd} z#oo61g_0t+3MPmM3RW-0z?}1*W&p9yl))Z2R(DlY4wPXt@ymC=kMtfczsk?cXQIkVFd4cFDef{KHjygZP=oIq!iw^w&q@~>;lCA_dL zHnJueipBhT_5L#YqS)-ljx^qj6UM#o zQ2k}b597U@$CPd|fb|ile51;#d+?l0l5$>S_>G!=!iUP;Sc|GZ^>4PCJC|30)6r=4 zH6IgacWjHb`0vmX`bi6DK~9l`fUXBA`cx|JvN~CPl6R>U^46}}yPuk>vrDzC>Ow$Q zVz9!tEJxSdW#+zH6&{6wdV68#`eWSBkbv+Js0HKkF>L|~sm<=!lYv~J)JG+aHc{`a zDU?i?k9p|V8pk53X5mc23d``?SN+1vo6lyo#lNPf*0R!izwZq^bpv4m{1JR@&E5N# z%duOz>TL1WWUz}g)*1jn$|Y-Mr&ZubY~UXy8F4zn)P#+z8`KlD1nD|E{Jv+K4$aFv zCMz$4Tq1PJcPfPYAPM7&*i~C- z7~)8NZe9B%|<*?Q*{w$yAt;Iq4s ze`slXK0Z>5G?`SQ?BUb{gJxTlvp%IL4E#XnyDy{xpVYzA9D*D{)ffh}enmlr6%$?Oz=0 zVOE#{veffFMdEYk%@&iC^|b@BsVo%g>X7LD!Jm~Wfq85q_H?ndSA{9TlG{kVlT^pQ z6J$#T89;7LV{|AQ3Vlu>W-Auca`A6R0S&-y%#!0NtUj)UN0rFwvx76>wf=x`$UN;j z#~tuVcWl$02lDMYJdwcjD%aC5LDsvOd5u=eYilg?dAekI#cIUkQQQud`CZ)ipUHA1 z5mhL^!zAC);aV@%>kc}cI+ed-tdJ&O?)oFsJ1J{3Dn1#Wgs*+2J6(Lu;a_ys+(U~GUl19a#yIa$hI58;dvD04^pw-$6n%}0x{ zYAbFTM=`}Z!2^``-4j*4)fHr7?qHXjv@e0z50N}+)Fnw;nork*Z{DR&+tu&Pc-2}O zqwGS(IoRy^^CUw|M*a50TyN{{xphYu#&wZRiCRK6ACVU%wlWTB&%#po&W1bD zOTC+IF+H$5`8cvw>wP>8?Qe;?!8Z_=^7(e8jA6}ya4=~H|IK4}yyRs#(Q*3}eB#20 zrOftnzfrScfMS6=G+~`r3{69KfM&)W1bJg=MCulO+MNRKTt&UAEXfGm>3p^5z$2TG z>;Qh~Swcr}YAqN{5-K>{Wx{$;kfwU@y|m4%cx))T4Mz!(ln+pq$I{>G&F9 ze79|9vFwkFWJ8k;lc`CqM5+`#^ z6K?vO9McjPSIr0je1z#J1CqavIB@q?yjO+Av)QSsh~8{@Zb;@88K>{;a*Ox%MCL(W3URq1)!Ux&>E0Qtj~beZdDabwMaIu0QebNU0>eKK2Tkq(YjVZ~=GHbX(cs-%$fx zHc1TBJ6f_{1;eAMEPrC@=&62#SJ{p!tq<;FD#Fqed~m46;Q^~9&yd>j-&lX0{Sy8D z?7;+1vKD*qwE6bRnV(wpFjKut$XR2-?cGRb%f~i8Sk5L|73Jr`5x(wmR0+&g^#9**gBmIWjA#=#{*-wu88^$lLi^`@Cn5OTW;Vgt#3QwYnH$AEu*DK>DatOh%ErgT{&15E zW-2z4>t4HIMEQZ|(z&yR(K zhiX6P+BFX0l>(#9!ACGAU(1VtT-Q-%+J&`mI0nk`w%^~0dLNS!NpM_-G)a}dRwW%2 zb-m-a3F!3m?Qj29Y0y-9Il^4j3Y{X9`RzE!IxB(IVT^hkiE~Io!DzW4-V*o2mO4Wc z15bkv<2ucy-ZNfqYua#-6a$x@v2#m-zt|~WP(m3`SLhYc`q$ktkggA!X{x;ZvvEqi zpb1AQVDDb!ab(y*9s;E(jggb_UpJ$)8_tR?@UZB!hgP8gNwhkT^I2>|N$ClXYa1=F zhBfEz>vsqHnalGDPge=r6u!d67f@)W_(HrQy3shC*F-62&)Z*Ue*KXbYAwHPx*>Wi z({qMeUzit;XdX*KZ~$kB#}OC1#iy|z1nO9LPhwUk{&)boMGcXjGnU}wtD6ZI&EWhX z-t>g)1@F+p40MOzdGADelNCH`Fpr)N@AX-aN~|XSzS_<0Whhv{{E}w{C)yu{#M=J4 zBC6;vO08d@|7S1sn_4|H#nG%=h~^P(kYY{oNyKfr=kLK0gU zECr+4wDmR#^7-fpi@Wh!p^tj;e)Np9W{fxP!#YE*gvsySuw_WGRz&p{d)~gKIw5Ie z@$UP!a3W!**9mz0>Lr%t80FUs-}w#>Ky~P9N8%^+1-f6Z?m3g5x|Jn?RBc}k`YN`H zX#!0BMb>-Rp)YBr7|~&M%J=B!@d~M9-SM`VgjOElC-zw*es_@HHtZtGeO^sF?j#b! zFIwSGb|bmf2c!UO;zRXI%q#9jw3Wq*TOLbuKbb1FvZ605W1{ls{`2_67085(j7&n4 zddJp@M4^UY>1t&pr&&aslM-;-Q~sSyN_vQkJjKO;&v0M`lkQVlVv!;9KM~DHS4XyZ1Z>nlEIkAUhd@=n8-grtD9Hg-ax3p z_?qP0N$OHDtP!?-!f?7gXz|wd?D9pji=n7#UA=Cy zV>60M8w9mNw^<)IHW`!b3P%6nRIS1SRF>&g`dllra57iXB17+>Z!{|&S=x0&kJmLP zXEncrs@4LY<7FkSSh#7Y^aT~Rvr-KjwB2&kmnoo@^nhO z_v_1U(%EC#<#fg(%1t2k$$eo zPMd%3<1&)9H*3BnV~B(sTQKQaev*7w5-Z_syNeyr#Kes>U1Xid+BC6c=+X~T>$KeG zzT6kjec+Idp7mq&yW+B8l~7m4n&FND-G9A-<6!8AGo|-!(g(Lp{I&BD)y7jYWDW;N z!TM*n+IrNH9#pN~>Rr?i+so2Vf{{dcvrUHXE+S-r}>Ew z*Td^cyo&htOpL7(aciw@%=Ei6ynTErxs@f`87}Q)C5GX@`hAuenQwHF*Ehjj;m5a-B7czfPgsn%d~pf&*N7)lB=7%wmUN^5Zxsb&MlmX=5dQ|3EbNF z*z8wQy@&xGH?FB)@k*tXG2n1o2)-`WblRBFx6%u*gU>pgjnDf1=phVNZ!V&~X<~TL zp$W}LQ_)>7kOEoTea7Dj(A)~}F64IEMlbDtet@C?Tq-Zt`1vtK!}u%2LMB(R^Yz`39_(k?w0cMd3=lk@ug)nsnZ=(pu< z-z=}B*#ea|V~TN6A>--#hby%IguTOQC4G{9-~OVtrfm`@cH>Es?7+D?c0KiqehoMq z;C@7%FGqLAsuPCeTQ=PqQ+Ry_EkzeBhx{A~ZQ6Homq)G_vaao=ygHUpw*uE|z5~SO zbDi|3UK-?cayUOC7aee)@I(?q1~?;moIus^+#G<;P+NJ(&eS~$!StxGHp8?25M&W9 z+O6o-)7y?%`9j9<;^KVT$ag|iw-SHb>V+^aT!=vSI}f3+02DV4(?~gSc$Hk~QrH>V zf4gi09Q^Aj{;giWb6lQNHIP9izk*(TrgA0wSCO~&>aI$E(M`a~_95#R^6Dy&f+gNo z$M*8ka`_CFpkOTVqJ$%zVGGb{_&HCRm(>T2+V($+2JTLe4|gtIPVXE^*Sb@^z>~C0 z#opE}8Hpt}5=Nm@KT2nDx+Qj6T&=j8oF*<207d=@N7~GbucgmN1KELAutmwT*!+m* zs$$E5?&Fts99SD|4biY@w}Q`PIDTCCHY~gqkwhas?(YVjYbtlrNoE9lW{tkxWw?Lc zfE9MxP|%9pi{OdFm5T6g-{iBsH_%IpJa;giV*N<3HatW*R!WylUuKy;${I4IWdrk+ zQh&Lc*<9Kp21QThMG(KjFCdBiFjM|E>m>54O2}4Nf$czCyHR7t-$hw+Juq0sE_$Z% zwvM!)H}f_~*F;~V%!jQc=I>r5*G0}m-{FukGlDW@i;A&vr8DbP+_ z0;HZkqn5YY`aQGjb^pLYma1JaKx5vtvZFM0RXned^>* zgYA@KgE5?`PIW4;%xiJgD2YmM$;YQvZMBo(jyR{qY`{xjEa`RtLOKS0ZVGy>n8%$J zq_+z_2wzYL20{beJe(4i z%;I$;C0={%*nX;M5*8H@y}4oe&sTf@9w`AEKYFf@POQXtKdWpkqp0?8qWee0UBBZb?RMuKwMJQt^R!6l#ddJC3oj)uNJ$K6hXqwfcO zv@fWrX{Z#v{^m&G{IL%V4%&o&#@@}|H6@$+yLqvYJ3Uet>A#wg)OvYt?HW)#^SGsv zy1Z#EiL?4dvtqxPc|JdU;W!kQLo#;Wanx%62kpJStcek5? zAB>S<8_)BrrF)fs@8-WSSqw1bsS{i>udls2x)if8iU`#t*+4iwJV4HPsKJ23>vbV) zvUd)T3Jhqf4bIIdIHujGLZfuBHQuK)q+}IwKm~}qMO`Suw)d2yO(GXK7Xb7b))&)S z7?6v1aNs(Up%dxZ|8(L?h*(yGp7-(YJaoC`G2qH=o=A&ZE(v2zdk9n<%zX^j`LF!t z|7~x@drS<{H-FNi-c*-gxvSc)qQCrWL3B4f=-x>7svt8$Z|c(f17V_x78Ei+r_QLD@&VER#} zN*O~(R25m{5U$%gAVNlFS<7mPBh_nYlrfy z5*TyV#T->EMZ0lo-|u~swJeNGd<~~vvrPs1>M7OmwK6zka8!C`cy0!X!EXPe^muI%-m&&?zKc|-lSyGm=Whw~Fu_?Y6D+T8Sv8z$OA zx!J99xW5lq@JCmT^VbC2kw`5tC%gQ}LJ#wSxBQ)$yyiFh|Gw9Gv)I{h6>4n|JHqPMeRF-fyn1 z(d)f>&O*CGp3d8~w2iZuG}GmEgtB}O)}RJDvQ82M;Ct4KE;ugcVz%WuFjvsp`6eT? zZ`g2y`v8r@Lu;hN$5%oT~KA5k@`SYmQIN{z+v`j9QT(Mz=Elp)DG>(Qx~?qyJm z1^g=2wT5`T6$RojFF87{*mgynMvDb9^e-2_z9};yM-(U!rQ{=P7veS!H9H!s@c=i` z1;vjKG!LLBRN*G~gUgdT;IkQW;t6G@B0AbOyWas-frEGS9*F=O9X)DX$7{anE5y$A z0l1KeVmm$k=dnxpy|C2}gSI4jH2KO`7k6P|vRj5{tBpG2FIkv?FprXbf8FU?CR`&vfYa=&p%R{)J&288RdQ`NaW4;qsj5UOjUbJvyn zXFlEUy(9ac=|JmeAAhHX1+VtH(xbXbT*ltl!bN|cayv+yhxia4(W)Ds4FAe@*p&xA zqS8RwBRlfMCsUnWvJ2*LMB+VlpZQ>iTLq70Ee@6!?`Ay1+5~JbGw1h)?@ih-hGh)TUCJaRqF`brDES`hGV`#7&RVhRXR=1wvT|f|ZghnRFLbYbgW%~uiOU)GDy5_0qlSHCh_0ZH6AGJ#v`w5|` z&L*_C7(!>?nv9*9e)WmSY}F$`pbX@OJi;07LN1*$pp5B09S~7@&ZMKM;A!XXsYO7R>z-MS@5Jy)u;|jppND@IIsLYBtD_A{xFo3sV-yh8 z^)8uzd#_BDySk2hf*B7+wG<%PR3XAPwXT5gf?VM%t#4;`r)kgGGZ(4bcNl|G zVO8xpO#wGS?HP5KvBzjj7rq&VcHML0?p(d09#1uvbf1YgMIohCSB+|hl29|jC|G5~ zMb0Lp6QPz~?o0(X#jsoV`ByHpmF~doA?C&4RRIS$no0NN?PMH3Q;uNk?L?3ak7Y8_ z8J{o1OEE9<^M&mGD?PpHnT1qG>~&kWiSVNZVh3@BZti55J4@a3%j;EgiEfIK*D99^ zoq`9Wy!b&dt`Iy#$y`BEkw0^7y*G8Yz^=;GTuZtX2ay--RO z>2+z^U`y09HdyCXs@^u5sc8rs_MflIStZSVJelOgaaLh%Z>DrZ|E^jG@iRe8)VrOO zv{JHH|CK{t1+KmtHqRH-Vb%Hnk=o1ceyg&43XqnE#vZfMlTnE(su5t(*JTjavT1+G zjdG+4RVug?v@ZGU%N&cFaT9@Az=~69%CK1{+adF87_<3q5{hpyBM41#Q@$uBW0e98#U0Z!DhP`?H zrvW-SYaHSDTV> zqqSV02EN1Lak$tq@SYFzHbJ@^+qr@x44LRsrBv}~vE7w3^GZ#%i7P+Tg_k-z-DxfG zd2^g={iT37ykiv*^`;Cm~Gy~rIfuF+5E;pD|D6t4WPJf>fSkh@m#`gs&_@9@)rnxvgUHj8~f8`j};ya%=_P$u}WqLOx=u}eGv2ho$X^F}qA3GD!U*=U5 z^lzHiI!d~92buiBQ6QQc0x1q}iw%Xpkrn8gB~V)m3TDuVY($N!^oSY@e=W-xQN{V?PoUyrcsQg6-0~ycX?utFU~`AWtjK>Y z&n}aN8i@he`1gn+TpiVQD_;8rep(*EZ3I$rg~qE>7{~M5RvmYAq#}IQn3-#hpqO;Q z|L)~fT|B}x<}TA{W5W$%gV(z+3Fg-E4{rYsfvA6(u34MB(@)Sr&w-`lVaV7><8+9Y zyHl;w?SB7((DD=Vu6m&4tlYt+V%U_?Lh$*xWf;R(7TZEpUY_SPWeo31ojN=5$E>5# zbr+!6YGSZb(VP4E+OK)e8WKV9%kY+`kcY@8F~Co=o0xvuvnQm&fAUTgAzPq%9v=j2 z_tQbalOF1_8@LApe0F&n1QolhWnzv)(vts`v5ojLo%~+L@?NzyOB(SfyMi^Ch_ zZX=WXdEfB6LP1+@sI|$n0ovE|OJH2hoQJ;}+Y#gObzg?;w57jRRumb`JIdU>x7ZT* ztnF$d_nQ0$9E{ph>7?gOvt7OJT4IZ>H#mLT@MN@i}leNO!YpZbzo-10>*a8Wo6!hJ0I zf%>|4&?RYxOQPWRcmVMkb*=L4LT=bU=b$LGq&8~Y!FL~sPsNL9s}kQm_+9Yli;9ov zJvsRa8ZbD&0J-qoCJw67NvAiwy zUa0|GvqcbJ2@@7(?}B}`^zzJY1`I{uxH}931P-qz8YUu z>OVyM98k1?7Ct(J?Yo4nU0x;|fDNvH`_%-u(H#d4-LpDfgAMVXUHGvtPzXhz=nQt+ z*&Ye1s>A<=U(3UB(;bJV^b`V{kKTU!K<;5VSnt)Py1cs4DLD-IUj2G>jRaxRKfktE z>J8a$E~{IsgejlJ|_=jBg! z&#I`B8j0yFV<8@1z^Au0i48%-#yzYyFkWhu-cL0d7~?kE7HoTzeStmFRp^LVIo*cE zT$(1%|K5O~eY{?_#pb}8nqfM6K}JX@25S7-^-W!B2Y&(G8lI7P9mq-2qbUH-{-~Q1 zA#zd?l`O}@?645hM{u|Ub>2^!OW~k8^LZ| z(03a2O@5Yd9d@fCZ!tv^wDp`VZ`(2QqjfJ+4##6W4uWG z^<|>3O!9SO2bvNuvU2aoKiN`Rh-@o-ZA{6;6mpK*tdmJjuhFXD$;f&fqM!;$xrnlT6n7Q> zEoKhM{P3_Ha`E9(SbUkumQULAYPZ%I1ScsDZ9AX%Kha!@f_u6yfKel`o~@ru+bJb_oFb?;@CDH#`WX zs`#`&{HpvZMYb^W$Wn3lGEWV4XvBQm$EhLLD!X$p0yib}iYsGy&Vk7bGayezA_O~cP#@u-P`*;4wTysWbsETU3nby+U zWL}FzQH16Pn4$Fn(D~n~r$*B-HaM6(JAAsT><&3T74!^H-+9T7%E`b^&HVynEo+e( z>+MzG$#t2^UH(|LAUJRpWJqwNn#sq3%OBrtqT&*evi`U8#0}ZeZ@FRPa3Te09rNN+ zQClD>4fDZ07|exj)f4H~l|JUiwOV-R!Ed-SGW319#P7nt`fYuj=_Tp@P&q9o6b-R; zQvoA)La*C#y$<$FB8`iq%D;BguD1Xzl@k z`er%5OgD-}bE2kw8_TeebyA%n+sS{f9Yvl#Q(Ar@NJRH9|I#a;DYNM-;w~PrW?&A# zg>SZ#o6#fg-09%_NB`h;l47pb6E)I@&aMHkF`zC-6xTa};T#u@+gelK*u!lC2-Ed* ze%+DQS><)rMagj07_rlDLkHeFiB>Xv@;pXSP0eo;W{r%(&p_tLWAv%c7l77b6)@mz z;}@O=rMBUg_>J(x&jaRZU)Gf{+3K54U3`0YiG+fS0JH6FK#>){iD2PCsJNJH= zmp~9~qVIxCPwKZ8IP=e`{e?!1-VRQG=rj{fdjU3Pub=K03^71_MU$(Gmry3@ zOpjo1mP+R{^=Km&&v>UdZ_3*OX`G^%dej{@s0Kw(Rn9h_ly|nwRgc8>^F0TQvBWb75<-vJ&~q zv?rn&T1WFFKN?6Bd2x|1P3=>jZQRq_po_zdj`oYk$`Q7_ZuO5#)BRw1`J}ncnD_+4 zprfrBJUc4ue}E(Y`~8gIcTpg%6x4Lluf5vQgRN@PZ>&}YKf72c(VlVIg9*c za^B^$HeV0A#whbxkEOrWd%OyH1z7A+Jxb;5?wOW_b?v>pU7~6*SP#xJKs|SSUW_dY zqTM*P`K8AM9ekKg2am!Fcy*X*%_?Ms?+9lu>$;0WLjGCyXZxdeI>1j0sh0Cyt{M_6 zJpQ!#W?6#_1P439zR+PkwNGCD{?&8xmT0e#;-9}uf)s@Cm~h83#a;bpm&(7ct}z?= zjvS4ZFc?00R_8Q!>N>}%4#oa-D~X&L6F2w(i@)11?{wa`i(B+E`oJ)Kr@9=|AT{jo zoG780g9pBIBG}!F4bmBMaVC5|;f6%I6`1oSd6rjGj2`*)sK=@mJP_4n{0pJ2U8VL* zoL8&sJ{JXSFa&g#iw@nPnhAd-NMHdLyC|~)p|^QsG!Ll6e)C>FYPH`GQ`e$S3lcYZ zYIjdttd6a|t+iOgY*S6{{`=}}DoJ(DX9lT0AimD<@7x#x|t6MSHj#e>iio9HbgZ z9uh{lIl6bwoPcAwxghh1(&=`j-}*H)^IXVBSF*6|dBU~nx_SqagIwM}idpKrgOz@$ z#Iekbfb$lEqGtnzZoy1M-6=PMtxdC`70-i96`tpw>^mtk$TTgYnU~s;fMN!m7^(Fd zT0N9a?;v~ugLpA5JY}Dx{SwMkjeo4UH7x3r099s*F0yNu0-sN$ZDyIlcwc5)(d~9j zPTGp;h&+1gdjtly2sO>GL(F?fXYBySjrN)4!63p=uVF(CL86TvYHV*JYVcK!^ZC8q z?n;l{cuyRN<=F2@%^R0)G3DZ{a?ky5*rf}I@x;R%{z9rBN8&ZzkDYII>0fXF(%ezc z!9knr&&X%Qi4$Y1)xb`f+|@KU`Ll0B{s4G1Wp!__Jh!GINJ!gKKhny`q*=T}7R6Vr znSgk4p;Qg4MYbh2S}&qyg#52e>k+e-Q(?6BSxjX)`Z}_t?`8?#SAfL?Mum&V`7T!I z%5q+4mif72Ij*qT^HbjhcTvCJd_#q6;6}h{L?>@XLS02LKiC|M13bt2kuaYS*;Pm^l5FDJST;~K1yKO%d!oRS z*TWBh&oa(5KIySK4wxU?-walg(TSko$qWU~zt_=c7H_7lZOA)l%N0WdSGO)!H~dcL zb88ibs`p+(_3Y9WL*A6SPI*`jVJrqG{GOV)#{krijVqKIjgEQ7WJa2Xr2H=PkUx_D z!_)xZB%>(P7OZWfQkv8rIXThMaF(S7DcE5z#+!1ZxdA~l%y z>dq1P>y}>!onqzdWNwkq=}MW;T00!Kt3w7y{X|zQgp;m@Wn9=Znrs+F+jMa?DioJ| zL=R57a(i5>ROdZuE98*RpE8tsPN;=k=2)NO+4E-WT18?uukjD}SoQ-$1ynRWwGj5` zZZw;`kW>AFuviZ}QV5-OE@W#0S8p;;jA%i7O1uIr1jVcg`bR)_kRW_)nefK_Zv77W zw18?-LGC>ke{Fjd<;A<-4Y@^KET4{gE<;`b?mI$u*6CLT{&080e_RE6Fvx{AntBB{ z1AU_pfPVJ*`}*RnS9x3ql-ax$emPo)e#0}#=Mbmk(v?N)SVEyw;Q%(ihEgfvyvgPG z;FFekN*~#eNpXd&@h9xqIT={NYLmxlGcSCVEWMnnq;K=27YCt5yh_Qb6IQQ7l-O16 zOazjV8_PcoKH}E8Qy_I&R}%bO4bHrbt*jf4hKK2Y5K(j0vDg)RuD=&_GNoit2im49 zRkFJS{p_?Y!;9G)-spcU^A=|g=A>L1^BXY=8d$Qf|NR@~{2SFD0982nCS(Jnl z7u!Tz(k|H{WA_EXFR?1_aW&ahjh!nofb|W}w69**g22hrTPl;}bW(izzSuuDnt|(A z{ann|4PI?s(YxhII!)xNAb|Z5>lv^o2}MEfCe6vrc7d&JvTW|n1GF4j{dJ#{AQ1+3KNo$ z3lG3&n2Xsg4^*$oTcks#<(#=L;`A6*=bCFtT=cf_Bz2xr3K7nB>?rRC+Y?l12jMSl zjobfBQfXV^Fu6Q4WHdNh-|*TFL#(0$e9xPOZZW&~Ex#69_qDDe+vkIYGuQKYOoj@- z%ArWGjdM1Rq+bV=FF1~Y&Ui_u>VB#XS=A!xoj@aA*q?dg8VR5f)UjQ4Em}OsXVRXf zY6umZqflHO&39Q?=H*}{lwrIzpI?mr?Q|&zhZy)!P(UvDbM#9ZfH%oog`2!7FF~;7 zBCnZ8w1fSny{fp7Tb7<`Fm=#981R!~Win&v&)~0rTtfpuk0B>>KU5ia(0@=#<8Lh@ z{5L&7m;m9B9hA6%f+V5ViNQDua``Nhhn3_klC6NCM@84(h3sv~bnT??H$fH|70((A zB?bQzV`c`C7+4LzXmONq+z8&)k z_|x8LNRfmrTcTMvP9spYrMI(5rdCK(4Ea-6k>@-(7K7*0{YbmxAgN6UI-nuaI; z->&EH?Q)27D71NgQ!7i|u&}7?$Tk$uMzj?|SO_UvXMc=z*=(nJvlgk{o=(y^MF>i( z1+sslm$I?lsMFMOV7)(ajqf$RX0*YKFJs|axEb&ilDH6fCMQuM&(?j-l0dO#bmf_< z3BDRh(2yn!8p+V;omd=k_Bj-mV#5?uoT^M5NDjVyseEo-(C{9U+~l5LOtz8|ln(4s zVmHameKF8xB_GEGg`~}!Nu9DJ-t-e*-yT>TD2I+mW4srE*_RJT%BG zuQ#q_nmJ*9DXeH#NW7j&YsJkj|C31_zB{u7+8-0mizxO`u%EI#Q##~n1>=09NtPrPH|u4o z9X`GD2`#G!={PyrxREs`4SX_a3XdMTHc*8^S(6AHGWo=Mb(N-1JBx?NdjEn0_-tGk z2kdL5K!|~YGM)uo06?K`z1U}0jPwp|s!KjS7h*C#q28DmJXO%>JOu~nP zrFKNx<)b!LCzl7|>0g)D=&ttH)=;YVId9{8-mT;YpyIk>PG)Fm-pOw4ch6Xj7VK`O zSR*Rvm!0I;Z4~|`D256EkRb7IfF#ZP9`mlO$K&D(j0g6et7Bw|gJt2VM@}=UH_O@g zn$$1JCZa5=Jjv8E2P)MM&CMx7MDxzmHZ#2ak*^>Qd9Wg3n_0}s6OFaW6RpfVC+Ui( z$CUMAQ83lYC7^lCkK(BAC0)&Fhsw#-U>r&(U8w6pFd*i!z{yXU9C|b?CMxMI@l+iS_0;i9aRC znG3luxZf*9{^;+&?zt;?LRkTz`Tk#P>v|~1gqG?D9IDmmw^aTp9+A>`-ls~L4oSz{ z^S7tp8f!Z8x#DsKy{`Q7O748;GU3A{Mw)zTUD5IV8&s3Zc=*Q#F9`FO+`I#)c8yGg zEW&ADgFqQbdk$rG)cI_*j>}vhw@@QC_H!B^rkc?=S>8mrvD_YI;*b}#|2w}MXX2&< z{Nkgbu6zD>%#ZI225Z6ziQQgqJLLW_zL;EjSLBz2llE`apcLQ%;@<_dyjD7f9gP(!B3rop)Fe8OeWZBY5vqUEERNd?YW+fcTU5<|_f6&|@*J4a zlOrq9{zY52!n2>=GWXaZ+?_#RnejM_Pi^4S-_2`3GeU(wihd#WoqK6R$)?t&stR+} zQ#d=UqsJ2!6zb!W3E>lP$jYh3EVUoY5vd(U&X3+MLS&E0RC4#w;>+XLW3A3!Go#BR zjUhzkbgRikMq`j*sAGq-i`nn`h4&%rCsvb;NEflh2LY#n^gR2_#*Qn50!XP^py2UX z0RZSQ$}yHS<$m4tn9XD)19eGxxXv+qAdh(9{kCQHNb)2s5t61aXx2)2a>LYk>)3F@ zJzlopvWBYh5%I`Rd7Hj5+`_;ba=K(5v(;z9?$QWm%~R>B4#!FdZzE6~Vk)-&V-N^7tM zTFhcL5@x7p7DkL9h12V{fC6A4lHR53(LYNNSCfzmlKxRH7(A{te z;B%K)lN#P-Q2cg7l_lH!t5X`lPiXKp=p~?9x2fg!p5_ka_}u)32LQB$J~ST-z2Gl#>vi>!u-A_L|j zbT_*ENA&rK#I#`XWiGFP&Tt?3dst?p)O@ynAHZ9hv}3YqU6moM-Y78hgZQt;kbxSQ zDh%%3e}H)E>f)JnN?X>q9K~Qj%o=&GkY7q_@_~lNmuBm12)|bF9##t;+_N$<+I2W* zT=63VKU9%_{4z72s~0|al2ak)na5fi9Vwvn16r+WYc^rBasah}s&Byj&jXU1l`rZ@ zEwFdO0!i%>M&-*6Cwe~K*!A&GlGhPtVHuLtUEj~9-YzD;P+wfAykJNh-Pifw6`KF= zAR6j7cwMLhF+7d-+TMS=L_>k@`ipOgFMZq1-f;9KHh$Y{I4JJ!^8h8EJ63|69Hu?k zk~KBjEn}%f4mpB6c+N+nkD|=EwiN>7#D?>19ijnsZbS~^FHY5y(v>XK^Y%Wp-V1n; z1~8>)*S8Q|!XINmiB!{9OfPaHJ9qv5h0*5h|1;LOxya?PPAlvQuy#*Q=_BT(tKd{- zE$b~JelYTAGe?L8)9(cgx&n+ePL%wtQlakfM240q|OO*_@N@i zi}%d`v?*@MVJo3E=UZcYw2HW?EgSY{r!&iAZ-?vM&kPYl4L!dwKFgpep_EopLD9;1 zB|Ql3^_|Wh3eV1v?P-MM=!NH{=?*p50}Q*1S~2m%&`jIzOP=*u1k<- z;6rPUT=<~Oeomxrv?^pZ^dkFtwO*Fi$wJewnVoSt3iA}uvgRG9hhbN-UAR^{W>GYW5OPoq=Q50<|?+DO~WFS%Q`+P;cC zJoyymbT?XtL;={g{qJBsuTg}pB6o?$kpeUTB{dC1(qc8{8C3N9rL$txW>`-D_8%^? zrI5cRinpvzQe1-emaakWU0B+V_EDp)4Rk-$ZLmHu^K;QOPsPRQck6CCd|**c3?4pk zyMrRg-sY7e`WpLNJf|X*0iV%nI{U7f4az}}$dLOC!SNLJM*!eV=yBO>@0INJ^}-`f z2nFD5*6fiUu%UjhjG}Ga96j~+RDcr_+DtA;Dacr?)`o|sgjwRG{o_(e^Rma|X~6DE zTYnw4HrXMopG4!kl;sT6%-58)lf4`U?+na?F88M~aGEWHjIm1HMCUb6a`Mg6Vo>@GrbIw%4iK5cHI8x6vU_ONOToeD@wwd4GLOWjxztOG;UN)rYdrBxXt4k zf`u)R2P<4l(mpI=t>-SC(n@>A#l*k&+%KQ=tc|4Ol-vBMS$WUMM?`N8~^^Uub#Q-5(XXlX}gUO zITaKdBljAg0=DZIcD)N1$*VD+crV6vCqcW8r=6pgKVmxGlqSd%1j@P~pX9k3b}bKD zfC##-Rj3HI7|Xt@|MlFyk-~V=xr86QxtO}RxuS!f*K=SXR3o^^3#J@+bU)n=t#ZCn(HeD!O;%IeG3UG{2oF!y#l*%q??*YYx= zYhu+G-pPzdbMk8HaT75uZl<%`Ga5JMub)_NutgqST(8D4tw7uyU9FlBVnCI^Yjlts z>d%HGatn>0(Nk;Y@=YMfmLI}1S!g@eG6>3khlD%B)JG<1EW@##4r)#2fi-~(B(M$7 z04<&O@paJ4AHk8sTJdBHCLC0Ji!JOty03eKwIhtU@p@meEiD~tDtm?PeA*6_93=|av85|HnQHqpRMn&G>6_nuS->P`GCTv- zxt5Nxm+{MZGdNe&UijwQ`=X1ZxQ4IcxF(0`S?+10z%3nO(Ye%RV^~M49Ra%?Ozm}$ z-Bm_9F+YbbZ2MX`sk17hskf7GE9yWf&Z%1Zd^texne>q9hBJwTy|L15Ydl=flfiSm zrCauN%=$QlkXr9mdF)#fu{e)9y;6_Y=`&iR3{J%dSb6aN-2x@2(D zin=Xb3Bdydf&>rl9^Bm_xVyV+AxUr#?hv$aFIXtgfZoE#075~~ZI>&Wb7%0y5??I%$ z7Vi1J&|K(C%MwT#3ZjMCKm5G#q?5F+7{j$*F6^pjkVOZ!M~WhN(s+(_^@pgh=(O6o zh0EMl5gnEa;LzaSvD@?G>!(k zUhvy~>+A>qCr2Q0vgqXxDePK@x*bolTIA*V-2<4TMt`J3iS6n;zfm&7>t2_&*4P!v zOTGaCKf*5f3rx7fU`nmsMLRs8x%MmM-A2H*#wuU?k0svx$iRP{z;9#YZ4$h~Ml)?u zmOUPu`V#Ib>m-22`{Y5(n?cD+!d4R3T8zXp;k0_f|;n!AFrZza) zjrhg|luDKpH}Nc5F;m>j)Yo}f z3)H_k2uvHe&)%TY^5n*#je8sDx=#I%YuM=xwj+&uyY4D92|T-aHkett6RaRV=ZI<6 z(zQ}vv|{&aSXW}NPF^#rED9(6RZBOYqPx@ho}$s(d2aPJfFPUu!R!%>r z##Rbvl}nZsZ6ZZazSq%aA;?Xq@VrTmIXb%|iAK$p_wXk9L8;M9aIKb^?3#x{Y>D=)yjw!W!)xp2Cz7^&84xisdP@G zzKq|Tj+0_%Z<%b$qj;dLU^YaRy^{x8P#`Zk`(1wn-@bL}`(pHkJY`#cBhrAw^I_q3 zWbO%n^y}7gQG|_%wPr@sBFKJiu(REA%!A$zB_#X_-QgNTia>3P?(@QCsD z(p3yQvfNi8*lX_9#Z?D7F^Ub*>UtFfhzM&pIRmDy5iX}Om!hq>tScMA;*Ce(m4=0u zHL7DtQ@s^`0baD>SYui(>wE^)UWR#)&yLVpU&r@BcH#2R`09!2tsP zeKZihtW|dN;cgZ(a~&kUZNkGSiDA+mIe`X3VO)k+{)RiB&DujpSG&XoVdK2tWIS{;M%xbL{v70vRwjSPty5cs_^1iT9d+V~j9 zO4GT;x}XNmUNrukzDEsQN;?jrYW_~v3j+K1h|q~2pQ*};UEp}X?fjfO({$tpxk!1W z+{r;wAq_{YST6fJY({YXOpQIi>?*ti!mURpVUD$N57$J*!*LPn=O33GFef=;AG4ShTMYA9X{|R^${afov+Z@$9vBVV?5`wJ%6X{dvi= z`FBa4$Pt8ZjkE|K8Ls&)l<~hjtZ{5hf8y)eEoA(XaNXl__PkjYq*S%VJRF<%I6Kg< zwwiM_l(&LH)^pEhtJaAj_lq9~gA#PQX0x%WvW0oOr;q%1g zh0n|v)rB8N@=aP9O;}#ERnjt{eNP@Gw%~1&$n+D!?=$3s6l+7CQqCk{tzsC%-+$_1 zp$h$;uz8)6vmnJQ^e!lZgopy`lTOZ!gqPEk9%T0xQL4xH+j;5lyhdsiDC(5qM)B&= zwYSV_BX4;TW@y$zw!N~)R^A4P*Tdg*N!~0z%6n+z&nSUsNFt@=H1D^}8;-a?j*xsg zX?NA&v*pAqd|*&#GN>T@MHa3BErWU6cV-MDVrD-&-`?XizLWlJfWBFI(S&dEBLr!r zo>Sv{zVydfUxr`tEy~EViX&1SzmSIJ(^dD=@)-&gcBU2_%v5@%pzIPzK}wm2_V8nM)G6cqD`~1c)X5W!LyUsfj0C&8H%ea^L#|OBZ|e>{A@Jes%bDT09x}N^!ZD z8640K%=`p)TFql+Y4=0~hPBRhPg z;vM1Wn`S$)nci!sW${cxurliU$vDu7kqbUISy;NFFa)Hcfoik|9^qcrNL6!Ey-M5l zqG$X!Ux6@ETGyrK94Q0zoLKA!3KrNUsH2YiR^=^-G*?<1am0h66l|bUxb--gIj-R@?Evl2a|#PySl>yAwo$G4nD1!EiGy_6QgMV#+@`oI#SCl zbSTrr$^!11@M5OP(<#h*i*HHr*qtc6d6OPfN-_7CR2p{PMub0jXZQwN-Yty72CoBV zSXBIU{Rsdtp5V)1Luo}r-ceB=TJP`|+q*!{giyo8O-~j#QL{`#R$pDkK&gqQXac9S zd^_m-ezx2To5j@J=gvM@2>A^q89IycS?w>crTR*aBtq$5vlX_cxBjdJQQ+8uyIt<@ zXGpaQUlY`l;Ep0r00H2Aa0XM;x!3aq&RE5h+go_TPZ6|OFt5A2F00>Q|GC_!38O;q zI9bF=VM%+vx3EBHH30B>5qJyZ%5J=@IlTw02b`fr=IS8kqm7Q2F0!01mT|>eP02Z2 zaiQT;k*h&&gfWiC1`hm~BaqhF`I@Y+?>VIg+UuyD^5GC~M-}5-=5mZsgT)M$&A;k| z70<($ixbAN`&F@>wBu{)GomvKS#j82V(rgNCG|GH=Ty27A#w}DB(5m$!n(ft6iPW7 z`_5F+=LTfvmFzt$fbLjHZ}$3osclIW+l;ZQ2&`luK=O{Cxl-H>3ZHFt6kVZAZmadt zFSl0Ja&Nx2--RH)Bh=V|ulns9OHQ|*&W{j(N<~F{S<3P%0Y+P=!WXfXjJ0}JksE~K zz)(zsHivj~1xAzZN|KkHmDXFM&jV6Fve3jKeP(9o1X!{5xg&U>q?m!u!lQxl7_ncb z9~T>mPsp9p;xYY(3P$CAm}a6|k6iGD(v;I~Y`wIr)8<|j@PQr#*>W?_t*;RLW|Rq?sgMPl4~Uvxysfsonh_xqwK2Lqk{h?whlC9g|BYaZn>6mW}SBCpu1x4x>OX%a*%Y+R&O+^)e}k#LCbMq zcI42>oR4-Z*qK{2^cC8tpZ#_KHe0C7(P^6DL#kZCz8z!F38`Ymjl_$2__aW!mxvZE zYmT?aK+`Tz>@ku~JOjOLT3=ul_KsXWRSwvLZLx%*9DO}cR~X^9N8_MQbO0=xx^U)S z=LtMC(FHwEs5NM|k2Xw=YnV3s@1U7huiKiY{e+^(RYYp)RL!7(6PD%Qk)1Q(w=J)T z_aHQT&ahv6Tl%nhu<`8VLA154-6Wl*bC9!CYCYT9esB5^5@KV%aCgfUamZ#7M=X_= zl~7In{3g(mbE3JpW$`9+r|0fOaa12v|Lzz2=tw}p8GqFjD zI2;(SP%f(GBMhwg8)C81d?nW;wIInngxJ0QEyb#Z|IfnZ6E6%)Hanj`Da3u8--xU-4KyiGf!8zgz5CbTzg zP)bv);@*A4b)>gUrvDGeTh#bClc31r6&3;xq z$r&XH+L-dvwT6z(uDeBKjd5rga?va+$4_=)o(~n5DoaR-@VT@a1D^tIznQFCS`!yd&L%yi_4g=W7bAKwP7CvrgexCw zU3nzLd>`=>qy$|}UcO`$4K(d;>-{HRP96hji( zsQxvkO=?#>((rft6zS)4#P59}e~z)bAo(n!9y-P3P%{<+ZG=acQ*{g7D%$m7Tuus;svr-kgx@g^kQ#MSqxSbd2}0 zo2E_o-FTUHw=h@fnnU&#U0lsTur|$&R5W;%Dfy@q*8xvQMRWD?1NTIEJ?4-_Pt0OV z=D2-JXofaBzriF-_kyYS57)#;%+Ml3?I`s)Pa?a|)S3Hllk0&}D=8LM zKR278Y|tFL^$w`d=XERdLM?(K1-T(qIRpwRm9N2cIEq>tv-4{OKS|ti8fdKt4w*l( z{t=m)GLQ_SrTmoeTi%C`Bf0bjGaVEE&c~~R*Yjdcct2}&41DLqos2JfQ}WR7?Q+fw ztOlnVxm9*_I$br>S-^0b+FQk=O`dX2D3Qwwsk56O?iTl*%ber03iB1XT!d6PBX||O zI4Aize~V=IK(IJ$HFUzaAwTBTxtJ?jYMKI}Fj;S!Z0}$MP4(xJP=+yk`M)8GKK*rm zf>u^F5|*bi62a|0V#Oog{MT<=E^a*N_IxVtThHOG6Yt_KCy755c)3BsO3~9@{3%h= zRvY`6u`DZT85IQ?noV)aEhSJm3pxw{e_Ij@v+4!3-vjI&9O3tdA9#tREY8#K*fOg} zO8UN)_Q4g6&l`=L&O47uozvu>Yr{vzu;Zm<6qReR(@&aKW=;Cq*3S&AE%p-EQkWT^ z<#Lm#rejyE&Ru*bJY=hF+V<%F40lfmw$1OJgP@D(*T;;Pf-hz=m)<%|hnEnS+REsgQW6vy)%v6T_mG&sJc zGkcLVg~#)^WvO3=h9#UxCvg@Ds-rdKircyYn<85DV_&Y zaSH^dd+C@q{((th&bv#}dqcoq;n%>o5A%*;GxuH3qq%SZKPc&a5c47F8_TO5Oi6g1 z@9MMYeaV1mcIJ9hj2?W`Ww5r}V--42p)cz$zYpy|k&^IZ^b}@~+HA)i1nkWIwqL64Nw&4we!W zX33tiY^EU8;u%o3s$k56D6|@`NGK-UfS$*^4f-4ul5(i{*)f`5RVY;!%6MfuBC)<7 z-HD2UF|x(Ruf|sMzLX#b>Ch?n9b2D8elW@C^)Nc)cHK{DVF>#pFdEt03~n?XJt#vW zVDBv9%vM9c^WyW6>=&!bQmt8z8{Rdb>0^+d&@=1jl4dvGB{=LTjJRD)Ynxl};b_>* z9}aUF5osxjBnM6k6uS`48U#*a9^bCVRb5Lg(cQQGEHkTQB&JgseDbTRzOpKMbQWrB z72Jg)9~B$><0psQ7-%4h-U&ptE3q^d#{?=T?dmQ3p8k@za3mR^fa35o0V0#n`fc%R z=B0DQoUvhx>|Hu-N)sH}xXwM7$Tn#?ky(=($IWkkM>?uS-APs1 z0ioXx6Gy+S92sTzjf}stONMLp z2ZRgQ9;-v_9#kXXS@e20INZ59cxO+gimRw2!8(tbPh9=M>Z(-?plVGP?V(VQ9a*Jsz)be(Nziyj(8m zz2nS!)MN#z7pi{C=pSJ-&?GiIx(s;7V3ll0i^HL!wRd04-jz}tIYLAxKpB*9lAG@T ztMFwutm4I@+M1w*P`<4s+qWfJQ9xNHga7EcYMeu*zD!Spt;dkas=@MhIRg?oKL)y7 zR#eScYxg7sI3F`ss*(7FtCv`r>Bd&`0gSuGQmo>4&YXT8d(th$cx2_08wjq=BBQ$)dLJDFQiZ$IKrR}C7bsiav8!}ZXT-(5|VT+ENX~Qb*JHFE56FJChF-@ z%RFeXSsXo+jVEN5vqedbJbHe;w188>TQSUreL>j~X_8vVDuLz+&gC6MkuTDlvjZsj zFGkY*4W}h4Kwo|^y1{@CXUcpn6<>1hOB$|XB62yQTYJ~do`}^-N90)axTO5j{Ym$= zfk8Q&fKMRB2D@jlDn3i(hWL~9N)$@oJjm{O&^Gd|JcN!9|06xV0}e}!P}!Sf3AXxbT+;Kg zt9WIA_2OF_Yl(!*P;GgU|Ikl}h+;T0YZWrGUdiduR8bmo_eRz3?XYnPs!0(8eJ-sC zb}T109`TEgW$unloX410tn7j!c3_^(X}Z~Eh-3SC`TcqE!?cZ~xiR#UhNwTIlAG3X$_0`ca#`{*gyo+Pr3tIfjZ6z}XW zE?)Y4{}tMI>ZhV`6d{liQ_n@^%ebDYWw$Da#uJs3p=Z{;&6doNeb>HpEA4x@UxV;Q zuQ)d|_5eo@L+^tFQUeno!ZjRq^{oH8AKWwa|2i%)X&atZ+Wyu;rn1iiYxKd+&N@z% zk(I@^;F|b1NO>!nH8c|gG~ur*(91qfR0}Z;$z(T&A9Yg2^>s}8xeTgJ@a~uPr|^lx zA>!|uiNU@<@Ae*jsrY3bdmD{E%3!7J>;qgljp6V6-7Z+%;CF?>Mt2c-sA7+X=i(dl zCD{wEzaU}flOLqu~eET}+ZTM1v9ZXJz3BiU)p7%5v2 zCAMVl?AEprMmw42pcZ)bSg;%$%8&LH<|z0RGHAOfrAd*uw{}CBE2pfcO@M(u$RHNX zlh@S12d#TviCjY?s=Ykl_~qp*6fkJK+{k@0v&M90hP>Zvf5yyD5}U3FMS{*A5<+~r zVIh0z)zX0*)hB=ltVGft8V_Dp;>btf%fwo_AHb2DZ9(%r_qU4Zew*WnYpdx<7>!Gg z#YK^GTg&TwEE??->I5EYq|!wdqcrUYi2P zLtd(KpI~NusQ)ZCOlrNx3y9w)_%0;r-+(@71N!(iSB|$Kg){jB5`<^jF#`XV_nYER zYA_|-FHhS;t`V+y#*?qAh9fMFB)w(8eAE{<8O{Uj{{)|+(t^Jqb zDDO-6TV-N8;_ihamftc?{-JMVtqyMwhhJNgLwyeisM=Fp{*H-GJI7?t-*Dy@aXFuymG9<+Hz0+}qH1Pm; z=|V@6IT@q+Lz<5Sad~9(>*ieBw)-y5U-yjtuN##dcJsPM{~YAx$yd#u9j87x(Bycp zJ{JUY9y;kX^dAS+X}W#9k-<#2kG9aPKDGaye}H%XyMt@%7D8XnjfN2L<1C`iQdUm< zgwQ;Wxo*wJTgHWv$rq=D#XmkN%h9RhBfxuKRJHeIeB<5&@OR@0^dE-NZPx{ViMrLg z)GK&{nhI2O^%3x=Oeg#3<5DgskPitO>)w@e8Q62T%&RH6woH@hY2iE&;vpwaBniU4 zWq4e-5bugIM%%q3_E}Z6b7^uq7})@UdmZ!!z{r8?>(ubMiG(NWRosrPtWgz?u0Ags=V1 zXuB@WwFNy4+l%-1>6d&(uLGj`2mK}8`}j3>Vz7wOehqUSv``&$=;<|BE(_$hUbvU6YvOVF2{pG{R`9JE zB)xE?C*HPW#@2+i7DGMU0wa#4o|R-4Gju@Z8US?C%cB43JEC-*ye_m5=~r{WO`=v4rKKywrZsd7rlA}(34PtJShB| zUK)0FS_ZXB^=oFsbkP)dn`gm*w-?Zoq7PrE#YNSMef=lYMsp+6?!GwBO{QotL9siB*#3zqtNkPlJEOVRU>QKM!#^ zm2RxkYPaQjJ9`*d4nL4lM2CQTqql~Cr@tFF!S*Do{k4}=oRuG~+#NOYo!j`cJ1-L_ zha?{yN*llw;kK{3rABSw=ZriK$G_)Nn?3PwJTXR>HWzdZ+#1i%bR47uL~qfkf%IKt}&pWTo<3&W5{ ze;O}hlvs*TzLO&aZ5*lv&=WtYYWF-hh<)J|1zyH_9TiYS|41{yW82zo3U>ZXnhX_2 zw2B}cXDyk#Xsrb9u^ZS@L9_ES1}n5GTs%5lK{K?{?IshE<~!o|3yv$r>G zn(i|nNA&q&A@csm@24Jv^pQwoE^o6VA~BZS=2*7-lrZUhf`l!vsm0HUSe3}mj85Cg1re?M z!{zus4{Vy3t-$JJ~p{06w>0Jvp5c1arY;p<-;My2O%r@C~!F2 z-V(2)+o}B?zRS|xpH8DYTIOr&D59btteK1*R3E6SK5kJ{2$HD{I#FQ|;iLXNmb}`? z!KfLJm+nHWK9**vTjXm%SnVP)l{WPbXNtTFN+d@FC5O@BlSLA837V z^i4#yRtL&TFaGWH2GMqoXTr351cO#6;Re)0J;#hr%P8mIoFb%5ypi*DOVl^h?!M*YWbyBLvGg;g?1${Vy$6 zFz2WL>-&D_;OlN60^q(}_{s|aV9-CP?z~AreJTiqO2aGxugWi_7_)tk% zn+ghea+RIgyQ1h+F-hghPI8syqz5w1g-Y>a2hlgXB*uhX$OA`O*fUSXlTT)4d>!*B zC9{LzM8PB7op(M$aykc&K~wSzezKmQ(`^0+STogJQqTSuD1Fh7mVQEIKS|pb^Y`T* zahm$77{?z%B}zxvm(sD=Q}4Xr;bxc=(&DagZ0XL=m#B3{qa91=e3elvz$U#R&|ZO< z5PZ&5nU>v2+x|v%*PzNYTG;`fkmjvcDz<}i0iT*7cazN?cad!M7R zs+2)JYjvTrpRq=~r;Lpau2cQo1j$kr-9a1UQIyRru(R+^EGV4~yC^8-i&pvtlhN

    lxrfe$n$jf5DDNQwG70N3Lbd4`a!5 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

    qU02TwZiVeQq#3cZu{4~l2t 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 HPhS2X(Q)l0 literal 0 HcmV?d00001 diff --git a/docs/assets/fna_light.png b/docs/assets/fna_light.png new file mode 100644 index 0000000000000000000000000000000000000000..144601adb19d7ecbfa2df1f5c448917a291d5bc1 GIT binary patch literal 128466 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 U`xE8{cXm3L^)D4)u)Y6(0bMd=l>h($ literal 0 HcmV?d00001 diff --git a/docs/assets/neighborhood_attn_2d_vis_dark.png b/docs/assets/neighborhood_attn_2d_vis_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6793948bb35dfea700bc44889639e526463c73 GIT binary patch literal 2225546 zcmeEtWl&sAw=N+e1PBlyxFrM+9$bbH+#&c38bX5m;1VEsa1HM6?i$?P8Qcb#Aj7~Q zb9uje>(s3}-?=~T@2__4-BsPYrMg!4)6aTVhpMT_;$l-^qoJYU%F9W8Mnl6AMnl6E zfARb=$5ydL?J;>{D)(6#4b6iQ4eiHIG&JO6){g@;G%yz$+L19Dns7228mWC+i@NAz z!SgSQvQlWMf1a%N!nnsAEPFXUr^oc`zh3;rzO~2dX!24Lnr_R-_cygR@-C3z^3~fk zPlzWUSS$O9v#B|nHQKW$*e~Mf1b@df`^TGyGrprA;WrbedMmQCi7E1Fv$Kl;FVNRv zP;zlIn*8lhqCa-9{8YSB$eSlIZ@4GKa#~wTt&UTI1=c(#mJVro7KZg9`tGNtG$kC8 z5Y@g?rwM?F)4u45K150A``e$dKE3#FpXk)lb9Kxg|E}oOr-}f|^#5MvpMM2tY@O-; zZG)?BO;e%&wmHY`O&O+tGlW;41|x$1)6v_X|Czdf%=16S@UPYLA7l8BG5ptN`5$BW z-^TDAp^mwc%a~6uw2z7ixof2b>;7AO!n)3npUxZ<@}1qhmdnl|`fsrJ&l20|?~PFT zw-^>pi7y~b@L#k4f1{bL=<0#gzwNX6%s%%&9sOtO{$*>;XUBjew7Z4SZHKs9d|HJd z=;70w*h1Te%_GcGosG7gHtbeR-`i1Z|_y`bZC`- zzeB;zIw3=I;9U-HNpZ1h7=%^eUGptU;MA$*sz-n(%6Y5bjtzJEkP8y+^R8TEXaIkG z-lXb+ZvmyZt?BOeRlMUj`mGHezHb-IUJ{Rbz%Y$!1ZE+)ND zHcv5J@zUnC-=JB8KY5}yvyrb4Tl6nFMC9hzKHmvhr?#4PCU#!6p5Od6fd=4%J5pnf zD5t+IRV+-bEsNQ)8#&sTMh%=$s>I2ftV;hqaOYb8O>@?P-(U3*t(amR{Jvc+!{-Z5 zPvQt|Fs?{XbFThMN||kt1Eh`S$|+66l_t(0a|i-hf8e5VoY|Bq#E;?hflJ>QJ=mcp z*8ELxtcDB%OX^MJ^S9Q8OC!?a`-R2Y-qX=VX&E)tn{7ga+e1RATwI6kYGCd0xU_V1 zpWolcT4Kzrwlm!hcRJg0)5vdUXG*+}+hq9oX=1vqTE59%SWoGc^E>G04;}W}K=UNx zGjy3x15vY<19n1*0H2LYpNTaDYN+$-!#NDqiSpU-6rJ&jmtK3DA$du+P=AbPQn_$T zr!A5lpNJI8FbOnKHf;oP+$I$74D&YiY4K8P&f1r)JuO#aCu=y)h`aSLjtVuh$4$@T z%zD6YG8>Xq#yTHB@$E=oKgZ`+vec_Ju9Mg_x*hS=elYUgCvCYa7MKHBHUI&)qN%e8 zS+XRiO!^wzA+bt6a|3E1BMsBv4;W^`x5xtd%$YW^)V^A8+LeSpLTjA%InYA&Ce6hg zi?zTSZ&m~L^7-p^-uT6XLL&ShKlYp8SfB)LwB5?PKJj%&?Vi@obpl>43#3Qd&9dih5|Jq7@Fdn5X4>A?vEN+yo~n*a z-1qt(^^|n7tDUX9%D-u!?*t!}c|UxB*OV(RWDHfWmp+ta!Zq3;yENue>?b4b zNCo%OaEbfn(Ql@>;)yjbD%-R0-Ik_2hxyFut&5(1=QXo?&;qdw{N{EJ(h8ma+GwOt z#(Ub@*J#w@kgFPjfyBc}E%-g2q(7N$K(&V+EoiXb=$sniy6Lz(q>AEpM~!rD(HL9U zK?bltP*&2Lr`Lo_2I1SN@`?{Qe0DkVN6-DovbjAGqy1?vWRQ2N%eeaa7Wd*UA=2>(5#ugbXr>28@^xt zRwU_QZEETMqgo4uNDgn^cI(;e!ZPIAt#{Jk)DzLVtwU0symva%$+vGS+_okQSftR( zRcAe|*O+fz znBWP_H_d%q&+zC3=dqM;=S~lL7a{3MV{2Atvu6ZlHen&hmKh7D+T$+Bnxg*N4nf*^ zlG{4f4%$ZUo*eIArS9Y9SLC1tnb5ih^O2RmqTYT5Hfv|e?JFMl+mPF*v9*IxPOtiU zQxc!F+8Zyn385Cx0So8JtxaV$G}7a?-kS7{^~K7EX=@?kh4;v7i z)BT^p`SnqJ_NP28fnc6e(19zgGostdTh0eCHS8k50lEukqcYka8DpjxO;J&8rLvh?|uQ&*XMz~5!QJKFE zG;}v5#XnVm>cqJbww)3HGjsX1k80xgDeFz&C`3sI+;2A8>-HmTJ{x+idGFQ-)6t!G zBE|3gLqgg*Q5>W@gzcqA>4~oFNkII5zJpBU6pWN026BI1N=N5d*b#uj5eF+uNj=Po z>jO}0sF{hBR3l&bXDKP$^dz3U>kcnKHRpsUa;b0xUN|8owWInlXybG{@IWa}Pe+G< z-8F@T+^v%ua#jN@L1i}HTspH?Q~gYW`+uPUbabu44ND6Xwa8|WSLz~8>4C0pCAHPN zs>AQ+Rt>U<$ev2flJ6&0q5Ih&{iaGvODhpD;v|;T2)P@(=gP6peCTdCQ&8(5RL0X;NY(nUGzi5WPWx=RM*Xk0_400kY}2oR;H8QT?hyZ{X?M&% zJLYP$lil#doI_g1WP~YJTgLIB#ZyFF0J*yqGMkr!&^#kk?j6}j#-@P+x%(7RB`*6~ zkmBiUv7TVF8suW9RDURl@>f60lpVhnr)s6UN|hkDQN@oRfvLP+e!4Z4it1lB@;ul8 zDdTJCm)7sl`x(l|Gi$PHHVt+qT}wHktDQq%ZbA?AZZwUEln$)@87|tY60uTp^54JQ zW*ih2?A7bjeG#llOM0hpuofh9@tl#sUJS@=N!6R>{l=OQMw-V|ni&V#Q&k~1oLnjw zcAu26*IBWDg9l~=GWCo_+GO|J(Ni)i()n{f4Wh3R_fH84ClXpV_Osn^ul2le)37S^ z_O-egjKilvM~|W%*%u@TR>t7z_$VjoiRJU$34uXUP<4YRz<_7+=k5$+Pt$W|fCug> zlWG_g>eG&w%CC>&vXJT5q>$t*Tlk5?=WthWlYGgb_%XvupV;wvjV3jGMn=&65tU)`jZ413IB(EeJN>Nj zy;c6~I&N7_aJ@N=ws@&l|c#aEzM-We-*faWB4@GHeXsj6!eg z3c6|Y#j7hHv!uVAxflB-RA+a#K$;|2ojT9YQ8PF`#<%PtnIVdKe@u&MX2WlOj7!hE zdWGf|Lq%4+$oPs32cOd^H~$a!B%rLRY2T+Of(7{lI1iW32eEXIxv#tZc{sTJMix#} zX*?dKez3aLMixQgaB9?J;5&o6D7&Vn*K3;k?P()CrCxcX9~m)TexFKzUwm_k4s|dk z2C!^9Yl<~Gw>dwNHIc2FOfv{m-rW-fo@P3rc+uGTR~IALUYMI1skrJTUNt@ z`*r(`$jaa%zu>JS(V9r!Qs@{t`lY=<}ic4mASV>jZ=0fj|aEBClo){)g!!&o5?TSv*XGL>`l2e+qwarXX0&2N-x@NSBs%$w<(NK=}E9mx2;c7 zQXK1Slw}#7H|^ufOHFliWAedT`*FMX?Hr~I#C{%&5l>4~HMJ;K+-6=sx75AW>^@uk z%0|ArE(7aB<-$!myrB^({Gjh;_dnWkrd*yQm9WeMet1+~?elfq7r>E-z5s-@)J`De z4j#({>v&{7uC@!vBAFL!ZSBhrLpXMTR|GMotgmWUl9UxJo$H+4eVUlv-4SawLu@+W zjam?c5$TF7fz4g73)|4)uuR7s8>Ef&-#T+%ou34TsnGHl*Y?*a+PG$(`Yfb}G?ye& zxiXY;TuB?A9I55~1yt9ihh;7hW;wV|adKiwOB2)Xz1neM#QOM+}>Y9n? z7kqYI*q<=IDgm!ATEcgmW$9YY44E!Oz?_Uo&(}L7+rRVW%0i}5HQlC3$K`tI@7hRv zk{Pv!Or*~90MEe8erD3oS#}K*ip9RwG{U9&2H}vbkC=&p%44l75qS7N#>Tu^F?^NL zF=VBGTC!hL)vccdVoyq8mz#|t>0glS^d-Bw9~F3a_5*VopUJ{b5*JhO2=TT8GxBd> z-|A1xw|nLE;w9Su^c*Ebc`YBRW9&ZMaKCFO&f6<*d`>P|G(Tvd=2UC+_bg)M$1?!v z6!-bza?+Ld;CdLP^wW1Z70&|QpYWxSJXI4poTe$a`kS0>Xfgarkc>B{K^n4hI7J`5 z7iG*==f_v3*8!SN83#%C7F zlx$SVW}1K|wFm^!K&-rd!opinY zTfcCTXq~VVRo+;=eZ+jyG70;n4sCX2D0-2e!|c1kS-HxgyQWJ{i>JG|!{@}$+JHTwRl{NCzfJGH*X*7CzHB~Wa8%`c%I z%NIMZ92n1O&ol01GIusd5)7w?)wHHYzJZ3J4ZKv)ANietmP zRnua?)Liemty8VgyWVP@_}}^Uv`^W)-9RIR6+;IXmFQaK^YKsz>%X4Q4JZ(;SK@+< zlg#G7lix?`1&v2SUD}IOp$-vG6eV{Qt#L&cpn}}8;r$PB?<%GU+o+x5F;V^8a*+Nl z^D%^7Z?c;j?E#GdGsn)Lq8!^nXDw|eU%;N|s;MPcHr!<)P`cSqxy%q?p&jvX=-}6J zoc~d)w3w(zSLmQs=?o_bUAErZ=&f?jS*-Vk!V{2KYAvUB%2q0ikVIze{dc4L$O7R0 zjG!dtamW67sP}fV^0u&n$WYZ)Le@|6$Ub&Ydoi@k4*+~EdZ$QeD^VQPo-1;7DP^Ha z<%g3s*Kv}ZgOZv&R*wm~5=U7T%@fm%qEecp8%^qh$jY@e-CN4aqX>)b*$D8ezXjkW zXaDVS(~+i%qI#c`*byk|my)d*7V@>&6~VlFq6O_t@Yrqkgr0x(M3EQaE!Mdb$7#`g z-USAt?HIF(aq-LRo~$Z{srDP@?q1V=lTafjvXQOprfdk#@)OZ8>#|m| zE(aQ$Z6ytf3v8OxkYNYz`F$)_M3XJ`RzR3+oGZy@d$i@|5aEo&t=HT4z*=bB$)!A1 z#}mram!y+#thFK9zTUz#r@lQNf>*WK!x{)NPI3-eD~DH%f{p;u7*j#*iQBKHL46qf zN*C(8O?J*qmLIb8srudrU~7P88Zyk~TKVgP-812>DKc?9n;dw#E!;j_s_uC$Gkufp z;Tb_EYkU_mL@<|?&n$W1E34j{#d-6_dYVq{8R%v}&g_NJy^7E{Tc)_)Db6xdpEw~F z4gnvV54Y6A^gS3LJryN9Vm_sJS5F}hvQknRxA&DHA%h~M23xBYCUqTB`Q#JnnX+R1 z4<%xpbGh@UVr0azipjanENzuP`-v5Y_QJxAU^AwBJZ-NIqAF^0cRu(a;7^Hr!%-c- zmRidBZibAK3LN3n`{Fv&(1?GyL+!1{Xhu2h!8T&=3hueP1%+8t4Rj9f3wcmyi}SRzbTgPD104fdzapL(^WwwA(l z7@IP%9T$2m+u1r(_~RFiyq(yyR#fj=XW<+saxFfwhsZ2f1CYJkZ>{0fnN7{dxu;F& zARO=Mu(Ik^6fcU6&MA*$ecMq;*KaA~%rprN!jv^EF)aq0G-2 zBwxG~?C#C>S2;SotdpZZSQ+}pF_vkn-XR{A{~RvzTwk(4zL{X1|0#292Yw#W5uDIR z3J0*7Y`d?MeXjq@Z-5myh^=Y9bpTGZD7^um2DGdOi%5z-e?Q6#=sE|MbF1N&04DUT zJuqI0tazIfKJv&wdfm&E#yDp@LW{av@)6OJ;ID$JZE#=A5IZ#plQeq`jimuu5tGUC zA3#qOg%P`IJGfsyD(Hw5a2p@{Mt|;7lQ@_!>b{EwaWPpp=@B59xzMaZ5GQXm>8K5* z+!IRvQ8?wGq4k44MZV+mK^L;QO;pH{@;AUtH=0jT_+&c^n^+gkKsL{K=1v++W(VG5 zkMuIk)UNKm{H67p&oQwlZa{YDg;7)eeMoE;$;z0NTaS z-Chzl4_e<+ZkgRv}Gd|3IUk&{=7DFOr<2p(UlBP-o-y zF;iTK)F7RmQS6308IUba+wsh zw)S+Yms^(7Gr`D_B2%1Y3$PUAjx8#HJ;7(7fDRv)i?`RU6|I(A?(fJZT_Z#+l0?A` zwna3G5ALKHnC`5LdA(1w(22|VlmZRZFe)l!uie!RYA32wwIR3K(@_Hjhh++OYfl&Q zcMn_Y8hV#sDYkNegUw$P+5n+>C^-=xeOtuSXcu>%Q@7Q3ZIaQhl7f=kl}_K$kWXwr^z56$Pdx%9o2T*+_1^e{vg$xABrb`C z-`aQT8NFm>Z<;6lC83o4I)1LdYFKTu&^?_bhM^fLc*j?FXqvJ}*mBP;ghj8mppbRI z>kT7e#xzY?0rtGXhH%c}vOqJP9MQOLZ1^Dw72~4A`slPDJU4?*xceOZqkxyOW8LFb{dy%SIzP=CP zMvp$MaN8+IyX|o#p3nP!bn*2uq=0F@*&vrQ6*&2_tJ9Fs_~* z33ffi5|#C~3-4?Nj84EoNJh7ef@~0Xse9Ifb6d{Q1we(4&aU&a?a_61vkFVBQ)$f1vZ`%ca}ag9JldZDR69Trh%aII4XAo^HJ}{w4zHzye*ZJsWg}l z<4cnb#}O|+7hafR$`rdLaElcK@x|GcOFy&`OG6WR&x$U3A{|1XO=0d1%gSBKCr?^9 zTN;ayjEziu5kzhiC@1jc9JHSK~wbiWaQx8$Wcsss=}x%j!F66l3J@6U@BH}vKC zz}6*;j!!a7!UlYy>kUfl%ym8$RsJTt4(KSpF1PtP1UagNH>Vn&nhkr8t!s{hVAUV! zgqhqtc9o7Cq8&~um5&;Ioc8}7NLxSsq6Y!kOnl?bo-6Eko0g58ECY4W-Ua=!-U znq{dp?+5TU3}s8UE2=PSN0q}NL{z^?X_Gc9*(GH~5{<+x)$;Z0*>za-z%4F@-w!UM zNbsZg@poF)_q;j!sp`JhX0i#U$lR+3KV)EB97^fgRZ|I*%E3g1Yp$M7e4O6?gv^~d z8pyK3-zA_#CoLFq@L}2#plLs(HY48__?7?nAT0}z&uH6;yZ`Mc7zKrxdE<$r+e;If zs8Y&!dDu~AV%%}m{h+%{P^8qfPH|=r>8~Q-3rTgOLqM9K8RJd}KY+fRCa$>ou zI1bj(Fg~Cdr9SPfPpY#CrL|{c`SW3=+BBC6X}@~5wLQr+H5EC0@zCgoY{;GP6pbz2 zEmUwy+OM!UCUrh;m+)k?{~5rU?z38T$ZbPDtVk=)yuYa~7FS1pp^p+&M|~cO+b*ct znFK7<2?j|DMJ((rzV|dl{h@G$*4#}AZBj|a0i(F5v$qOlU%NNjQbi49&hOin?tN#U zsh|yu!l9I5av%Na@+&jZ6QWX}LGbLH%a10?bx;juKTS>Ji8kQ7s3q9ncl2Ecf)D3T zl0_Lr{g}R@mpv>Vkd%*Aj@{8eufXWte>|u0Qw3niQpg@MI;8T_)S}DJL#$>9#BIAc z#s=mVDmSXm-ZBLpPw`uvnQ}maZ_k4-EJb-PX49Iex3@B3Dog%v#_zEGa=(vN_7#qk zP|bW01AY_ywwC@D-K3A7Szh5G`sPsG>eYpISieIXU$w_pICTPHdBo-!L5k6X6S;!7 z$d$1&rKr&ek{^KQMShFtOKV3XrseiO6pvCm=A9GnNaY!3E-0QW!M zhvsr6)x2|M5Uf#2*R+e8ue^2XJBm$b79H0B*6!Zso189+lditpMw(Y(cV}`)q$daK z36V#3Uo50kGBa;m$eP0Z9~w=aD{;K)R4^BAb3^TwOwBmLq7a_V^AR-Ev*Mf?ts89` z1CggU(Y7ZktRW2iJBeB8TgG9fYb6)($5zJthR+N<#?HVyt z5)tXao+c&zXiww7dID02cnYg_inrp*9=jn~e! zRMqKnUX7ENr5Aanjj4G2Oqp{O?$YOpU`xdUpVJ15r_>y7TWQJzkrd8WgTY>w_cxgC z&Ae8+mik_f*Ic?nvkzRV_cRX*4;epCj>M5t(64<1HK!C4RX#5p1l!^$he39$xWf z>3~jw)l@D*!Mo2)y01#x!w+xuU~ByGw2wOFgNhaEBdHAek>;$7IZdzd2p2QnG?AkcgK%SGpd`|k2hhf+}IzA0Q6QR-;B%;|fQ zzV!`aQ#t8=jxH-{g{Yb{J-n3LHFZj@9KN7g?<_&YLrazQ0;=(68%@OiEDIRnO9P=R zhGUz$zHCWr0p5(;i)4ETeMXsNm>?ZEe5c)Yokze3xn@L25ChVw3=bJRX{WJh5{9{g z!$(G71}Q6*5cXTT$dP88>W(;3!*ybUm_|e2sZ}bDVeSxDTk+Fe3vgp*@^$k>L%d@S zOwk4UpzgtW&i?a%#vkHz0Qw}b8zg^ls#ITBt~rux^S<>dt?#+TBed*}35*?nP>rW9 zb3IL<4)r~V+s(k#dN}NBdFQ;8S-)>%{5ChS0$$4kXx>P8qx_ovdEhgGrrZ^I;p!X% zl~bPyjsuc}xMHzZK;tX2co8Mh&7b5vwvj=dLEg~uzfZ~>F~cijf!-|zCc#L0fCSIW zexoR3cdnJLh{SjI2%8rg%BnA%>bga7O2|Lfp+mLm78h^^vfJj@X0nN+e0ppxcxa{yo^Gk9bn;gRqkx!$?X8GEzP36n4CqBThda=hY(ciAFE9zyp3G3%^UTzF~ zn;s5KerLwHk!l|_HsO1nwN7VS^v<}RboYs_cA4a!XF^@MhL!uXcTz8NSpHblX~OA> zcQupAIx?)Tl^J&99UAjj{-k^urdI@3R`KW(jtB$rkHB^Wanpw$JXbhb{qaFzEas|{ zEf{wBI~kPt;q=NB2UNd&DjF%U?uG&P1qwkbH`BNLKtJ3XCsQMFjSFneSKMmltcZFazAPN%UwI>l9;UfkMz$Nt0%PlK9n zY@Rrp4yrQN%$HM)JwjBgs%U(etPYN{qm0Yr;Jaio6f@Ct<+Coro}+0>!7#T@C=KIL zoLtbe%f0t=BhJl@cIzG%U)oEX< zL6oAtfM@#AI!O4;qEv`+Vcp!aybhn>;&--&{oX}RVcx%ffMP1Ve(-_s^|a_`KRZM8 z@;K(+oZD-a>!_bSTlU+k%(UCpCr+mq>4OxI%#_iUXGq*znhI3D+&m+S7may$0)?RS zvE>568-3PkX>V&mhL;XOb=7Rs9+*~m(_qiI;+HD#R)wEj`3BHZWK?YGF%nxzPUP5| z+}#Ps0`(9q<_;Oa^DGYHK=& zEgu#f`&>fU`;*D-bbWY11OjN6A=AMkDf)+_zt*{Ztvk$2D`(PNhCMiQ?^Rk^Lp zq-I!M?LwW#DS1yjplbv8;ba0U^maYcFfhuTiT*M5!Yrb9$7Ev5<*Pt7GaX(+cnStl z(=hi&y;wPgf>@1M4QOPPEDc4e1C=@J0!xT&=J;DRfC{r*b_z*}VMO?C_bto8zZW`~CR6Wf)nQl~EgX!|b=2f$2om-TqlU8i%dN?FJBUo0~#0jP#YVZ0xfGyy+e z;_|q+zzTOZ8^RE3-M?akH;Ob4Ctu!Xv@p=oRdzmPJo1gpz1}0l$(~GarDS9S8HQfo zHq@5J;5HI*N^5yOUtcWDq^pwt@WuD~j0{h}GjNLi7JjgFH>irpx-${~Uii+&-nX#C z#*?OwCee)+e^;u6)b~PXbnFz$`RF^-_->}!d%}9(LajAbeC;5ZIH9v{>pk43jSy#R z`KC7j&>{Ut)=4$uM67jM*^bZW%-0)9R1>Vjq_>k^g1;Fg+U;yGoGX8n{vWSiJc=Vv za{Y9_V-TheEUE04mK@YU5)49HYYWCNr&o4gj;MNViToqpd+wG^izA4{S?TCdhj#7% z1Q9fxy32?EfHb!(1_ABrqtT&(OC1}@L)!g|MaGV;jR2uO^+{p$@;!S@2U-t18$RZd zv=ECFJtE_b%#dFD^|pJ(fJP_rjcUKMA-?CNlA}^z9}zwN?>_c|V{CR?a&C*_ye4M-Ad$waQyy39tUj$XkkoGf^6S#Gne>}=>nC$xkc3T8wkd4_A<# zZKJWuDJdI_qGL$7oxcU7Y~*2i#UEk#02I=h1Km%b>26s5eBNl zu^IZM7|Y_z#{W)<&w9oQ~pZv--&8NWi`AiK6a;ie5=E zSVDy{(@s4zR;^eawah*aGo_W``$og|;6-EI-DY0ps{zkSjOMVr8w30@m!MW64_HFe zefu2OAoj~o_tmWRVzBjrxGieB@&ARyrui&%IyWiWHwgz6F-gTAc-H@&D{t~^Nq5;t=Dgr0u~ zMA8m#7FWBc)X6UzH97DBBNp6VCTxH zd|M!$$nt68To_eg?v4#pGRHuDI488Q~8;#R6c1EGK^ds*9_*oyM-!XBPJ<3+zi?C#AX-+Ay}!OpxNV0<0q#6yySWkYDUmm@lE z51~@OJwm|pz15M3olsJyOaby>+!G5B0et7Kkxs>{*&~lF239Rv~ zx!0;hpVkeCLk!rWRhP#31Z3{Ype$0-d1x6mctPs zgZoy&_)c1F@?G^~<$*@^wydcBmanu?=j$ut1v(#s(Q)!j0#n7;RyKyS= zFQ~9<<_ZrvzRG7iObN}^8Ch;In7iMzy%9QLh3e_@rI?I9UFYmJcQVMRdIxKL*7-V^=fnUB=yn zfdmmC$1oV!j4S`Vl9~=Sy)dk6&dLvT2;+b^gdVRb-=UDrk_ccfrVS90~6#u(>D=U%!h&7P-GXP>h!6ve>{-o)530ngi8#9S((;9C+}tTj3^ z5?YZD0=EEWxG`v|u)TpZ1=~ZV?!j=Ts8LFJy(in9^nF?SdOM(W-`!C*ysJosNEfN) zVp+|tYl#W>0_v%PV-G5W2#`l=4lmgYfP%4XaSh(F{Ba7Dfo*yW#dFgZ#7#YUsHge) za^^XG?>PvfzTPq5T+dCH^eKudjSm&c5a-ieJxwwCyV~_eYc71h^3PiJ-SX_u(%f&WLgd@0A_XGF1O*_8+>e>v?) z1vDyaOrtpCyc^2U#WE|AzQixyC=nRmVYBKe8p(x{7|oslXzI%IJc?&zBgJ2$y5O-k zpwkQKkzhN4#?$VC9Zi_nr;ROj4bO}b+H{dmogL1WS-rY80a9HKU|z)^Ju7TJ^_?)y zaNcoBWcWqb+l8__8%fW6xXEaM$ri?MQD(Ftvo{UDBI8*=YqL9-C5+87UI7jA^lG`u zf!zAEf@vf@Pd8ev-5kX$5rrGNFw5epc%-17_6@`e;)^`LG+W zQXo%x0SY*@y~G9!V*a%;P9d%CrlY*&5ZBg1c_#<+xYpSG^~R>4MX3LVe>l-j6PMa{ zfAJnkSdxJs| z&3=oVjK{K%a0X0JrL^(d#Z{zAZj!w{uh7zCGZt8dz zdE!3xi@oo{>3%&_ppIMY%6A54YGrPkD$$L-z0^p+m634W9kWsw?=YM7m*&!ey__3j zAH&SdiL+j661?A3|56RnUB&M6E5Tn#1?VLv!Vt+-RI5bNin*IH>8a~F+7aP6WVU_- z&MV$<-k-<`BMCtEH$DGuDIW)(=Pe@`QZrY_m__n{TrJ)GZPMy_Y|vo6%VPE|E;&x6 zZ)iVU;+He~r9QL|WS!$qJguLhYG_^)A;s#aGx?p$i_P`f@km@SExq_y#6qqp6-V=n z4ZG4IU{GAssOS18k5kFw-V8ov%<*zp6E*p~PVbXAl=VfR$`kf{Ta|^rwPD+g>zDw{ zJ|nYblCZB{kf0KsO&oEfiGG>hMo|FjQo9^+KynwETx<~-c7C?%Lsj|b1i$~T1(u6W zu=Bm5=qn<%M9X9yX%HGV0F}5mP0;Eo^V5RY<#Z_IjMOc(=0+OVWcD^@2By_A* z#W^39EkXU^>mH}ex99=}Ku2cdp4ALES=*5J1Ro@SQR{JGWprEfNNdhPop0#qR5@J7 z#(qbTL+^}d+E}))Z<81zGCGaU_txjH!t`3s7?#V^qKT@s*$l3n~D z-Em5LL^i<=IPn**7D0FVkj14lvdxM%wMV=g(LHN=L;#G(nMx{{x;QivcAB`PUE;owb)zv#eK6oN4tqRY;GOmrKW}Pe_N5>0Y2u3%>SfV_o zR!*HNHRoQUqYF_exz`Qj2k@U6e^E*C=Okgb+W?#igtNI*Sl4}W5b3IIyyAL)-UmWU zE14Qg(Jv?7K&&gcYCoA2<_^PT{p{Bwv8vriD68ulSF5iL^@Z#7(t@M~!!gTZ8{)iZ z`io8KFx=M}Bj(i(JTzMsw1X7AT;_&LZT(4!Z5E;M3f7Yn>jjmXv~oJtHC6$btL0EJ zMpJ$Q#c|2>pKJvYgLx>@UF%|_1gG?LQm39v%kA?B#8m8}S@qA$lQ}m)eIvzDxr7?E z3^Z8JUR!*@tWGVJCGvMRZJm=hk8=5;KP(3KvzwJ#K{+i28@+0sd_c`pAjRPabj9ko z<{!c*r&w7(qyMJY9)VhX83k26JE3FMdpR7yp`4Xr;)Sj_o-GRScbUlrCg)8BwOEO( zNo;@h*Veol$(#U$I7yvc{b6RwAM`Pertuq~N(WWG(3G?!88HmBAtl2q;lTw8Q#1Aa-Y`1^9KHf zsM}?BAm=Ub(75ji(EC)Xe#j_vMHJeS=KtC&2YzK7NF|D|$vTM}`7}yz=X}FgKT8N2 zmdx@tGI26mAVt$4@S|_Jq4~=9plpMbML{4mI;U9Fu(2pAKifCBc_`JbxFpC6u4JlgZR`)bn9zMN|+bKL!D((owm6 zi^5_fFV`@~ z&V+Zh_pXxmX+CZZcf&;*%VASdN-Tu$kn)!vCdO}*Y?c=zJ3@jDO12sP+X|W*q29kb zZ_%t{R)(U*#e1%2G{uxoUW<|sM-9$NXeAF9R^S%1Rz^rPBu)s+>X&8z8qgNXED}ka z7Zwz3**7`5@ev3Ksp}YfAH2~d1v|6-5-9BbvVp(}9zSChXV8|^K{O+7Tt3qOr-S+e zI_T3OOz8rUF8NNyr374NfJMHdgY$T2k) z7sc5Y$k6nY2%ok->r9U2yj&X*w3X*V3B{mEejR9*hJO&QM_WEjwDCC+0Y+L(P1dvr znc&^N!UsS}63tVkiW)07tE3%tbaX}@?LjA@7ZlUMa|DSK75B3X>aPx-DHwaxI(58< zYGis8c&&FLB11yFu14T}EhXIW8%DEi>4AiSHm5UnxVpwCRZpke`TKJ!tq;nzJ`(<- zssNO;*myt9vXAU=zHUSCwsDJi{n}4=RgG{?cVqt&@aXD*mCnNLX~+E|)`%kB`#y$? z*%}b%=hyBU+q!@u0TCzgbf8%F5j=QTg3~~Yuk4f|u7Z^V-VE!wCm(iQ4_?v(=biiJDbVaq;1fZTB{r z_koLBr<$)nSG})mhVy^f{=KpAlXulEBJp?OG-;Vd&<{}skL+FSqUpSK^a;@C>`&Sy zB(I8V8-_}=kkba0z9{Trc7}G&jfrgvt6Z(^dv1O0 z;j?7000qI4(4X|uZ(e~Go+$`tgskRLGlP)+)1%jvJX4WQIHQyx5}0ifeecXLra*`bhdwbk9}Oz_chc~y)xiG zg51XMdM&UB`(@r=@IvtTtmh_mIF9xMTA(PC`-iFzvK`MD(Ce8+f$e3Id4>{42Q%_3 zG_`N}!pG*;7WO4dZH-Odu9rIlzQ6M6a;hS_EC$$ZMs9XID3Zd`;?PPwY)WNqX$DIUI%JYviXCAa_a4f9@WNZD{l#7)S zJJZAwVlC%h!}AN@T}(TxNVix4mDb#g3_+rs4yMx7wJ9;XdSs!c)0{_fX|L8#X*|7& z)=Hb~V!k;@REf)Ef@(dTR^JF~yQ^NW56VQ#Yv`T~r)Hu6bKUV+ciZ#eXquqR$3dxV zyS{^%?Db>VN_~RnTqy(d3Q|zRvBWzxp$UUsy0t3#QxyJ;V8$uvN0ZMcRj*zo@HhOP z0Q=zU*~0DqPN?*C+4?S{`)qbiNzlJNj5yJQ9mnXZ?#-{tbckyo~ z)VaEb`>@Q=k88jA^J$Z`LP#_Srp}EX{2W-=+x=c7G=wVZD6`9n(SrGlO-m*D$OhwQdI{+E?`cS}gpI%O&td$-n7y*c z2#H!tnwBam2uHgx4)Rbd{>xv1v{#W%c=x(lG=fqP>qzxe+&oU&y*eDeTa1Bu|1p0+V)As@_g* zpG)mss~2RBbq=0;Zase>n`TVO+!=~0ELd1-Ocmz;2yZLbvHRiUOm|6+PsaqO*q1N* zyVah|5M%_4xEqUe`7_oV#6K=>M*jM(KM55TU#}0DGdMKD=?}?M_7&5`ay!Gj0HCO> z0M2F1?l7u~s@5K@7PYJP zuA++CV#Kc6d&DM1QB{;0wfBkzNZaq>TO&Qb?dz z{s*@pgs}zD8gKNJO#C|If%-SFvgjAv{`}ZqTi5y8bi5WOCtmMj_Pr`r@{`5SYd$m(-&D!+m@*A>X`@`GqHyE*at5ahaGm(5QfvYBn+kWXt}3?mxC({ zG(R1&T>AR2%H7FGRE>Th1~7~7|9&=K;F&nyVSm@_{ha6zp3Z^fN=K zs|&?+I+qg3lZm7V76k^L5emDQA_Oxy`E^!rs!SCGOWYhdktF6_en%!9YI!gz#qYdf z&Hmbv+l30`k33`n6SA;j%J{t?NJ!X@%YR!OE*_S|#~`&LRBqAu{MLo$k%HT+n_Cm3 z9eaz=y)#&ww&dYxw+u}U^i>E3%Cla2%jw078mlcX3r$BCF_5b}zVIp~&U?r6_%b=S z>k!Y$Sr0BNuB>UuEbjcw+F(YMYleEhZMAaRR7DmOo~ckN&3xi%%x>Q$C{bZP#t9>b>EF zz9OKQky<4XL!bvcXLKwQBQI$C0pZ}Z|27ekQx=DFU?lm|ueZ9cM2XYPMb|M05g5QY zKPrLW2MtsJgZ!NJ`7(ZLLh7(V_GbTnR7%~&|bMFvoQ8Pwn zI6Ym(rrA250jk)w-}Spw-n16G>j=djTQJF1ZZmH*X)K~svwR({I+;ahkKKdM13|%QD(=5n{_x{l=U)ocb1a5 z!<)-Wj9t>jWox#ZD$)I0j1~Z@X4Psm+NV)k>=B$#tqGbZv)&~&``N0-Q19qY{P!`A z?I>H_Nv{!)A>TM4)HxU}4=L2vP!p(8@}-$l9oyUACqr1!SHze`KUt7R+I4UtQ>WtF`!*^KaFmfHolFzFal~!5hH&@Z zcH){~X)BrXaKF^}yZp?EdMZncBR^M@H&Pk}UQ*vpFA^I? zFk{c^t>xl%BAc!2#BcbDz&JT5st`7v4jfB>^7|C4{yr~Bp6Wgem*`HZw5DG9+SV&| zywCKgq1Fl|ePm6_Dx~K4_zeK6P}tcKe)?M+rx6x=^I+hMx@JlWy`oob^8i2ey-cYW zJtkfhL37zxrk9P}CrI?;@-_z4(#%`>=~MQV7(X~?$iJ*&lv|m?Jc||`j|nK4;xGal z17Duq)VQexKHuEFZ>!=X=9Hx8WY^$VaFLc%^PNxU^+`y6AO)^d%6dXAQRQ6?GaCE){c*o z*S~*k!v+}c5AyFY>=edJ``)#c$zqxDBq3P;Ky~{Itm?IyRxz|llCB1rH0Zn#9#p!B zmbf#JSN;!q8n>-)OE7CQ(5@Mz6fmo~QbNDaebw>y1ClTQj+uf~e zUR9Bb_7aD*sJVUj5bd|o)U~Xw;Wm+N49b&92VOy5CX8wmiX*)*`=ISM?qNIpstZnm z7pAmMF51-|N8{=X@E+GaIN(Wn?&i19knuLc$zDi%Riu0azs>2m!f_#SRGIzqV50SO zfmdcr+#nTVt9ogvi0JFBJZdN3lYdB?1UmktS@gk&3fhPPoBq2sllYdaHdQSzQR>4; z_q^}qw2-en3APS-fk~4)KBJ?`-!u7Wvh_5Iy4=|Wh@>$FavxgpIG zhTYWQ&Vzq`p<_%f50h+ph4(s7oz-#Vsv;e6nZuHpJU*<8+%^8a&%U$m@JVBhKLTRvr^>z9UEpaaqaR-Aw6LXc zEerF62Js!Ns0x?Cv>yb1qorY8rUf!rhmqSI48a#bsijA1imHJnPiCQOxemK>+?h;9yx)mv z1nmqzmNp0923=VWy%PE$KSGvSiP=9omsUs_a88nO?&x%s~o+e@OFl1&UQ8HtNPFeiQ8P==c}>>tUs!R zStTE^M%6iDD7{AlNWQn6EnUBK0!ihHk)HjjHitCUX|%fh@L$x~N}0iRxcKKPYwR$7 z`b+iz($F3bR@3^K*_kd)Paa950N=w>Gi029s(@a3e= z;#3YNQ-=@Qt4T0!q?$*0x0(??zjLGeJ}*r4E;zsF4fqO68hlhFLW3 zl!LZr=RYt)T|GO$v7MIgIHY|1Zu=6ge5MEhvL^id>BH4y%d>nl;FtDeb&o(wwMw>E z5+M!yDm)t01NB_EbloupX~`JD;l9Zjt~?p`A?@e;ZoQln_9}#~_3MJ%ytL>eS(-2? zB~lM7NzJ2o_~1m>;lUq<+z-aNqD)$&WTux%`0q#c;`>aUalacYqQagGZqm!>$Bmcj z?>1c>6WT4|5W+UZD1c2;t{sA<=^H1Hq3;?dF5z{GN2^k0e1RV?&5~1`rQbPyhG~L# zA|>BtKNoqN#U0AXzRz|hvcp%@D#ibyxF)?n+bGf1G1m+njc)lb}tEhoFLCXRS7E;xJ9^s~^;|e(v5XKWcRT zG~v}l*_dDaj`RBJ02b19_w=TF!Or_-;HdeV1$Zs;lD%&)@&!8#bzSQ6sw^=oj#;yE zeD;k=9@A-HD2r!kNa&)F-@NxFLgD-8;*LiH$rHPu zZQE1!dRXLN;^~^pYIM&VyTf>8BHSF~R@yRbgklH(^t@Nw7#$|w6=Zk7KVuB`$mCdh zXhR~4;4v3NO6>)g%sB1CpCUObXWu8dz3y0aA8-CXs4#2aJwKJI-pA<<+E3GEB>pM{ zHO$)a51)RLRKOlg+%KMR*kkxwbY?qZKlp>kPB14ZH*IVC8c2@}yOPWmW!T%OKRfO7Wv5z5a)DRn_49D((xNTz`5a|6i!u z)!Vvnq5wVyYisa@!Y5$$y*{(LT}>9BjS)bj>R$*5zLmj}$a!NgbH<722gh{k!b7b1NGhHqy!UX&!}v4|0@}vXjHzfbcA2aiqSP9HRgASpUzfng0XJ_7$ZG#! zEOilX6zfblyaQ9He-MGG&e1*>|ErLc7mj;0bo0a=5ecLQb`8hs*PKNsjFO-Htcn zU3)C{6lk=WhR2e*mCp+E#Kn6I-Hd!|*V-g&!rkWD^rUIR0-fPH~OcK%*v45 z1+*Jv`(~W@=*fT6ty(++Eo7C6rrT;{FVkGr-YP)(QgWzLfCm+WD=Rfc1kJt4_UezH zJi{0MJS5UH|K@hRU2P`)U&i%8L$JouQK5imljCMN*@LE9zs=xHVaQ;^j&i<&Y-1jH zle`B^Of>;SJD1^2Ro*0E%g0-pwj4BGWBE|%`51|E3hk8I@LqRp-#2NAUah0OucV8AC)*2JM!*+{!#C-@bE^5 z{XI?^m&-7dH5P9p%49ktJ$iYMod~;DkJZVQkU?8n{Z5{}^g{&74D6QHc{XQ8PS3eQ;nf<#W`6*T z!mN>w875k$)zU~8J~{u=ow?3tA5gXzJWDI5nwh&A1(LI>PSFPy@mb;O2j^;1Dn?UY zzSo>=4;nT}GRkXmGU$6Qn7CaQ#@<#egRHx(yYl!xW_gHRpT2FT=V5!yIrDx8Sm8 z&UVZ*5}AB&Y<4oa0n=zDKdQUJX{tp*Us4$iIQ*38W6$Ibr5V>rWaybhr|bKMbVlh6 z>31$f*Iwg2ymGlK{RO?=0mK9OSBny8w>Oad3UNdr@0i~pfbV8txh)5qC@Tgp6zU6n zS9@+6@dYJm#j8Fg{%v*^U38Z&@mc#VpNVDn>@rdxsgW+afAn%%TUax(3d8BG~A;D<-r%zI&qs^HgUUx06G)Iky_o6Psc4(Mt zw>E=X;h6JD!Z)Qh_ubZ8<1SVMhrfdBid8G0x(OJV#9S~BA3jfGLhVUdf*rO3{EcAB)_lZ&udRQsUK#)i)Uu2IuBuay%fguuvFhyI0P2`>JjUC zE6Z2AXo;I435G*eru|LvA|}lv5xwIDLn>>($X^x|i3K6sz6@q&+G)*fuW)_qjAN$A z&dYCG^_+QK`|o9A`fS-D#g{}a~ccM+Fkk4NjX-IGP zhif@kMecCwQs&hTr}krXZP-VaTJ;}ti~L5XU8Qc3!Pz>BW&`zh+ES?A3JSzAHfyoK zh1$+*rvo+=yk&KI0AII<6MRoU5fH98M`o;7LJ_VNUC7Zmss-o>ffGl%y|6;W@xb`7 zhj2*U^V=O~ex{yQV8+fhOikv@1e088uYdp^WST^Y=Ie_*#V*l66k>38MC>LyD zSzw0C-Q}?OQh0$36XuSEnaQ#knT3yK`a#;irt#}$>Ck=SYfE)wc_$5>5tCzt4(oSV zJpVx3oBfL{Rhz5$VIG&GoYs(z>!q63&>aFw!_t^gWdWd=_O&4VPP*c{HzNH#RZvj~ z=-j&XC?$RSnvR2iZFRp)ksCKuEy=-c_`fav)qjg_Na!8OK1F;X6z+c2X~RQz#Vn|u zX=@TNyE8<@B26r{ILLm}g>W&{bv|rG%re2dYT$`^ftY$*!l0Qd??%@#!}Vt(D)Nux zB9yp8=5IBoD8K1GyC^VMMHt%XmcXoDwJt7_`_DnLW>-2Ln$2V_V0hV)$k{30#(dWK z+djJ96&+tv_cci%7!(usPqP^G0HVQyB*D*mT=GZUXXR8yGHtd|zSb{zh z%B%sEg?;Fj8a2~R`eDLB`(9-X6M;fSuL^;k$( z#o0((<+znupc9|&8ce=Xez>h=JcZuW55l@h*|2WgT=#oLLGvph>fIw77pcb4iJFqI z-L|uuFWNF;UG+yZsNQ)~sWoSU@3;5eDZ&uUFoYEr4luLw@78FJkFCTgi4;W1Dw)3Q zdkVLlcHY@_&n!5K+qukCwpn0W`oeEUU#GE?D@G$+so)x zqJHM%4o-@DwklVNrGUOpyR|yO$=TMk{E_9rt#m*#p*|t1My3fG*(A?M3vFrDO40xF zU8~-;zNCcDd^rS`XHfuXO7u^snBFL1y-u5&MSY~jZS8Bo12WY_Ci*vDfj1EGwoH*q zbq?WmiH)Z&a9`i?$$ibCnkl0dkvFd?x5W4?#7JMbnNVNaDwnKC=%B0}Lk`=HG&_c# zj`>IIt7?2pl!`fU$_w2mv7!9Ou}6{Opl53Es!q&&fH_4xQ~-8H=GwNuK6vCY=D^ACj=&vGt@jK9{<7vBUbAM&GQniwS5Q|I6(S zUBA^fx>!IK02m8&y|%@LpK5AvyW#B z?To|LbP3%Oy1n<@vy*2ePK+-O&LDG5;rl+B`l&P~jS32UvopAE^QVz!l{Az`0NWt+ ztXN;DrY_}&a))6PHCn@ww~TKXQRgWJCHGB~U#(?(ZOc>X4b2+)uD&#XI@%x?i~Qbm z$Cp5YdTJKbEL{MVHI0yaSYkmq{Ft(H7twMf1*6Uy>5NYT3`EWv3Bb(xYl z-S$+hcys>kbUMlN7o$_Z-9OvMf0vG5WTG;9Lfg-qxkqy;=la(5pA}}uU4YuCn;KCn2S+28~XVd>eVzf>`@Md38>jU@~MT64R5 z?o>ZfRy$G4yFVEd z$oW~t_H8q(dS8^AybnRw-@Gdfn%#O<#1TyVAy-Qcu#rKJP9uLmVUTe(U(Ker2OwmU z4d2m6o86sx!M*)L^`|F)?c0d}p&~Q9uHYEd`1k8aF9#y$eGCcd1Orx%^TkrV5hWYV;eD7Hjb_aOl4P1R4`8#ACnge! z`EnFrv=WIp?LHVYOEY0v{)#>{ciXd15=d6@ivxc1y(^F4kPn_8^6luX+zQqkuqJnU zw4%%5TW+WRNc>RhM7fE3`@BGoCB0axTK_~a#(ksXRKVd4BK++#XOYav{g$h<2UlV& z;fI%zbN3KghVo8Lwego#r$t{h(EYt-Yd$ElN-2~eprNwwpbELXVA(tUI{u3`4wA=v zPYtMo1b&$4L=3et{oayts*0UEGsbc|TR}!=k?I{YrDG3$eY1UMyjhsSx!KGRzOqny ztz(U6yNUu2bYv8zeYtH*8)43hlt%h1y?j$jg% zO{LzA5v(NlCm3bQy5rXp*V9eKD&K1}Ppvz;f5%JGY@rQ+)5=GWbmD4(HKgy$(#R#g z-Xzt=S;DSPo2;tW+(lh975%;T_`@x5NhA+xM&Im6b{qRSdPsBoU8 zAWf>^%hH@fWS`c;sIk1^2d7Z`*N^7aGLv(2$KQAT+0paT?)oZ8)j42v?eua;TJ>&7 z_l>U_zFzXM=K3zw3}wh)Oot2&C9-gYhQOh)AHAY?DVSMAO22uDAhA`|HK@};g`G*8 zv8Mz%UuwLR^U!U%A^y=|ZtkH*ZN9)N$R)3?s&C7@X9*L^Djfgi&ML$tx*!mL&N6VZ z+rS#a`iVlj=4k=s_1|a5m6YX{H{!&29c4@J>fg_EB;~RV79aZAdU95{K43eGYTN)7 zrJ9O_ccKTFlyfgeTmB%9ZC)5VE1cjo+d4y8_7HxLflcw4HPxwq`1`WiiT7;wP)B0- z+PEn%J&HA=T$Cg{_E*!I|Im+M1iM0l>DKdjBa}041+ISJOSiqqwED))>%9tQF)X83 zJoa=cktj=KxbvVK_V7BC(en~g%`$?&bxz;iDX2^5ycM15&{>mUOqM`bEg3;~Q5qn`W zZf}Fb+|ivJH&SEpcbU%}*qhVtFkn#=3#(aOcVJ>0SNo-Jy0LxsJqXp472nf6(P%Vm}yrosAn!B48&hR&F+J)*sGpw2gMvkihng` zC|Nk=>C#(NQ#8+Ybr%3yrZ&rCp&aL+beYaYYN0KB-SeBF$JO4K28mV~Suq3kj#rv_ zynB=BkXO$<3pJopS+4SGgbW21zfD@UG*`hGg@t0!TD(jde-x8$CT>4&>lx{dwbE< ztmt^!3-G$}+R947HyRqg|9SY0q3>C(`qrO*i-jkZ^uwA9Ty0Q?Kue>(kE_6k?(FPY zgF6N25B3;0s~X(;L=4R$5!T0^<$zt?!~PmvzYiSK_p7QoUm55+*tjYt?i{YfDe@EX z)4&ZS3N@Id`)$(XzONLX8yhXqpcmfJjXy;}3m&~3kq`B4Yr|wZ%w)u<*>8zRR%Dv; zX4ri*EjAurAIn^Ny!gepmMfNq7&n}xQw%c4dO4h7*lggnm@0rsa;!ffz49Qk6 z+r(GyPyAH3c9&%SHk{wisL{VewMyHjRxbC`mli!H&QksJA2v<9Zx+ow{noAHASj(H9aRGKzIMTBLnSS6lfBgLv^Xi zn^fk3pEeSnqLx8>SZP}w~in#3V?E@9MA7mUM zp$+&VfP8K6Znd+PXC)s^4gz~(R$f2SYX3-y zo{Yl62Smvp| zgMmb@a!&;4B4S4)p^A>czLTe`@z~S$D)5oWVWaWX|&pN?pvWrLFH`=sNk{6t_^WZ8lmBUokIS324h{Js%!P# z)6ioFWHDkZt(`OR3%QeIBS-@lNQgp_;9Td^bFlK6JZe9t#p3)oqJp&>enuyd9~2G? z8HkGa6%>tQ=~vv@?eEHE(mQ8BoalMY9yaCOHVGE`#$!o%Gn_MK(8yM8Q<+dHV!<-( zSKgGHs!4ZmB50QD>DRc%J6lq!dlt7rx8tHgH|kPBicQ11X|5;MAd2KVf66QFa{mW^ zlw8tX&J(vkOY2z<8;%Y8MbORZmV|~ z^R_~j$lfUL{#%#3%HdukiL&Q(mGNEROd{D{>CLY8pbTMjxTQJWluc)x`Fgyz2N5f3 zof*)SWjXo2A;@^(C*+eP;MLG-lg$Vtzi{hktplj3SmNqfK|V?7=TDskg4{g-oS8&I z`HU)wQME~i<1hj;R)Fp?x%*CDc;FN{?%tHj@?Nw&C7uwPsWWl2WGPonldkf}HcK3` zFzlK5`R(?)s@uX47B1k`;SW*f^^>(y!>zdPsD0@och^&=$V-2$Gt|`P{>d3L!6V$Z zJ5$ZoY}SCc4R7?s$(0*^UupkrSa9YwQ7^P`G8hALB#-oMJg9J9w=J6O6tGn7+Z6#p z!m?$v^3Q7%T&O}>$TKMKs&pJEM~JAp$2D!LUxFn)eqK@aGFNEjCgYM@0HP%mZM%gU zrf%5}`01p<)q)4k+`J|YBaz#5&+`o*r9M1_m;SKvK^%lm%hfj3SbMt0@2v|dYA9k> zRwF{ZZzO50ZEr$pP9@Vs3}@WC@|bJ$uN&$ognuhb$4Hd(=97NWb~?yb^0IUNGhOk5 zYQN{0iuny#-rQ=amxJJ<>(9L<{reQYr>=5F%^N299#T)S8^<1};ry1m^PXG2cyn1! zp33y*FBLk}P0;UY^+#DUH4L@1iuxJFeG?45KloUcds|3n0%N@1NWx~kI}tK)Bx!?j zp77qG0$xA9XRfuiRbQN2^L8Fj7T?>gw(z(_nqkhEGgD-B=kef!W{2JRW?8G?^G;%W z;4;U1y#D<;h0~gl^N)Gdk$!=OBX){`b}A(%p;?H2JSyikJ@wNUZdGQC1K};ms=0Yn;6Qf7P#zu;pvhFz|7of{QZ|c7-OikG4>CS(C=hZ4d%!kpB6Sh#cmOJbWsc`sW34$YN zKnw+tr6p;UG3fZxF{CIyt8XFzhX2a9l0j)hE+kLkSRy^p` z9AhzV1cmV0d(WgM{Q*$DV=CTl3&q>aSzMAU&W-)O>~t6s!fq@Yx(I;nkLytf6=7Ni zKC`rL^k8iZlIrLQfiTKT-{ZojiS;g7WvSZVFL6V$NpECqBt#fZqK==L>N5*Meu1s@ zbx%r-f*f}cz_!UL?Qw-%6NY?4C5BI~N>dic5P^n#I(`nvCo&RGI;iv$z_LyYJJk@L z(K#nv!Cb=S5|U(%V-K~B);!nVvGo|zT|2K)aMHD;(C-(B zHh7?(Q%?nyTg(5J5uTQNvs0|AEx1#Q?xu5Bt zn3Fm#3piVI_0YDnf?eQ5CJ1$DN25ZHjW5k+fZD0sjjZClKbVPLhIWWUjoc3{!L8e+c%~ve0AOs-j9sx6?tz_Cr7r#cjvy< z=_**y)P(^eKj(-hf3wk#kZ)=k$!yrMF)}l87!42|W`--4ya2y|C(-e`cIUICpj`Q&wNCTHb0GMlhab6$P z3^r_Xv`ggZEP1?|EmMHrp9{;HYPH zM>Y5XbYW(qE_UXI5PLczq~4xnXlotQkokMEsB>Po)Y+o11^^y;+0 zMsw754I*yH4s!FlS;$j-m=ri&X`SXpls;?VP-5#{U^;e@t_|pr@R~a8p(tB5XW@`T zF3zp;;FV%C+r-Xo9^U&X)&mkamNU#7nq7D5@_+3<+eT_ao*^k5xl&S@F0EeN@3Ol2 zr}xXvSRY!XeDvB6_uLBScaeG*Astl|?E!WhUtJjJtt4xYP==tH`4cY#aALIkutGfd zWa3~$R#B?>POsRag2FUcak4e>BtLg<+smOBJnVpc87^%3_~x{TiR}z{=X&v)`(a~C z0Q^^7zC}ay+-Z8D%v`JU7tM~d_-osT*o@;0E!yXnvfa|)Sn83;9#V6T`*>lZ5@2gU zcy@v7g7y4H9DZd_=}{E-i|JA67o(#(9sb=cF{&A2PF99%-J|C+a|?zjouLjMWb_ON zi&dmmbN`EGtu!+!;ksbLu@G0Z2=xi9r_Gv&Bds7LAu4n~??Ka=?k-_*u%*#IS!qg? zbcZQnT5nER`TEbLX^ux^Jt4MmvGlCgNTwXta;GK4c^ILfHUEiMXGQd_LgKx>n=eyH zi>$I#*TClHwZFFKPYxUCw4+rh*XMM{qdTAZMk=_phjgmq{;kR~S~QsV;5xe8EXi#w zSN?sXy?4P8CV3r_C5o)RVOTW2MLTaT)4zqTIktTpz(7}iXhB)y6|Ql#72cGnTpl9* zi<};>NBf+deVn~2(EBe6?aXKmlpI#WmgVwkHVp3rALf3wU0vD@iY`_2I3r*K|BFB6 zjY#tv=$R}iO`kB4m-H*qs=Efjj8yY?bhU+o4v_N15$woz?acd}$>(4Wn(DtE19?^K z^0)l;ECWHVks|2eEmicGmm%Ag_OTG-fJOOxrVd${m-T}Iz(rhTA6ZY15bv$@8px9+L8b*3zPCQx<&(-?rbTGTk) z{bP~jaeg4nu)fZqa82w0h8zTU!dogF>dZT>{+wQICWfXH2gFmwi~llFtBdtY!E)G; zh+iOngSEV>IXfjG_ctTZRSCIocnf{(;dC^zw#}iGwCL@zZ=9CNpm^e|4v&)*8XbkJ zd43&`eG7T;x!{gSF$5(#|2j}vcrSP9Y;)rW38R&4z0kX?N9O0=@5_vRF~S}TizqY0 z9&;`PZeN3ex!Z^)>}>i!+6T25RBc(IA4QSCmZTi&&QtF3rHhbQq>;GY%1U>7@Z1Yn z_-^6Zw^p$VgVdCM+k_7(Ijp}_vl5Qv_!VwwMX-%6{}_A?U%mO*=`UR40rVv~`lr$@ zsc)LmMciag)=YL%h_2B;rGP1pXK#ySNXAFQRf10g-+lLc`zo3|-`D-0)JgA<=AU0f z)WuEgy#~EiYVtWdSvVhAbd@>ASbAJkzQ1DV>u#I;v|sUec9iM)ZTX%Wc~nf%hX}=f z$FIFVo(l%Qk2S6<%Gicoy)D)nwvqo*k?`3aQCgAvj+>?i7?4mYeC@w29hSKFrD(v9 z&#BUB=5@zFk<{{R8i|{sIu8ewXoVn>kO%Vy+I?@$U3rXMOcOx-86VPUU89Rs;w@i|v84LgBMUdzjc zsBJ15=thL;4F?^|3Hr&pNzPw@({J4Pctc%9$(CODNA8t7&8tmSxN60||1u@G`n z+gQWEu!ax#wQmo;sJk9jcnb3Ob=i-6%JLJI|CYuMtt~1lDKoH**W?e#K6<|zf25+t z24_g1Y%2QQ82=ZtI@!;@KPyY_pt;p;!-P&3d`n3w&f5Jo`IwTGZsNRdZa+vNEU4<& zdz-%;`L@Aw(Y@fNx*%{!6qUF{dO|NPnMKM!M`bFX9Out`88|$0w|t16M9yAwKt}T# zp(@^uH~V;Ko2_GZwk1M6R|bvhz&Eh@lr2`=3*J!%Rp|oOEF|B92b#U~i)E4dd4o`1ZNP zM@;xv&}D1t#P=Cz6WH5o?Nouto*9j&Dd+iaKgCf`u+h?6CL9p}t=P9`KWEt1od;G< zRt=+X+a!y0?cZ}&7DswH(Ng{+D=c~)s+$($AA2I9@oU)46_ z2X1SxR4iv0AG^D51i#PYo<+X?5xsHb)X~LI{68PxK#leh)NWGyPz(!)fTV?}Gr+{k<4L+1S$DTK>vFl>J5N{UFq+_mIa=>t#wHKrf1mpU zs`xy=Iv%oyj3d7o_~vr|I-Y?`+rBi4!iFX;PY1{au?;o4+zyrd$BU<&)Dh1OAoqgJE^~PBCJnLuk$4rZGgyt^b$tE* z`sa!M-`5kmS}G$e%O=ML=*1ogt7jG5CcTXgK%D~)wCXThz6m0CYijF+=VWAAUHm0h zA`i;I2Q)-jmM8Cdg3vCO=-}sJ2S4ZJ1QQ&>fGR4TCl^==SQq%XP@$B*sLc#iEz2qX z_tISk5Tjf2F#}|nA`y5*{+vtYO?P58O9yG}&yvBh&53%?T7^TS297R^tAOJ{BT{Ve zhHh`wUA7i}$wc_3ZBfoxGDp?ol$_EV_>9=8UBHEPR&Jzxiqr4Mjow1;_`{zsa1+10!==w_MO2H%GH@Z@BxQl(O30N)~! z8!>gM@^tt{MlavwYf^~e?lTai`uS1}(tDC!P_SPxVo_8d5mgW5r6#K#+g9lA;S$M|A{_v7Q6x$T$Ki4KwVMsHV{r%df8) zGP}xG+Mhx^0ceYY>Vu38YASYq)-?++*aF1=`hi^d-sPXo^23~Rbh%0_*eK_xydfG6 z_5?((1H{qAyKBdgLKWw0%>;4gt>oPW;1Exk7)m z>p^l@;+taU*yt}bL6LhN3qG&3yZaF=GvnnQ>?w?p2=em1l*cpJS0J_ON1(-GH@iFu z?vUazs!2wi>)4ut!PTT}!M#H~DQ>)5Hfy@uyh!K!z2gL1!@NAMdtuZ?px;wE7y&@E z=N3h5k!j5eH+t7M!HC7IBB~tLKmKoyWptN*@6BcHMWaIhhEj@rsem2CHA%dd17@N} z7P)9^%=oTAYdGz49fLcXn+JyceUM<<@lrSMu=LFjgK8FadUY)u!EFPwN`O}Ib*Mz- zCeyl{bc+JxP20>$PVCZ$-)gR~rt-AGP&%2~2nfA>h zIq{z#Ulx+t80X9=)GgNk@DBGN=bYO_a+vZjPvZ^epLFRi%x)>%`)0z?L)-CZ5&(ii^J$+wZrTJGPF%Y|MY7!m!0(~z3H8CvWmT7I6+^0tyep@Q?G34BD zzsvmzxWT9T24-^OAXYXxk7G{iH-8+}P>SAf?r^rV%hS~lx_>Fo@N=tEVomF|ZLYS` z9RREiiLiEqF~q6w{?uLJ!k92z;o(d#BGo{vLZt7*77OM?V2i}XTy^uG=Yir20 zIuV+aL3VxJ+iGeHsohZ5zIu6937t96JNWarJte)#Y{Ft&^CV?# zyF;7}6#w9$xVY$z%JAj(0jSa|;0Qi6XzbBBJ+!fQ`JbiV>YV=?@4eT1JWrwW2Sf9} zV_sszzgR^!6~t4IUCT3C5b2VJnZf7`{KMFNjYAja(0)(T#xJMpFA0*1#AFwH*^^GZ zaiIG@!oDl2sV>@DK|ujQLFq+NdY9fsMWokILKo@1gkC;DK#HK!dv6I<2t9-%AYEEQ zM>-^Q2qh5m$LBll{hu<S(SEdI^UEumr2tA@Y=1R;8n93IpKNW2 z43_0MA`+!aPF;ijj0oDg@(tZ#Sl1@0$R-6L4}x;S`|9>naW-MKyVW?9^VplY@+Xmq zBrQ*6zuyrbq6}=~{bsSX6J5^X$x-xsGl`jlyz{r1a zt##najovs&mKkd8`Z0JQY#9h4soxZ|L@w#m;rD9>F1s6fm`CaY?=rmy)d#5+LWI-xwr>D$l{gB0c50@=jG-b z*WXKJt9_j`ic&ivXVL=zZpHmr`fefJdASXyO(A-6%Oz;ITephN0LK2(R~JhB^}H~| z_A=CYPk_~l$pUAT!UuSucegAgMIH5kyQ;7tg^Sv_wTSF-j}=NTKrkvAm@W z&$7*spd}jd9D{+KV`FATPYZ_Acg^(OE<)@qLQ!)HKhX}Cc zg4sf?!^+N{S!voh=>Xv?W+z&Ja`6xaO%0YR1iW5Q)4*|PssWregq?{4_JKW$^o{kV z3EDo<`p$|_<-YK1wHVmd`n~D8N#cwI`4*<|;OP$gJ-J#vIQ;^X%=#;SKFm$3U9B zm4YcKpH9l-qmvwk+&z7PN*QuNO-1gBHRHfjWYkHi)MnK}!^mF0G3EiKW#YXv7oPEW3ruJjA%)7%?7r8C@5EGYjgKsy93jO^^MYARoBq`8Abp z$(aQA?Wc74fq?w9>t36rfc9QMe_#?g92)e)JIk~Hy-FJP-~?_ZXLniiBMG&|{v)l9 zg`8i{GdnG{*`@82u@c|k0@H@wu*QpQDoKv^DrE!pwev(1yhns|Du0T&JT`}H=~U?O zbd{9R{wz{QDht$W4{Mk1tv{3~>)&)A_X_u_HdRcJg5^#=&gpCDI&((+I=A$mAy0Uu z+2h}aAE^P23|6VHtsmq>nSV4W(0S6fJD*k_U!d0*BHFapeD_Jhos=Sv1?u6FJM9j! z!;IBS<0Rw1`h?7^7nKlmK9*vz37 z{tUQJ!eWW))rEml#nLs<>q|>Q`pJ!)3&u&^RkH6~nhJ^7<%)V=ML8S$#1{p|+_5^g_jWZCoC-k9#76B)hjm}w0l4FhP@ z^Aj^-tLUcd*#BjpbiupHDFd9$Tk;cQ`+2|RO*@AoY;C4ubE=)K#*ikQb!SL5i|*C@ zqhD10FPqzWxv(C?c@(j3CWQC^`bq1$d&mzMNv7sEf!G=UX$>>)vy&OlyG+^NM2fR+ zzO6Bt$97+n)6EwB{5oh;-zWcdqvQd=y4{DY5*$IjsYmp^Em*8%VyD{)!L(m3n71s=z=M&W&QDY2NaQwDEuDFu^BRnlAwSNOm?zkz!gB!ahzy3rhVIeNLq z&hF)lc$`BCX7njn)9Yzd#ceMa>{xn?y}j>ypHqK6cCVzG#y}Z|8O&}!HH8z#@`Y}e z6v0P)0qrqH$O+Ilivmjtz^@6+7x1A4as+<(F6JCpRWdLO*3;Tp8);f5!2S8MkeXT? z>`hdip0b=qm8U*Th$PUzTS4!P$)4j{bwGnD(EH3ju$AbyZjDw-WcKy`2eKm(cyb?9>s!45_!f^|~RzrA!6ZaIf zQ*WSf$!E9d4u-=2QdoD-_9Tb1S|g>$u_d-90w#Ut?af(B8Nq%gYXV(eWMuqGiEj-3 z)SeZcB0RM56u2Ohw9)Q?#(N*T;_QQkaxO4vQCm^u~&a#u`ovCUTJfn3{<) zGE%@ScmZa0-_)U^`&MSQ@*2m0%MhaCGxWJo;(m~-BpVwPJAE`5Dgg4eHv|bNB~Bj! z2zcwn?PUnLG^vt37tGoi>j7URIc1{#Rg0>X^wUo=4%0W_^uJPyH0cQhL>|_N7g)KdyDyWmYbiQ+?KfF=!i}!_;RYDxjd8^ zxqJQiQ42s>_cn8Y<;1dB@pDqIe-c`G9&1*vD&`%i6&K_8FL% z73swETxgQ8k*pRUCRSjE_(Y*N{DmlcPI<+*8M4R6K%qaC9TOD=Zun7^-+YSU+Ga)5DQ zQIi!C#a|(j&I$sp?}XHzy!SpNenKDoi}MD1#@C2K_~hK>=}+UJ%9uxZ2rFu@C!D>> zH=9mFQ#@EJ7hbt)^m&~#Q0<%^eFRdh?)6p25sClOM^k?bmGa$}7lztpHCeUy-!|=* z=wdIhIlO!Av?JL^Gv&Z<7GkCJ#8JmkPg@osYtCh{+R3?1A8Y~j%F{ddPmeEt#nPu` zP5(HzeHliii4F_Sd+Fn(en1iyH^2UnKP^3X1*;XS7~K)TY@}k#P5ImS_wjv93H3oI zJcAt_bHujv8HGJM31NyJ^mldjjklE5y*<%4*pU0~(MUHmc&g6p3?zl>iF(m3rvyq; z2(1dgn#m#?d)O%v-B0QMNxUwfg~{$McAqOEPq#>{{lzEjN}sKNF>!~Hl&(S<#x%@g z6>a{qWL8EwzcH39#&Nam&ZRxv#iPYYab%U!xbsN&gax6qFzG?Li|;IaSS>takj&-j zg{)+LonCbNnF2||uYuCR#pR;03Q2VM^K$V>&A!TxHyZ<59~iNlfe;w!pB6{+JVoDF ztyb3a5+N8rJ3IU)Q1`d=0`EalVj5Lk-eNe0NG(hyD+n17Xg)dVIJ}R_ZGi>qXpMiL z2h4_qSP~RC{%TK($>5kEq0B68{0y6?DtvB79>a28O)w(6{n}a4 zXtfSzi7Q7NfphN!Os8p^(~KW21I&f4c7rxfQd(L4(d{{>MUK~ht##J}H&T#J6I1Pt z%JZHS6OWO&IUMlB3ToG01FPjM&I2u8tg+!K3Fz9LHmDE_Wtn;rhO5D65ddl_=zu^` z_Vzv@w1z+a?~Xr&MC%?-a#nE`pb@&|yVLgo3qPh@Bsy)H!du#>EsoCp`_E2>70r<1 zy{KvLSb{6;uEh0l+R$uy*fkaYzb{{Q!7e>FmB0i93zT5)gBrUg1kPQ~4IL0#*FvEs zyI?a!E4id_h+YcM;zUJinQ1o*l3eD&V6En}cSrL-9Xd%FH33`z$YZ*a+VPf2fFeee_6r zI|EkBWKqoX-GQY}*j}K?ck5e1&uAFGWZ92#epiU4FXypCz^9f{Uf~{A>xS!;#vYlh zCpp@&cKM>faku>U(-Nu?8;x;B7&fpdaQR%eeSGlfi>mN%zULf2&w)u zK2Jp*smqM+A?~9uA?Q}<~oy+5ARbuC+@XNl1n`?oSi-h0$k~)`4KS(egv3ZOiBrqkA?l-2Q-wO=+dUszmhaEX3*_VlPG`K#LBZ&T4n)Y3tt$ zVvfbRyRL+P|$Y`wL=o`X>Nf!-TrS_qw`A3Za@+%{Kf3T~H zB=xWrM;TbuUL1cmy}oihlj|)P2%(jmGf#4dp446?z)C%Ftu^<{%!|P2-PWVwmY7yY zyR=YDyNm^(qQ8=Kel0byqls~%boAmm=yE6CY>KQFAeEQ<%?>7$$eXn@dnALM2=u6k z)iP&gZpdYc&2r@y3hktxiqZw#i@$@c)_~lNkFuO!h(H|dR>fw2NT`6Nj1kOz(7q#0 z{mv0y5C)!sy}1GBjESwh=?e=3$+^8V>*?e1$Hih6b7fz@J_SAp&t---N_gfc8cIb`E#stiRQaVvYj7TL{5my>`D<|!QNY=C21(cpZ zw;rx1`4;irtO(v_0Dg?N+@pVda94+K;|;80RQ)A4t7DMIE?Rb&sbTDAC_DYn(Y^)K zC^T39IwA3nKZYuYed!TaShTz0aGSoS@mbE`0LdC$={sp<-Xe5>xidMOC^F6U!z(#T z29+V(hNV7j$%Ox`a~bHt8>MIC`Rtq%Ddw0ViYq6W_Sy;U@7IqlI>#&=?6%LHN*rBX ztEe>FpXqq$L(DMxr5|;I^gs%L$*Gs)X-N>^K6C*ZBnE@JS0DMkF|4sFN0W?nC{CWIRXG!z^<|xi-`94A}+=dfdQT~|%zJp*SaHgrX*!Ln#9?k=`O2CDt@1 zC!cY(uwi0-e-c|ReeW-iA9-}RC{w;UyoU)X{WzZ3do=1Zf}wd$F$~~I5VvyCzr{1ebtzFA4BT7`y zwy`ZAax?9{;=s-V|Bd7c*;R?B)mP^WTE+X>8a*;hTW3GaAZ@(}lca=PNy;7<-*heI49l~)gJpZ(FPT|bQrm^G-I z9`kgSH_eOT3VnM&ibX!EH%%Kaibbbne_$|$pG9DT=~eHLS@~cJURAh#J!lVOGw9W9 zQ3X!X-f4_JTxzp zBlu7T356&T3a7)9ur~Pv3+Y8ib4&ws7@1mkT477x+7#)ue=yFXWy|?|Xdz4t=w&3`##QLG-tTDA|Fb>(yLn`~;CmLld{EJJF((t{ zHng?@3-oh`{S}ZTNhxlPn_y^}V)wx7T;o#4!U*%Pp}V9VgsN~fk6+T#d^)Er&6R8O z(q^LxzXCs^BXo}=@$<`sr>kiP0P+x~9L%QkIdcY*?NBK&bLC53(!ZN7^CFdPHlWE6 zN@kN_ZTDs0wjS#(Y!s8cYf_jyV6EvI5;>Mx1IBX*>?`^kuT6ZosIdR1F|O$_87q+$N zyT8A2uK1jt-R~gHS@Cj5o3LaDxZnMRr!`WrOzua7%<{Cm8g2UCMJK*ltb)CU`S5ypr6KTyF z2bTDuow2_|*#vM66poAIEW53`q2}x<&uW-GY-x$aNl=a6b^kF1?H7Pu{~J_w-$Tr$ zX&$F;+}essOw}@H`$8+?@F0d(;87~w&9NKHP}x#FWa2q_`SrSMgM#DYn|(zYzW2Bm zNQM*i!A_j?bb>BhRmx$!V}p*d{xY@y5Kj;gTB@rIF_-){W5~v)0kPFf!?rbiHHX~Q zVnO}x$lT2ap(yD}#nw~AsG0B8s4?2-Xk_q8WV}pFsiOAQFWA8nZ6n(JcY`ynO&)*u z9w8P8lRfC4W=KH3JubL&tT!##*gX6$Wboyb-=2{(&_KMzyll4x^7TL7rizAfTfnHu zlW#H>(!R6hYXViz{hY2@YgE9BhIxLFA!2~noC!7Z*yKPOS-I4X@s7zG^EU8m9eq{f zSO1!23D67fa6!ZDtg79VW(O*gGoa<}O(f)=BSlkviuAW#YBbD?>&;jz^-1+L>4T*4 z*KFm?6Y&MD-urix`!uZIU7f257@0~kj(ZiJxj8MQbU6rverj-fR5-cFxZi@Ppov=V zIi*um5b50KK+*m=mZKsj*Z4KQ`I73T&NO=s+vFz|Ls6wOKXNt6#@mxi0{7M`D@*>o zp5zO6$dc42{yI5{mpIj4+18%N0*y4xZuJF*sUKymM zDByp1w?QPGP1wZU1JSQ66)NBN&=)i{Ksy*xa-6OcK)asXyxq5xvue2|ZT>Q*3D%DI zGtrn<9jiEFQp;dMsz3ODeB8sDl$)9_C4iMh$vqiz;|ls)v_1y7Ay#|*19wgPE-4d` zfB~Lz^~uY7@hwD88kLl7^_Iyg<#li3P{F$69d)(PS zaDAV_;pUJJxBdD50$&B!39COBfEP3ZvMt9MnGy)En{+29hXl9p=`v)q7U)AQ@3v57So0@0U-0-EJw1+WuR!ovht56s)=>wPBf>v#9A2NYk234c}bzS@FR= zt14NiHIYA=bfpSFh4Aac)|PJv!&H_x z7OR_3_wTsFk=W%jFwvh&pg}HcSZSl~ShC+2_%&51bW@eBZ6pNvSz|yI$(;EdpogUO zn1;p&Qg>IiR%0$~{M6FNfb?_#7b1=sND(+F?J9FF<+tI9CZJ|o(g4@EI>lC`-xFvt zbhg*}FwDPX_rb-&7(R@!QQrjBWYWlkZX=^wNfC)Mp#!ekoj+3y0!|9$w(8xD%G6ck z>cR0)AKWh{cNihw_MqM9*wvCQ-j%s=GKmGuJ2eM+(B!9qa~}eiUCcZ!Z&Agx$7D9y zgN_KH8Hofypo3or5DLPna|OasXBb8ZN4|OH0T|rJMVDmbvF>4pp{rwZ-^xA*8~=Y= z!p+Z^9z>x>XCruFyF;VhRp9C7B4ZE@M>dy>rE8n*{ACNm{7i-CCiJM}oPgHkLLG#l z!LjQCZ9*XmSbWgNDuc<2qmI%J_LD9^HNfxscZY(X$yR z9qTlIe+zMAFA6ofo5nu^oMLXmR2r+BgMyjLdsw1WJv$DANmtp&9A$Kt0``G7GgKjY zEsMy1b38*W4VL%?at`;=QRlg2d~fWF)-3u^^2$$HaX!aw0V}@#kS2#1k3s4&(hqWR z?YqT*u4rhJ!-9d*Yt3JXOj@WM!lOM5zDJP5<@_|gAk7ny4Nq&GyoBTI!_)|}a(@gP zVM)~wj8c9I3fkFPqI>m*s}Z7Z*@k$`7!>4cSCU<@j0OhJR+aRAX-Xy z)j9)j#dE$rUckP1U}zHHzw}K^`nu)%GcB|4QVo!%%iGJq9_MG^eXr^c@!gW6EGi$_ zWtjwRB0$aWEIa<_Mhvj8Ulcu3#T)hCMv(iH>BrfF=O7)GV{Lg~Tu-s|jzLCy-e?%4 zXs*vW{h2E#$Z=>k`M$<$HOWmsjM7*+>+awY#j$V@jANVI-7040#_XC zx1M6eHMTJP$3;BOQ_WKjEKSuKS=^r!@FkgmV5)gM! z1ZbkcKvr|$lAqISkV|vTjbf+;t4A5@b*Sk{jcCK-taosRd4XVtNJIS#L{MGcpJ3*y zPj!n;M;Q`)cAhB<_Np}U2aCvAJF8;bs-|1V)~_I)v?CIR+7S1AJ-VVF{R*W4`)+YTH?T=(u%dR7WC&7&V2H}Wiz z*qkK4eF3d_T25x0Y=*iP#h5qS&bJfkc^&nNq%?g?h)N*8fS|tbZ1a8J+(J~)W!#`g z%koAQbseYf-rfv1w0JfgT^(ORlnvh8(atmkA`)R!={#TpBt;D{uGfggY1a2eDk%5< zX{`SGN8#k#Gd8ZgkXcI-2ng!L@`NJGy9W4ky`H` zC%+NWN%>=%+taLHxYbQToAe^*no%RRe^++#dH>pp+Z3tiwmxfLarxoL=~|-~0mZKZ zl&O=gY6B?~b2vZrk2i6f=2IXFY54da6l4ntP@EJzG+uVFxy_cV6Dg24N~qyEN?r+c zhYiM*Iv9NK!N{;Ap2bpmjO0eBiDJAIYwk|7Csz`ZUmSJXq(w%Rt}%zK1|#O|l6CWU zkE^OgPSH;p`}`@tg^M|zzi6iGwsz~Mp`{*$&gTdGj!0g`uv4fs%;aQF*}`0?K7Toj zRRKPF6{&g^(8ij~W~$#Qy!QG_Tnzr#?WdK>%3wL~l17nG8>Ve?hA4)>oQk9@7^$z1YNrF|GBIy)pZ^)fG4 zw13>Ap}(R$oWSoYd`tKwlc1xVvoc{Nmf2y=xJy*B;%l#!cn_Ku%Fuxx#OE4Fpi{RB-B8vDET9L@g*V_1^S;beV! z2{O-DZs>z^FEH;zCyhf1{?<+-bd3iDgVpFv4$>TAboNhz||mh_8P2?AfPwhlUn zNe-P5(hhiuF&7=5H`)|0i3xjpH|(bjwvEuPlygHGszWswC76@0M8cids)ozOLN$}B z+UG-DER#R6&Zp>q+xPJrv~PT6IB%Q-XT#KkB|sbRkPN4}kW8_?&lEY%Q_F3W)Mo(k z;}|gT^e^~Dop+D+ofPkJ!aH&FCZT~3kLJ*poZuLh^i=e9QE>o$`-u+E{*T^ zcbF{$EZO9m-Q6rgE>l(yz~BLUafLv$*8qQDKh166yVTBYN0RVCJ9Tv$^Q}J|bN#GB zYBug2fc3Ja;7eNqdgkF|@#KWx_4=lfy6)YgV)ujnEDrPs8jtQpa0J2np3Aw9L~p)JOfijpJP#w? zXj;bN{;`!*q04>*SS{-)`u*Frf74es)j182xz~TwdHzpEg@=R@3iKNx{LV6g-6r)a z^DYWP8`%9B`Uy^65=l0j78`#~?G#+bc>EIlxpaWa5!K^C1%7=XGuy|)eQOKC9@9K+ zbAvETs13rw{0LwUYoi+8>sPoT$fD(f_yewnZIl@g(NwWn4f}Cp1?*^U@})9ovSRq% zkAqngwTco?X?y#NxUXRrl=50y@;9%Nv=cAUPmJ|hN9B%pOo>Bg7mqPbON6f&t$3LH zFE`Bi1r;1U%N~7Mb3LF)IIiKx!;T2ql3vE9qW;1$7sm@M#RGN|#UZehGaJ#{wm%F|GpF>-$p!~(UyjK4J#&@!3K1tc zc#dQ87am9HZAbpiT3U4L163LkAA|M>Ka%V@NR5>DN+t)@_@Q;pBa&PD+EPf=v+nX% zS&ZFq>pc1{UeQ2MzwW^1NR6-NN~~p<-iAR!FKB2q)QpPt?`xr=S*@ctenvt00%2mo zqnhDRKnakl?KqQ8Xkh+OuiXQjaY6^ko3FcNk*RRHoS<~*NuM`?VVPCj`gJK1!RVc& zi2PZ0N#B6fzmK^Td7-&)W@{f3GWonx&q#|_-A2B&8-2d|=*joTO{^vr{rFu}mHqUA zjU*6S6r|zHka&K4j;WLl+eM&W^d%L)XJkXIYw#`&YWnq1CeXE%^z(G->hv!lpIPn; zB?_lPcEJ4-t#5iO6)~<$nZYuTyuS=6Hfvu zmI5XYIJyIUa^L#}-zla$OXksWb5}w3;>M|2zY}?3d>6~6KiJmt%>xE!vBSwWifK0i z9feK)4wm7#Kr$5XsqG{+`T2yG9{xLWMBWB&l$FyAb697PQ0!oBR`$p`3%!$vj5QbgvDzG{!yy6 zb5n}8`mgFARSsERc3H`rhaB`Sf9psceNyUEA1bnCeGM=RcH!S0N@pFR!_*7#f9vp< zOJssLWnjD)IoGSb&gMwPn&wJbQ9gjJSV+okDXy|O(kRV-lDNSUWY?IR>nGS;!y@;x zp9gRl++Rz=l~-adho003JGhE|&MaB$_&F)9>0oH)kwVjoXxmnE(Q$C2YIvQ0qYVms zdfLDAQFAZZO!jdKot$8(!j)=|CBxi^MBgVL%0b55kw{xXKc0fM&1ZLbZcqu`EV&VN zF@hR%%;e0C#9gnDnIhS6m6Ks>9W%w#?Qc@%SEs+8tM6XL1UypcSX}E*U&$sbnq^_g z(wl1fYIB8{xO(}$=y`W#Ha3(N`Gw5Xr;fa>v1@Um@8;OM0Rg>3L*lWp|0VH*+8?3Q zqpV8?`I?bO&R=L2AbbDGj-O7=y*F#KFZRh{t77ZzknTF?mYSh`A@|`?LOKu}r#x{= z-{l#@&7CLH)GhKd0aH9ufjO=A&2BjxUpk^@mKJ4Bin7`4i0-yYplc??+lz%Q`7>v0 z+tblLfJZ*3w81w#**6&pqmKcNse8OV5#DS%g2DH18iS^4?&cy}K3$IPevyNXvvDAC z-%|yjL)j=37$#o2+$Etc*!{A7^qY$?6u5G6>61hGoVzZ`qvJm2=ybpF-v!5$RT zQg-x1_Rhz_>85OxZRriqxe)HrHzZ*(X`SW^d)pJwNc()fe>~2~y8K|^Ez4lTv8>&D zz8zRv9kjZz6{uB3JI0vTb@g~^cA(CKVaP{}q0wsvN!oWp){kjHl*PkN==~J;Gur@c zeP`Z?XB)Nq9~he$jFSyv^YIbiR&wji9fjW4U&$yQkMwtzpf}0SYeScCshzHTtF@hI z)@WjRZd)mdM56i~Am=alp@_7q`xDAPu;$t%Orx!7E5Bt})>x=yEKXErIQ+ycK?Ypa zftg0~-z#NN{tB!HigN=_t+|GR*EdGXl9Kpd?~SD(%u){^z^}=T4ig{)cg+Z`^d7Iu z)rTVkRC7Kr!_RXG8@2yAbkz!(U>4Mz5;;fYkY!zmF!EIKd1;$K9sWnzo^mie#2 z!tS3ttKGmg@;%_8TSuGDYDxdEMILLIKHJH~-abNfrc^gEWFGaQwz`F7VH~t^@CLT! z0mwb6?cj!`;kq!+n$bUKIasMIcnE}q;`zTB9ZVYBV4|sd%gsEf9%2nl=x}|%qf>-N zqJ`Q{uZOcZ_-o9QgQ5;9G@XT0y3eiV zPAQ9ixy7STt()FgXB{^Np+QHNTLerZh2xV5=M1`=UPZtJ{JE* zT;Y%MaDhR8XK6MpzCoR`mWNJ80!If-e#zoJp9lFeZQ77SyB+|o<0#&d+v(c29jX&8 z%t3SVu3C#ujcK+}Kfxj_g26MW(e-8A#Ma23<@MB9@{3lZh3gBd;Mast7ur$oEdSdy z#3^m7{=o*LtG?tPmd38p<3m%UGqX8!n;kl1x37laz@$l4;-;pCsmh9WkHaKpe*hyoQqrC~_N&a_X!Ux8b% zk_Ch}VZ7yC eQmo*V>A?4-IKnJ$$bDL$%?*A>FUm)BvTF&^|`_KEIaj~f^`ZnPmfsPRa zA}k}nXSQ&KxNp$quchxcuUOhF7AvJ4jGo?^kuXWw>kgD^&1*gWZa#zMg`oa0HA|<< zBx{c?@R_HpSg00?YufZLC7WXF{BUV{k`_m{`DSq>WG_>ZR`RyHGI|#~DK5d6Z(YB* zpajPG@6D4mOX?Uq*)&%ZbxS6Ksg@Xs~6$nmJ;6(Q8Y9U2i?zF-na-PW0k5b z)0*p0$Oyu03I^K91O<40A^pr?&~oJ=Q0h0poJ=`9Fw4J+0++Fp*TX zX;=CSvh@n_24QXXu*y2q#RFZYnbz`I;P|f+)_9w;4ZX8T4VS;o|Ee^fPJzC-O z+h4AAS#wwAEhU&9jt#7Fj`jM}dm|DrW!L~+2A7{4h6b>m*Tc^WTS8W>FI`Pze@v{D zgPJOV)zKpOpWtBUSv~PQ#?7XV8^g;`z*dVX8b9jvIXAQtES8hvR|7xeg9F!euH`mM z{gY2&t>)wBX@J>^cRnMo%moz%YU}-GDW7~d^pU3SdB`!-Mc|Ifk^N#G0PoCd)Z(PS zjncmJ2eg_QHV-&jD=h5_gjdU3Cf6zo3WT0pUKJ8SszZ;Ah`AL2@R6_^KF0%}ILttFloTH-^Os6v_onSykB&y%? z=47LNaLXdp$}RM)DGxFx?`@r2k~{C@#I~e1Q_}m*jmuY4oBwuH4swO_>M{PKX$s`^ z>n2%mXuS(saJ~&wISQ8gh}cz+!6Pj~Cl@TtXq&W`cx27k5Q~M1#!q4tP9|j8qxtML zzwgNzLm9hS79(2T=8;)vrh}3%|L{N3-LspyVRbW@_L*9|TKbw};!aYS1ACg;+hcOn z*k&?ExpD<6yBM+*vOSN6ZxLLATiW>pJg&5kc7^aQd4yI8vf~Eaf?LQcsbodUZq(DZ z<}fH%yjDtcvnu&$m=+QF9Y}SydB+J#=wnTe##`0%lWBv z%Q=neb$xTMm)O$O)NktGrq6lN#Lr*wnH}u;64N-`Mz`<#l_3iEQuawC0h|rhI|A8% zrGJLQKP~jd-$9rt1#$}aG0kb~f6zgfEKR_o?v17)FM!t(6jP06S#nienmDV5LTAH- z65IJ#6;}7>>h2hh8m7JCDd!RVYFHmI7ab2mB+qvmk5;yid~n-UB)WRbR@ynpC{UiM z+|ZbnS^en;i5QvVq2l&hWp+NJY54Nh-yrfoU4>3D=%3yYI$HODJ0vR#BV2mMhJq?9 zlx;1MI+L76fU@5}p^k~q)4}aIz274((Qhv0^zUi`$WRLoi#jDGkh$vg!U+JNS{gg1 zpgH_nx&NMcJh;K9v5^$zed=9?smf4n^LNi#9rrxJXjTEv5bNP3<)?c$VUc`1C?vL?gRhJVjm2b)at)w=lO+<`%?@r z0&dOvNIjt?D7spI;;)^~OX9nR29IYjeXhdakcIQh?5hG(E@niM;sDNN&doP`LfA6e zXAK_{9=F`VR%_-`)6dZ4=L|ZuK0! z?dy+K5sw74``uV!^*kET{Hd1OR8Q#VJ@$6v^9MG3IFb;fJTW6Cgg1ct3#(M&}gTo=D0R6e*eWTol6xAk=1 z$Lu5el~&bVh3IQYY&VR|RJ83pz{}M-sX&1*4){Krmm0;oYQ3Vw7NL>WtO3nyL-TQa ztr;+(iqKmH5w6}D+z9jL7odziCXDA7aV&N9_tW!I5h_~lX!3?4iP3$eQY}-H_yffz zv?I}*B;U!+-yMp(J>e(5%vrL^KVn`c^v>rR4f*D?%Ys{~59R$?KUX{fSz6>UPOUQ4 z-XW6!-&)DrA{9^Nl0p6fr9FF^Ba>9@#litivJ^V})b-XfJFC%`=_`8y8*{Rc-e0>3 ze1r0>3&AS4LN&PtXv=|v=U#wBKchU;5(@>o%6fSRJzVZ9UOgTUq3Ou^B?329>|=G; z(fW!7!F?461yI7Vt&>2c}SMNE9YDf=52qS04t?cS&nI{tKYl9P45 zAqe;5f*&Tfj6w?J(WidIOBV-N{tmXZMQs!8+7IHig#PpO)G49b%95fQSNH{a>8fJs zj`dGhqgi6&Uimuva=0~)t+aJACA=Mz_}wPSM@XSdM)|<5DptBxp=tWEI9K?zcMQ%> zpcN0u={C>y3)+zuX@T83prCS_!;hq`4O=Xz^-xROr1Q38H_Y)qA&#Ww+%14A9VN37 zh*+%&INZ_36A0PsV{c`1)TI$Cf=SIkp+#Rv4a{G)W=~ItlFb*?tRy$IJCD`Tl4n$+o{04NXh3BlKN4* zur^YR@8ASKAaoPe0=o+3QEzfztX5hGd2^sOAo+hH>Ea!)26NLeuq->;Z!x2}rj2+5 zSGrxy`l+`M?Asl-?!EHqS;|>^{cp>cwT$zMFFS5lH?i``J=KQw7BeJxLZHaJ$*)$M zmU;7F{QdVI#QPwCBV`eAMt^u+SWSD$uBg&8gdB=R)}FUIsSNN!j^9e>ERh zo6`g6d@t>A9FOqV`>h$VU(VdYzJE`~#2;CG%+6QfCvRn`svR!1KjKv-pGs7?zCX9r z6=<)sxO2=%B+q^Ou5D|D{ACce@e2;sJq>>y8z)>Ol@8fwd}YFnv0}C9EQ45h#a{mC z=496;xuMIaED*M<#q?aSKc0EO>6C-E5SE%9?;y-$hi9a5yVeRK z2z!wYiU*?Doez7HA50>GA^7K&7__j2BUQhH)d#rWN62kf2syu6hlQrvQwv$~}BE`v&Ie&yVt?&FtsGcGkc zOnbZ#gT5^s`l+#*tzKy6k!ER&sm_civz=O@@RF9gFqc+G&O45K_+bAFqCIhc7KD0y zS{2nDZz>2lGwkMm`PYiYDI+4x)Fm4p7vQ}3%%|M4+<==Eib z)nM7`6Vj5~YD?d{#fEk5)8Hnu+YOi4s148H&X~sg^RLX*Q(lxj7SLSm-vlRN!k;<< z>mMNxJ1iO{DErH&g>-uN+j6ZzG^n7NRm#Nxxm+!2HB0#B=ba2QnGdWN0YqSiHII(# z2e`J9+m-#zP@0OlpW+J=%;Jp>oI4Yv`1P^3|iLryC-6KlA+bvl&BL%?G!1Xhn8G|$vi!MVaDc8 z4CwcgJ^QP_f;_wfKNXJ?7ggc)mEbabOO}e zdM_#QrXhc*s&e9b(ekR5;5u}X?`_)SPKLn{CPnz%jQF$#!qX}`{HkN+upL*S0OV}- z;8n*-NQ--#(8%7oyy=p;;+b)PO;iM)@d*xBv8Fk1?%Yka!HeqauF&$2{(0o_LmEGw2D}C{CU*?USeVVVKDhMwKRdLEL<^wcZYQeq zM)yY3#*d4w&Oy^tz$xGD%#BaHvR(U5jtFzRfU>Q){lV(-v}OO2&`>kN_>iND^I(>x z(3U~yF==RR6v3qql`tldwpg@`Kk6SI!CwgBcnDy^ARag^eKK z#hk76;)j01E+!SvNH=!u^FUh*Sw}S`|Bte_3Tv|sx<)A!C|%o#e_v^4xhO_sm+eW=%#D7h}0N=&LIgCZD~D%1LhJ zuoYg{IW9^?xi#$FiH%C66e#A*wT;dikIM*Nqun*7UvtI!b@BDTlm+h+bD{pSRg>@1 z>x^5fbunw7Ut>xg^FPCiyZ>ZeU7z*3;4~+4Ba!vL=o1^KGZjAOC0m>vIYg%6}8^ei$_~BWB$=33sb#F zQX-%(xtFaMc)La;&$uNvHv)~h-Ce@ffF~H(_0saUOj3{2e89Hh-~DmPsBGYee==S@ zbYKlvaQ(zq{=S`XIqo%>uTkNds+9W!9Xl&I&aibdjBFtvc2`@r+7EBY9>Ec{^4TOQ5_g`!@n< zgv;D>LdtL)60U+Of#o#rr?Y;^#S9uPV%_Z;#*cQP5sgay$<`Qc+l60K<^J)M9t4&v zeB9+K09lJ(YTPu|*a!X*O|YZo**u!nmjwiQ;&G1$kJPPl_LsW9rJBk#$I;2>>A0$S z10+G54dXET#P2MmrB&#E9;wx|^PuB2Vv4%wdAZs)ie0NAq4hQYwFKUq>Z&+reotp@ z^0*juzo{FK$VgDFHpk6qb3P+2{;h7(p6eQ~ewp1k4cDtfR5_>N zCt<7mjEe1Q#VzEi8!+hJ{ldPl`ONHnkW!PlI>Nq8m;FAv=f%O9kF7AeDwY7FxtnV1 zg}=nG#d3-%Xy)aymO$cR*OfeDXJ@H!!uioJ*&X-;E-5QSY-7|Kh|M5?17Lh^X*2w> zXn=khLZvaKOgi#fBD|LZP`P3QE@!eZnkRKv`}x#3|Y zSt+uu3jK-UAjgS5E}>=em*QmMI?~L^0VT&)Jr4)tH$Oq77<(*BgrT1VtHs+X&u(^z zp$D}w+T!dzXQ;CVh^hs32k#O2b~kwo#|ka5%4rJFWRvEu6OFvuEXnXks~=b5 zSQk>obtRwGKk+z1xNPnMYKtLJX(5gkoCWsuU)3fF1_iiHe!0caH)sTY8;* zjV9jhWT+uqAW}NRRJTe8nria5zRo|dNpvz;%^^a=B`5m_n+LQF%;ZJ&fvZW4po#jc z=Zm8C6SJ0zcjBZBJ}b6Vbs=__4$WVdqf&fGDGRS@ZH!q|zEO^p(nl|SCvPs##(j+U z{p1mjP}Y4!41tdEg`UB4IE)DKm9C1_MW7V^+y-m`+M*o$? znqCtg>iQ59h!!%o6DaTdaU~DcG_qkIie3S795)X4GF2yHNTUOA^i9y zH`KGiW9y$82>7>Qa~-QfxY#38cg+bSGz8@Hey3%VM%+b>9)JanZo79{wSb_<0@X%n zjpT(hIN+6MysrLWhf%@i&<{7z>uA_MTPuu z-eJc@?Q46g-jUOFetLWQL+^MFb<{5j%%t2mWNdwAf+N-2*7JX%GK-xH8lcQzi7?NK zTuS`~V17Od7X@sp%tlmRir~A|aKG?;9!c+_wQkI>+QH=4@qT9oV_VOz67zG5PBH76 zGFe*g&kuy9T5fx?mevx>W#=;^sh0=j>So?8U|NRj7M<})&%2@v|2x!wd?EjX_*FYME1Q8X@b*f6bR(m>gDy2yMmfssHTVBi(Tw%$xgnNE9@hI3dRSfr zGTL~q)I7NJQLa#6C0k2IG97=B>C!7LG1ai(IH}s1@@hGIdh2)fUf1%u2Q`7$eVF@? zyEW}9r`j(mjG*GyZp3f!eIp-39_GK#*!NoOdc_0MPnGMdQ2*hcdJ78Pjx*~~RqAX0 zh`Q=_ZLoof+^JmCuE5%VZI$+9WOe`rshu`i#5?({t#{rXXo4y2!8TIuuH9WZaGf!b zeN?@E%l8z{{pNx8dAaJG#rrVtY~ET^g}C$KnAUY?ulHt~_U)ArJ$r^ zO27YO)Nw9^1>fN}U>-4w6>{GIQhh_3`-V;~#dS56z}FaY#~xT1_-o*QjM&<=A1m{UF4M1Oy5M(i=s>6U-<}PV-LG?FOrM}6<2L~x zGyhnsD61?cbTusU{=vgW)MUOYh%p-JGNu?39P2b1dfgLuE{2r(z*%cL?iyLMlcAyVHdy?m^&i97&GztZVBDc0fR7UG|~C{$8RiDlc>Aj zn(%Ypmb7H|>NJk?t;#zd1(2pAzu%d-ZVkxMD`ND%(YSec5b%DQ2sn-_XpsjHZI~kf znQ!JouIe~`L&MYVZWL$fRi%F|gr+^!l=cyYK*dKsfMTVfGasjA3dqAykKCqQIaKcZ zg_Ds0Jknh){%Jtc@@Da!+oa!Mb+};Up$iA~IL@{5_l}c^alm=sTngNDajZQ^FoQ$y z87^g8f7N0S?mf>CYyiw2<^y8_vFDw;SU$qf)aGJ<(O6w$;u^WG*YzG9NR$hk;!0#d)v!&bzLPNiVn__RuJaA>=ioIS3B~vmy5m%5T+J?#_VP*(O6)p$e(LFjY&M9gcPOWnSQsr|(6L zv{rmJ_>q>5c`!RJ@$hT22my(EhW*ZgQOPEvT2if>P7$JhKcKm&SGYuYDTIoHzu(J= zLY*H)aLE1e{*Eqomq*mr`hE9sglD(l+-bb=cS-G7>(Y@^hc@&Gy7Wbk!?`o77J7cjkY(gDnWbRls^?@Yt($xyc?MXVI+KC9AOX z#YW)eSd9rnFn#xUjn^t?XZN+=RE^*dwP<(ECJ{9#GV=4g3aS ztkzlVvCoiaAD9SfrelPcZteG!qeO=Dhbh9bp($e(#W z{S-nTPH=2ZNQ!x`ZP6Miw|gSCF3}Yyp*bbKciCupC5DB4jBLI8qN2`V6Z-V-|6P+% zM1LZcEoag4Wb5kAeh;}Me~X)vtG0?zEgm11?u|t&?(eXF7lZRW$Gw$WRlfVHj2`-_ zA|ki!xGR>PwuQ+WVb(V+RSqTAErk_qXDWyLskW=trgA}@$*uXlRLApP*``{t`jR1G z?)>#JJnZPJry-#1{bTUnq0{$sQ(FT|#N+3ksU*~l`E-t8APf>Ni`oDAjjlT`cGmyk zbN?OdF1dKS^+LKJleWz8+f`W2ir+XT-PE3IYVKTE7(v)6*P!(p2?BF71POz}u6aoA z-d8d;?O^-$SbA+zKpqO6?m{!UE{C{?2+&t$eKm{Mx!ahk#u~DADUag<6UF(C9qj#p zjyglwb!#KJo7)X;62#G@P;#=*vsBH)Aqw&Q;i2fPV;4LGG-m_e;0i>N!U^3rpWHqlsKovsf zZh9^)yW^Y>Y+>NXD$qARENrv&KiZtvO@3B`c~1{Pp^^@fa9@R3C}9GNpw1(sflkCK zq4pIi$YoMfi>z6Q7?GzrS~4m9I!>$1dbHM4VjK0}jLoj31LcrHz{x_H@Op{WH|p4} ztl|_158dsJM0eeKp!bW0OpvL`U#DQv>U=%O+=7JfgYWZ$UsQg_mQ>rr#f!wO#9}gX z*=c^U!DDKUD`!3GV=UK9)X8YDd!KZc7)llwiQG4ICM0Hfke_1H4!wf64y3CNU{X$X zz=GToxPWSOaCladwS#i&bg9kEZ@a+a+idB|_el~D!^U2}=@lF0OtB<`j*AU5>a2_v zrIDoMP4U#+GsRTT<9BznOuIF8ZX$C0Q6O2lB)V1vNMX<0g{yK7YOcP(Ac4ymTxWUz zdaMeIlrpu7o!-0<9468zzrNF2m1e>^T+umU5cWc~)$R##7$MXJ+YZ5whSu8JE1~a( zhn;h|&ke6;@%m`6^H0s9@P~ifT&AHa={AQe-H&OcfPIAgswJt z76GIxhBBFd=Hf{sdSG(jQCT}*pygk-F6$2$ijl}_pVNY-gB z>gCI9I>>%6Gr`q=(;*A{c~H%je#Aq8UJ+-#Cg(uBCYU%CM}q>6oii1%(E>1pG~%zg%GO2sA`R4_jpm=ynE+al`9JXe!y zKB&cqfgjK(r)IWN53;S_7KL1j_wfbHq6*r^`)V2mjb-l7i zcvm>!j(u&7lXP1lV4GiI_DXWXe&w8G7@xYPvlCHWQ#(k=wuId(w^Z0+m2Ft9q>De- zfN~61g>3#bfYQ{aum3=u66OMxQYA2QYD-Jt6~Gybx%jT(&uSEnBs0d*mtC&b$;OA` zXJYBmMtNn9cPhRiX-lSalthmGgg1^^SIy6mboPWL%)4*>m~{EMc&T`x2NYk_A2~?? z?a2JRw;Q}LBWok;eupdEY<%bR5=YU$$&3h>l=Yc&BsRBQ~C+)vS zb1&wvRF_Z^U-z7l4sCeklXCbiP#~}$2Qkz3HY}TBs<4{`+kr+eEGL~@pMrVr+rr9Q zBsfFC1*jF)JZ%-@C9iQ`ay?a@Vd>1JDn{jAzz{bjj9p6r? z>|F?E)4ObvF-x1nZca%q;n4B;ghDE&0i z+M1i#C{vH0!F<@ZQ|q`tip>hozKlT610H!c#p~@K7RL9Ha|e9nd-}U}`4trv-^Rj+ z-FBS>kO!+JH=1#!WiSoIM-nOiA4SDL81H>^A};S^rAkkqS+#RQheZ2yOZ1Dgq^{T{ zFK%XaX^2`Ax$Ao+K-pq8vs!``vUD@y$5Gy(*LA6HH29}aVd- zME3S9Wri+(8(QDzMOy1cEwM&|OB3C#ajnNkzBlmQ^Vt?_`Ql;HmE*GUbc9A58hW>S zD`%cLhC+abI%Dc(>6A)bKW~9~V*M1pXr&h%97gbEjpDJ@A>u>imZHW7ZdPQi8)I8*TyluS|;mV=m;d%#@|_X;92GBMd5|Pi(Q)+)x%_q01ed4x@czB$M{oS zGi};|FXfOHuco1}Q~;|LB)Pc9wF)f~qan8{4Zt%?83k1eS3p>5N(^g(IXwlXQ$csO z!kQZ-M%jvb0ZdAx9&g#7BH1hhm)#bnHov<_TGz=Q4;x6%bh{{M3Fyri92xsp>&+&6 z%Su8@M7+OcD{oL`!vbdBDf!(8cpAh0#4_E_>tqPy zq(RXr=`zd0pvzD0`4vrof=Q)9WlPiVkyD`4j)@KqEqp@ea2m$T)PQ0w8Z$pyG&8CX zLJ|r|EBD>0J%bceV>JN@@6LZ+c*IE_?u#%geqR11CvB-{_34SfjMtIt57KAZOn-?s(Oi6mCE zxj$%q7JvXC^o&NIpUO8CREv0(gR`j2bmrY2MLoJ+i~Nztem6}l|9kDsTGJJTo=>h` zu2_w|;!ZK^$XmVhOd*9mw!Nt6A9Z;W80Lk#AM#C(YN$h2Rl!{$yZ`yY4KbcjGTw%& zox=V3;no_$3Q_TQ^Qr)Wh%?0gFJd8;9K79=Wy4h4co6bcPf?0}cAglYWZg~MKOLwb zl#wFk#|#afM;D|DkaJMk^l55yHtQ*`0HVt)O)NAN;&U$`f3!C^aq7!SGzGurq9Eg* zisA7E$F@RHmX7~@)ZG&Sz1NnQ9`4M&rq~EpB7Le6V83Uf|0C^ zp!D=!04Q%{3Oj;gj4()?BA5nYSmfG_Grw4Zo|`ko@PB12@pj3cYiUkq zN8-ONvgUs#xsfKaj*IO%_@1MoTwwmphpNED1Q0ZQoujX!?tNlZ_xakfHPVt~oC0=w_ zxo6nmcs(2Yy3PLwnU;>^f45 znb}dylo-B15t|e{@lZ^CbK6vR+GB@3UIOOFiw$rn3U#%y%mfQ?nL@X3Y~g*oUi+HT zZli<-%-5Sew0HU1U4iaIhRz;)N&H80sW5qS|1%61*m=Y9J*(5{hE3A#vkeJbeHC?K zEmj)c)3$njmWQuZQbc4f;yp8hbuozjNE3m(S&@!C__^_DoE?ka*GG8w7% zTF#$(3LOj|=X=xv0FRerQ_ii%e`m0cbjP33U3ZZpB6kn5{NU5r@~JM6MBjR`wu!ds zPbE`rVO(WvuT$|HR`%2co&L(irIx7SvM)gbH;=pj(Yd&ZKJD+Cv$CyWe;m25#_x>D ziW#MykL9Oe*Y>?W^aYE6CbM}(Jw4kR+Em?dP7t8ok49-by~~a;YFSm>5*rK$u)aL; zH1=p-Y*7r=DIsudE$zEB*qP@`aC((%@ZjJ{D_uOUV>Q|0V-aXmvUllvhInHF<1-Ey znye2p*4ubed_JOYMMRu-x!J+D_@cFda{}~et!RZR@DGYp-4N{9d2wl>kor|H2I zE4gQF&H#SX!5u~f$Ee)g@u?()5v~H81qG$hABIuwVbOtUdp*7qT8QT?+|qzp zQT81g0q4+gHMY%yp+z7p2Pr2%f1r+V&U*Q4SIQRId5mB+;r&d>L{B2Ur&)Ssdcu8i_)jkkrnm6|fG!*BB#p78~8C2y{nJUg7eN%}}tNWXGG5H7xdx zCsyr#iU>*0jMQZ1(Bn~`jyzC`M5X6(a9s*&S&Nl_;+_)s_UwuqxJTEQ$`oIb)$A2o z=hq6%|OrRg0 zCpamcfl6)Xty-)Xwf$$`_{}0bX>0TpvCI0!A}Z1hAZ6{NrofUMvroZHV`92`lc{iE zoToHOK-^OBEo5v2()-4uVA_m(X@Z|B7ln9AvK2y}|U- zTgWiM5S5WCP+eSxaOW2AN_4&+!80;4L}&lzBdsl*+lg1rt=;1p9Y5O`tY3rNACeis z(MW@%kQe|;YK%SYdk1wY*$z@5`_qS&PeoGxp?S$Al<&v`89Yq~$)w{}LvA$#B zgl8So2=O#b+#no$p@&Ow(@se=9eX$|M0TRFEgDs)-iJs86=$K+hZsiLcLg%BvNAte zKdmO?`pQVHIRL>i0hdZQ;QNBsn)=TJ43U{Nn23$gaCUPX3=yT*goRVjS0=JLAINue zyixY5Qh@^(i!e-hLK)s549QK*ud`K$jLHkCwf&dmR#RfW&PPq0lcdX$Wv3MbFfg2d z_*R&|Xk+i|O~;+%flwZuy~R0HxkyZw@!0MIT@q*`3sb}OBfOm=#rZ!`ftn>%19pP$ zNQNVRO!m(!(&09{WlVs&h|`VCQ1ep3gJT1)8zx~9U6=x5SlX<8-Evx2Zbnnh&T6~{ zd_lEYzQ*Ne)9iCM+vHXj>Ran~yA7Mk2DgnS_1|&9Yd#%~`%DmuUfInn%N;npjmZwI z_GD&X7vLaPC==+8v?1doVq5yET+-iuSeu$EPfq*X%F%&ouFod|VA~AAXNuk2{9P*O zDwcQWH)(X*7~ic|^Ok_iq31y2w8JHC6ZS7odo2z4mr3yCc|lsojc5}vuyBFG*J+)ck~hOr_^c@V??6p zqTSKA3tCc4ns_T!?rnLVdV_=9dntGx=+TRQ%f$1{9V#kn77s-eksLewFZ3%=fJ)7Q9-j@3CoGEV;R>Z79J{W#9ZM{(BPe z%G~Z?XlS!e%`Q17YsK2kf>}X}tYv?MCrFa|?P^L5-g$PQaYV0F08=?f!&6PVH+nP0 z`d9enR>F;N=fdlC@qZ_Bs7u{sE5}2_o_ClC@}1Ng)V?Uz^{ji-;ZR?_eG)vbe$22J zz_%m@as2^yY@S#`iojj6t!w)4HM~nPXn1Dq7&p@*rHEBlZsrfGuLoSKW<&wvazIu_ zVnK@!$fzQ2Xlh{wOA90~_x8IGp-=*&4ZNO;)NnQ9^ACs|<^C1E)*{7WG>Z5Re~i;B zlW-o@aGbWlobP~t#ko~U-Ue#H$VNP`#@ zf)Obs_zz>HS^-bYG>&?830gtksHU1w!vU_Q=*O5UsI`>vEg58`@(6DlLdP>}^=vNx zi|hUSvjt-6`P109g~07qjV~TQ0%*kQg^&VTQ&3Jh;9t}O?3*Tv*jf<#rKTSQ`w(cT zPmHDfH&W&%^kW$BBi;YW-zu3vpSsLfGsk@H^_>u<{eJl|6k{*JKUDWC)N)&`*ufmH zKQrdOV^SFFOY0Rx`~(^(LH4Ci7=`5=%hg2WJgVeDntO9Dg)gSAbPV^Fj!r~-H?(o~ zK@+xRLb}>*(l$aCB=d5Af~3e?r1x>0hui$zEJL^oH=VASBk|25sM;OKE)jO~$AjQb zAHTdMLu&XaWvCfuAXt%`J`5QoLV15vt4lUKv^bo@KwJDo!1 zrnv^u(3Tbu!4zPYNbn2NU1bRa&9zoPS|{56d^JNa=J>aPe1XqrW&-r0eObubp?NP= zUJ*X?pYJNe#Js=IsAJmLkOTn&O7PD=lTn=@(uP1kak77{<7(0O@qq-r1Mi!~?;5rf z1Os;%0*;gr%-!ZMV&%{)W<0nSzIxHd%e;W()C(6b&cDR!3uZvD4g$VAKVaBp8Trve z3-%7m$R6$pk0){uOlJoe(*zBgdpJueDG_c$bFpQ z@py4W1pdAG9xFVCE?(0;G>>cHw}`^9UwB8BE8;>06tk=xHppW<%Te;s_Q`KQW{#I{ zIN4!EBX;Un{_a65h|QVc)UkxgQWY^Sn~Xh2IFw)57G0@vL|uyfAK=Z6m`O6QodbYf6h3)_3IYGb32cgOmTki+@$CA(wjHe&z>gBcNKC@!ew6wlFLTl zgS7ZkCEWz(?_z5PW>r|vimNKqJr7T6uj3;DHlS7ddnr#Xf-)XS$qy_ea&v?g1iHhF zP?2z7av{F& zbr&a__K+V8%Q5tPHy7aM^tu_idaxdP=OqK*eRvWO_A^)CRu59G7Q1|+)$LmSHY>=z zNsw3D9*DNmEp)xQUk(NrHJYO@XLDfs4Jq~d@9R|q^||Wm`RE~Z?n#_`9TQXP7=4zW zuur1%G?4OtPeWSaXpY7wBk0hIM_RQUuc}qrE-Rc|2)1;%Kh>%$m)3+X@FwtfNfEM>4K6jcR<6ihp{RE9)jO};-XvRlW$2~X7t z*$lvQVJbKpW-@D8{%k2lbVYE~RH?$geOj#CfxVlP8;d?72YQ6KJU$%Pv_$)K56e_{ z-u*;H-Eh0b|05xCQdjar?;O&Mw$wnK)p&i9e|Bv!p0u_j?UIJ@D-uynN{LE^TRFjd zk!mC)oI^7md-hhFqK%KQ(>onFSi08{<;b+X;=1ytcBy(nJy}liYd?8@7y8MHjr}Pun=X|BDLJ^+SjH=;s*;eQ&Q#L&bQs$gft0?gbN7ZGSoPQS) zS#&@jv&kS6yDb}}g9mLhRSYY{IW!I{T90&7)IM-ZMgkATUJSO5BO=aT2~udk81!JM zZ#qXo*=Lr_7I@5MC`^dDPkGrGT6*)*vSWO64{_%xLS%_hp@Y@hj1YXS&PU zmOjC+m2!|FxyB~&Vg{lYH7fGUWGU5pwPD0H+16@VwrZUX_fj&QGASXYjTxH{G=Mb77Y%np)~Zeb$k<2$>oOWsn}p^K+G(h>}k-*BGJh|>zDWT`xW#<#&=~*<#oaO-Zsn&%N z^Cqd@!u)$tj2TiXa8@G0(E5C0OLfMEexH(OX!`di?>|tZ#QB7`$1?8An&{)x@w_-V z1U8LT&zkFfQ)t!K)r7XrFd^J(De&Ox;MKR^hHEC@8<+?##Oj|RVjyUQ@P1b**iNQO-*mIc#lTJoyJkO#3P7ekC4__?cC`spESyCmNP=8 zxTMeI+9aidlrg)9r@6#e>C|A@KZW2ETbZz*v9@IGPoQC7#Ta%pZzJ=+7eW7Hyekv4;q+d;5K6e&UzjWzx83eV<0V z8I7(CdLpC{3V#N6l_>}p1&c-DBOJiW8_(zomJZ23)A@tu%-)SaGIG$9i^&@(#b%9?w5)m&c!p>OY*K8z<+NhTixeSN`G&m3r=^PZEkkG zzX?jtdP}U?Hk`?5(oBQy#}T)h);|5>_8)Dn^BX+Lxxl?k7V#bI*Ghjn#(yKa-r{X_ zfaUnUPYRs7+E3mGHO^Z(2Tj|~d&qfQWlKSdIlG#wmN=KU>X~kzE2!EzIehQEOS=CR z?A{;1lc#1DG?UqHOLv?pYa}>na2|eUrhN?DuW3Db*y=-i|DM_7 zusOJlM!`=P<+)kj;EjXF%&vI85Y~aOo8$Whc9q+Y?x%btx!9t5H|;y@r*FSOYf`Wd z3?8~f{$-f8Ox?xaN%3ySX+T1r_L(85IkWzz#dwolr6Q%tB!j)?#H3B4Oa@-!#p{#*Rh*1F1EeG$Mv-&bhq;KTPHOM?@HcfO`~WVO|zZZ6?Uo=QyJ zRRaUajR3M*9VD-z{KD8>`jw2+LBPUu)2H8X@gQY}WJuNF7eB0PG5b)4#VXn~pd94b98Nm&( z4-wQR@$~0f6(!mbKN5&z9}4T4Cf6?;*&x+km-?T){fZ#IeMy@BE%zc6DH)z}{+B|D zrKa_40qRwYcm~Q^D{0Mw5kHC;KNeXOCeK@_hHuj`Our>_6 zMNWb5Vf$CDHYH)dclPHvey&i>c+ zGX~18;p=1NuOU370zPqPY-I7PO)t*fRzE%dRuHawXhPW)Lly|6mTM1>a%I(H*aL(D zA+-sqJB{VWPxl@~#qMGoX*hrp7vElgrT8+0_B>Ml&DZ87wo&XS+B)dCzE}*b+}uH! zFwgPPwvV1oGD|nPajaF=188@gEHu)~P|60Dh>9kdmY?eJ6>SM+$W0$&=$GOE0lxMq z`XSesLyB#(DZ1rQGKsdoXfqB>55+`Sk>mfyV-I_xOAfABWwQpY@t6-*u_Y045Car) zJ}tN$SfD&2=z3ApvR0#!^H^9*{$_Iy&B@vPIdnA216(Z!EKD^yiBT0tHl|pF0j34onP9G)A7Y z`)e&d1=TF3rV#_fFgT@lio{gTY0_e1Po8BiD%P+|Q|Ai>wN_|Un&NIOaTVo~?>B$R zCi5~MHvQmZm(@M`JC(ACCg#s)kG##B3?tPBXj{Xjliw~(zAnL~G5|CMkDt!Qrn^km z07<&)x&Rbnlnd}a9=F6`7V?q*De82@G%l*SfufG`6!W~!Ke?YLysEy>y0>+Gh8K*w zjBLU6JZ{U#>H5v2x2_KdPV^4nTQ2Z-uV4q(CN4fGquW#thIxn%3oUKn1!=8ZlPYvn zJpH1G#auKj@b>!6RMwqknKY(L18)pI{iZNi@(~L=a8p}4NCZUI z8VLQrgnRGwQk#(53fR}^LLDsFPy?jkaLP5|HRe!%uvQv%G4~=epm}dmJB5vA+HSnH z-iXCg#Jx0jJ}AfE0?t49?+45GpKaWI9}+Wg59doAG9LPm(Oh}2qopsx+q@+2_+P01 z6LSEyD>~IaS6-pxO_|4J6tAzN*q2YwCoDP)ZOLrwKd^7Gsux>L6bd47Uwag;;XE9~ zZG!8ajk9;7AjecBZA~_{IyG#jH#_Y^V+aUlO5eSsZ&xZEsPErKdY6`fo?t4o^Y-F3 zv;E1-nS&bXB&6eVd41@TX$Wusi-FJ$99Oxxgw^(C#$cWy^gB;uPN?R#0cs`t9l|9c zLCRXwrOyp`WS4fUqK(%j{`^PX6rc5ySE3ilH6$!d$L;wzVeqjN?7Xw(vD2a<*4XOy zD28J?A(MSz6p-jp8$kN&@(&4I_=b#qmCbn6e*ckwd}ZKS33I**+t!Ms<(U zVGQAntI)U3!G*07V&o5r+9r}dKTlg@H~xG^gGOEY|IKjqjRmRYiFhfU5ao;5XBFB8d8KhNUD?yP z6O?9%ne$udH1#wRcj^Tm$cudoKwr@%AjGRX$3rTOATk~!SqyIh)roPENkFPse2(4n zge#l>QM8Fni#HjVwfUl>W@959SCWhQh4xWnq`v9#r_a4ms_(C7w8xejWXeFWzQc_{ zmA(Di%<&zUQ^)VS2hEy2c@u%Zop2=|erVQg{#qrq*BXaKFtBlO;)_t&A*Wg*dLF8k zpy;i9&6gQGsxaR{_Y#gJH$mWWqED^C8*PeiZ?yk%+Td`d<%;T%mW+)F&^U za<+mzClJI&LFGt`FE}s8E{;-hGx_A-kT)*^hdsW&G5|tYW)#d2gudwo%Aw-I07Q5v zLn3`5#*V(zJMedK3ETE`O~Z=KhU5kwVQ_|>I*TsLG3(Ow!hga26Eo`v$_;E-UcTmF z#Ul<#h{LrJX$X$C7Dw8}je)cS!tsc6Pi6c@-P;F8%VmY%=MfxxWCMZ*3hBG zuD41o`rkK2a0&R1xMaTGtI-N)-RSEq-CJAY(|7rqB=0mR<_wQz;KUW?JJUkWQQHZi z@RhDmJHK+#nK?Y)cgo1eVVr@E`MODXfL3Z@nqfm^fJ*X=5TfItZ_>j**O@I8NNZ=v z<0@aWj6KT%8LYMzchK?NiDPmPHTK?1g({1EFA$Gx79TSZUgPe>p2vF!k4eO4HQWV` zsq^e&`4L853mf34YY~LJT^HyB%7X1#-K;%QD3AK*OfEI))BgN2ko@?{)j~LwEB>$) zCP}t0I;miQ-^iOPWz=U>%ukf(GOe3~;@R@fL5)=kh0#LW3g9%prFL}H!Ai|OQh5>G zfl!R~Be712a3cX}QqRWq!lk`5{*wvdX!rsxxm;opL%o_OSPD}n(;I&67H3f%YZ(%u z7qsKpXi9p^GSfip;bzrr?M7>ja>n}VhLB^jP~VH#)%pBWBQ5j!>eA!aTZOxXa%_u# z&{A_FK%(ASpgKc}*ZwD)F`(R3Hb-%?C!KnG*{DB1x&az!TZQ{I*Y|Cb9GsyqvT_pA z9{xqhCo!j=WjWlDO zZMA@-sVcIxX0^-7eSF$(af_Fyo6^biZe(Ex!3~F5eCAK$*}@!j_=G?C2r}dRD<~2) zyD>iskN@tkl`_Bn>`Zaq{^I(oA?U#6*?9GFTnyCPOlDD?AmZ{&xTNN3SJtVJ);uez zsF9GRh1Z1C<|n70gMD9_6>$2$_7MDka7{IPQ1pKxuWYV*WulysgK)>`qyOdRz9(d4 z;MUU-2sz?%XyX5zae$vX2EXkDZKj?>isK-c6Tpr{lF>blPrwI8c7$F3Zy|1V$)~7a z1{=(4Cenk2H3;PV-U4Dg|EmRJvkX6IxduG!}&Dzhs>QB+=*XJ$T??JXYh80pV z_1}^TlNKOK2BW0qw{SbR$pIzge!)h~T=u9EB6t5j{>xtyY!UIBOHSz!(AI^NRrTZ% z61^_<{YN}s16_~Pu(R`2b=?JbwLDMzX6c3oD!0bufM75m2}~MZVq@Ey?>;d0pM!ZC z94+JAi{B>{YI(@jrhdscwi3+;)c{2>ALyZ0x0uvvX0bFJM%{e>==F^?Kb_sMf@_kG zJ7C@H-PxaF*1gHjW>E~cVzw$&*DMq0o3c&T^2^69OJ9HFVM8qGeZ8hyDB+)H>LS)&lJ zY4`)s1g^OQ-t;APMN5VqZRmUCL<8(LQuxxDV_g25KnxR|Z14B)J}WK1zoi-Mj{f8f zEC;c5;VusLJi?sw+HEYtNXEJQcDXk>8&fbLd1X7O@M_;&Hp86_{mOm&*Kt}7b6=T$*J3EzvO9d4yC?!K%ydaDVkg&ubb$Ztfo zxEt$Zx~Eq6)eC_@5iGT9L1D(-6T;gusY{)+6`|m(p!2jX4S#mPjfOg#fn5z zf1~-6Es$f~Um0xcs4i5B5MiY~QE<#y0BDtUI#Hx9hT16I2QiIR%P``x(+4@op4bd! zEm<}liP_l1v-+XLDbgb+wpQGFfOKtF=#Ly2Ni7<^jPVWnih>;4C+HV9jIO%usDQq4mb8pS+lN%OP(fr~?^hKV488N!$pjtCp!Scp@i|U@-{gezGebK!{eeiN z2lyFKl+D(IbHf>wb-TG;;brBa5Da2=otvOL+~y+vrZ)ccbu`F$D{ucZX?pPAR(E8Z zhI5PFG2#Wc1Gh$-Aw3^iMGBp)GIC{SmLXPzjPh`6A2-oOYQm%U$h*Ce%nHc}Q%H9q z_G#XRRu33PSzmeJgb`6HQ~YYtOYz^1+HI+o5_o{<-$w_DmerISe5sYq4}AOCh;jpS zoPJ)`r1^5=fCgPCWWFLN856Urj@Zq{eo`vQ`Z?a%+4&RuNOSz8i|oZnLmL@9%eSey zQXk^e@jcGxM@MbVQOZtXmjdUp+)C<=L-dI;Ti3#93v{h?AXOV?;N1(ib!>m;#KY@& zS;Il_V;3BVJgRt@g6C@UkNAe7)2eGj=O3oBqtQ2$S2Q%_9F9Y4hcthuHUIH#-5k_4q!_ z$+X(J!URWJ)|4!RE(q*j#KRa~R#efdT8y{HNkZ)raZ_+vpzkbVfp)y!)jOQ*C46(v zV(_MuipF6t&E;vU7gXv0;|3`?>TUpro9qTgbqf^K>IZ(GxQqu{V%=vc{*PJ~W7;o9 zfAe13ES_@dt-d#t<*A~f&Fw(+*q%Kf>BBBsv!4&ofikqY^&4e#LZF8v$1f2DjVriX zqqS+PAzN>0hkJ!knc;czh^FFcM1W{RkXauB7!l9}ZFpdO8!-_%DTY88PzhfVs4R}d zXI9=(xXSruw(FSi1P2vNg}V;Sphj2yhu4wl*dIZ!H?^Ruv7E}?ic*u)Y;Zm z;hZU^K62@zOiW3&?u8hNvo4~p&FXnCLaL%;V$9Bt%gb@uP|G=N8w;f_?T)^EvUqF+Irt79c7&s|U=sNR{)p@@4iYB)rWC=w-4D7eS zxzd*m%a9p}WVX(T=nLxD^1i{lBmuz!>8~Ua37iE94N>pjlAjhvI>oy1MZRM=!C>Xn zA3c00j7RuWxBTGMQ3YGf5SsA-ThdH~)SE{X`ORhDj`?KTe2mhDXyDI4N- zsw7B-Y@qKp-6Ji7MRi$<)9GlYbLObZDDhAvuNr>+mT28t8QDyV#dxT^>=1vxWc@)h z?a^I3l^yU}ju9gFJ6F$~GgJ+Nq!-&c{T>6K{KE{ZMcm~t4+fkgGm$deblj&!fElPN z1u(z2yAXYn$dJON0uLVyOcqe}b55)=t;Ao=$8E4+F_j^yWK8-%6Hz{}I}AQFQX(96 zn$rfI{!x201>Z`{p~U#@E@+Srcm&kbZfhhaFJWMSt@|vQ)QyPIH`$KLp7r2Nc`o}t zNW>>t9JaoF%cS?Ni-XxrpI`O*g(EW5PhT6q-p|c)qg(q%vt;WQXk7TYqWIgQnA-K$ z8cm{UY>yjqZuRK}N^LBZ0oD@UX7~o9ge&I0viySpy2b*Ilon%_S|NIYg4??cD%P*x zj%U`A@H$_^ezY^r=Wh9|~NebZi@}_`}kY^;$#elPa_jE~TIhiQy z6iVRzGhje9-`AJ730ou^URs~p7ONK>T#8+~DWxM|jEC-c(^A=Fd_bHFr%?(W$(AcG zrXjCZ>o-_zra#_Tyj>8d7a46zYd_lNG5CPPbuzed?-Ov}VE0Pf2gMCIC0bqHdh(g( zHSR|T@gQN&1dGJKsju+W2^RLuS~>Pccd0Xkj&^ag^rS})CNj%OaoByaFONKWk%^-tcAgy%8M zQ)o@ls#hDw5>1och{-)gH*?Bh<<3g~NwmKXYBNm4l2}LU_(SL>zklRrX5R&P2v0B! zcu?gnS?QC|m}vJq@TS@=^Qb}}na3U!V3ptlP3ZWcc9g6JW~IET+r^R>C~JEGNPy%9 zVXU5Rwq3-(ptpN2^j%Mi0`TWmu}33WJI#qpNPv$y&)erNfciMma-B~WSs&e+N*Xc5 zxKN~*T!L3#aUE*Lo$Jz8@Y@P!I)50XcJeM|$0C zu^@o*>REE9WB!B@AX8Ss-maCemRO^vCGEOgbtNPy%=y^rT}90v{!V!ENz!zs#aCvF zeXu~e<9c}kF<$jK=mv7g6l7(tFxR+)@19PTWQ}oG7$m~Qh!O2l>QHA|&aaz;={|}%%91IXR-=WyC z%EYJ1*RsNz0iU7oTewYg)TO*o93C%};242f=HKeAB1D_ObzeB5WBKy2tO{Yr-{>Zd zaycpvdODq*M7)2gmIOIvQRk$vuxpQrIJ_ zt$cJvTfS%FbEl&^Fg+vCw;#~5q!C)hJPU1Go8ug*xF>a(Edw;`EwQe;md%qiA>AZX z88bJz8sDF`hWKvm6@`UazXW{LbP%@cYZ43yb5}Qg(!`9*bo*|8`po3YS#A9#3s+OhM>tYd(WOj`V44AN$9fGw_oGgt;Kc5K zE5&Ncm!1U=*Gs=9yN*4v%b6EfQoL;!ya zAA8h0&f)ioujBDjY0PyeM_TH>hOOmJb0lps(vc79a7J`a)v=<;%fu7we4sT=C;|RLty2VNmm#Qr3}U-{YaJh~}A-EJR|jiMmk9w$f69wlIfc zg@tc!-^=o6{b3rd>|EdhmF|`|Iw9e!!Y~Gh9_LPrAFMgYQVkW7sX-io=;cmIX-$zy z+u^$}AsMq}jJu!N%~d#}mJvgU68yV>Av}ryBu>lViy3V1k5PPvwiCAFLLn1D_Iqdj zzN2KKegK4)GxQE)>VjyQr@XNt>FCv%>r8*HSrqLh+P8&7#BweN*ZPtw%4U~xoJ@}Q ztN8~m@IClat%|Uk-Hy)f-WL!Mbwi10)vTGDFi9^T3N~PPKN=Z7eB~I0iH@uLV@B^f zV4h!Zw5*aOY&?Hxp7=<6UJPJnPqP5TWDu9fxWRHtef6NdC=I<5Hz4>PW4n+q;g3G! zN5O{HD}|1_Tx6-A(`p%iqxfKPyEElsPiB+GR3LRBEO3{rua@RJH%Pe2R2~zQu5ZYr ztGhiFveBlyW!&r9^T8JAi14*B>t>o7lN6 znn0+7NR@-{+#26FWs`fNof=}Ns13?jyQ|-&15+|j~>-4ww=kJw6-eYHgWNXyb+Mjo5dUZWrtUZ+EbAyl2cq z9FG*RD(Z9S-Thq!DCAnK!vnCjVs%MN%C+eRnEd%30#E6Mp{-hNc3B*Yb!w^vM>{6h z9UxPBw7Epp)v3>T!%{)KH#;8wT?t#&?PC1Sx%I)ctPO7ysmYeOQcJaed{EG7Q~L-7 z9e1D`#O{al%piFy2sUZ=pl?q3Y}#Y|{ia-|C?NE>3GK>p_CGjz6hjP?14UFx_my%6 zdtzL4<_*QxAP2F@0zVhgw@|;0v!={_%|BwMAB%3fn5>33No_q4|4^)=2EhVn(RKsj zx4wQ`(z3q9Rg&)5s;-40Ic{=EjU85811pk#p$F80uvKGqk<)po}yM$k5!s|ns?)h08g3L{YSCP_0 z&;>4}pX*0^TAKb}cvOV*FIjPT-8=K2kg7`?M0e!pmF{<*vZT+C-kYv1o&qPt2{}GD zg#-MZ+75!p6R@P+&NX5-!>ybZUiN>A^)?Phj+eZ={@dU~zV{nDGxGuMmzxVl)BHCl z3Ds{xVU4>5Ec7oK?Y&pbcPAO2m=OI6ErTuk&(EV>&j_K)PgsD%}+$Ql0Ct*(Lm1DDS#wE)@$Sot#h*}OYG#6UjteDJtP z%i@zSOy_#qJ!;~a=z1>W*yp3ol}{cW->=GIZgTS9ft^3ythWr=9M9JVX#Sy%{h9dd z3&HhLjofH5AMn-(zbsY}=u#uB<1AFk>uzA}9ul+3vY;0$>u$q-;z*Tzb_ywo z*u7NGN+ut+noPKcTD^3d%GPf7b>7W7TBol+mtS_Vc#LBG!<fJgjGM!y)GQ;2rNvh^LEys$q7`Sh`qZv`hLHz`1pXS$sv|e**L98_~v?eRR14&nlPJM%jH*g0( zV>sTHCLr}$BViWtI`{=iooP+-h}4_AhB4`*G|AAI`_dLujo7e-OWwzGU?EeF5u1(v z%%QHzsGMy&?0?*<))9Ls%w@?2IBP(Zh#FNEwAimCwIF~0%A~|@Z+T~@+sDm(Nfc4{ zVtTXG&2vX~HGr$f-^4+;f~>ytebeQYhz@qm_Pc~{q+DQw%Y4)UCx^i-9l{7z`#gf= z6D^Lh9N{fTdy5haOqF1Y5kd{zSiTB1YT)v;LZj*BzN(DILk4a3Q%P{xpXhidp3jZASsh0NRj#8=qfOoD^_K$CFQxZU3Ux9$%1wyPC zGod{Gkuyt@W_GGUGo}N`a_9yt+Y{comM=&PiA&c=vx6w;nAf?uu)#_qSOH+eiHSRs zDolxx|6k%-vAe#qqR^7mSZiyU>ktFDTru#TnLE$IQ&Eqhhqp^6D)p7Gq^ox5uufdmFLrBc8<*Zo&UsD3AO?FSJC$iaZne#+3n@4L zToW(WqyyXAS!&!beW2kgGuOFlUA#zD3gMpPmBhfzun(!RPm71HoH;g{I1BS~SUA%3 zW@9Bsd}_-HWKbYDFZy(&E+;ihad0mx^H7=h+FtVS*y>V24Er9Wcx3W@fB)(0h0E+F zosT*?qe7P@=9_)r616hT#WlD<=qff%4g>DzC4#vCn~3RSFH-au6u0e~1VLk}L6s>x zB0Z8$a6SFIR*RosT6Lrd)g5%X< z($<_7Wmc}~PhY%)aeri?)s#9cFS&HIFP<${Mj^c5Dk;&h+o*?8=~|>dYITP9ZNzq* z5O@PRb>zyLwp24E|%12yCjqd|Xy za!?It<4RjT!MeR->^FUHZ@kr<9L^fDiAff(2`ZY zqgUlC{eD?YcY?^{T7HRLSX21q5C#s8={ox_{R{eX|T5u z*-Zib)}h-sdNg=NOtptX)I3IeJbT`m9bJjl{E44+QV44w%l-& z?aw6C^^h3$ea8CjQ*F9HewbF?N~dAC1@^l8$|_6Kx0q-MnU!EGf~*|G89fPChlRky zpFmuo<UN7pp_NowicxWGfR(GUIs$JU# zr`CUJlHy1(otjt^h-wqqAl>^7}8!rSo1Nfr&CyBnic1e8!`JD~&{vRCZVm zf7$j68no29)@B@P+)8*hP5h3MIVnY(C)<rm<58-eVHI6wAaA zX^C$MK}m1Mu^jQmIuAfXKK*=&1*=Jft7C7ZNC8XC>+>?_t$iJ?6>Eggw`ymokIShse2&bk8tk8BxPP(9)+LY%Kh!DNd+P@#Nv-PGW9387xIHDuK) z?aw*F#M}Ri;y(|5h)Zg!E>5a~fpc%aPt(?sVQ{6|zh-x^Bd@+pB&)X;Qc1#C9;G2f z{U##P3;5i_ea2{IXlr3?4igwnPejMfxP3@4ph#Y~XM1Kqw|Xa4W14ZckSmUtzvYRj z5CX;#%l0Jt>XY-^Nxfx8fy%nC5G0I~)tD~&Ee-WIS(f@X&{rF{n>;|~8~ljblr5;T z2ZBz~tjA?jnPMfKSpC@<%JrVb?*)gZQt|nQh}4w{I$y9f*M=SMh}oA zH_4NzK%cWP89aWS2j4WieNB=bcvM3ieX)OJGeg!Kr=}aSoip^>7~l}V5AKJse8uba z)W8Zonv;!H0R2peB@&f*L84LJ+WG7-XMi!S+>{b>^OJkOeUAC^`ZfQtr_trTmU!{X z<@fK6-4ZaFc5K(ocaN?sV9=lFN0W+;-WK_FotEIRF@cehgE2 zP2;J|ZbHsgUdI->&4(u2(tH_(;Y@hr7x{KaxGkD&brlvz*WpMrs*T~AW#x3{qJr1+ z`sNw0F2287+JGojD^D3$_X%o*+ubnIen(L>`#S0fy=UI9(O)v@;NO1-Fmaob4SqSzZVX?D=X{&9 z6Ukf`Zf?=SKA}?daea_5of+!_S1SbZHctR64c&WZ0rL;(jjC z;(6Cs61RR2L1sU2L+EEuHC(*CG)H{fnVV#?d~&jho(5lbvJm8HnLqqLN8uoNxng0Z zzwAV_({0o~e%ZX?+~)ist$&0~)6v4K@9d^e>@b66EFRx|=aHmldve;>p=K@in$@w$ z6JV2O?cuL1Y1DR&kQaAc-;e%>RFVDg0}{UfEQ_;)u#khv&g<6*{cz+-yZQxqsRvhO#;UBbILUDwB{7c0z7yPmk<3sC25NiP>bMX!Ic{I#P(X=+^Ek1H*sSZ0U8 zILYaX*LI(e%)YlGJugbyDOVFtJEW3?shiOVss>hBY}xN^UgXF1q2L>L0%sMb8c9b> zt+64sGa3ZZ ze%2|Q=ZYaGXc@9=ioDT!?)2mf2~q3ge~fu-Pj`I-bTrx2r|%c_$F+lfQu(x)vjR$lw3v*0s|CDD`$yzJK3ZZ)>ftWfw#QzT9j73DG@z{7D=& zU|PGUTTx)#xHocwA1*8t!^QaZUAoouchcXwY$-i?=aKnA8H2I@l-0e9?BJLZs}f5o zANvBmI*F3$Xfgf5-%p~&ev_Z@*!IeJjIBAWZ^2Xh&6?ZsRjQ-pj!7wjY9o(WzU`qy z_;aiCbiV^3>BK;4h0*TCaEioVCI?;Iq>i`x8D#x$Y2ipI5gikf}muggbvlEKhVzW*_4+lx^J}>CwZ=DcT}p zv)Po+>vc4aEv}MNg}&;PSG#!2o{9!{B>EBZ2zqY6s#3)(;L_MeU;rHYFx_qyfvkR!4FwinYK8l^Yop^4;VJ z2={!)@3H%sL!9Dpjxj^#p=kSaN(_^L&S}EZT>GDtAFfah2yB;v8Gqj5asvQ(b#}eL zVn<4ou^#?>aictTqvVF>ti(W{#;Tb8Q0o&E_-dM5E~-Z6(ttQA?5DP#6py}TjNHzZ zIzUB^Sgo2?2L+LFzJM{pS3{9>)kd59Phl}aQD{wglFVoqL~MQ<@DPvZc5hSNwO#b7 z1ZVdn&HbBizb5>`0K5m6F>jChVrr!w%<;256+Ta`-2d)XAP|U+9FoD4(@nF_M-g1e zXPRfLVnjECg$Yj%H|13tBYjZ0rux(hQXep%ZiJJ>R?55IkbouGxx!52kGtr&?iR!-Qlab! z4tE}PjBu4lxcI$3dw$(ziM2}V5|9cFKzf?zmc`|BZ`4H8PZgNK#7x=MKf;fmSKyN&;f}I1M zs3E-c4XVV94)2h%e{`+5DES9s_elx<*;hof?KLMe0X_}hYA_Rv^U=+{?PB{|M{H6} zR7hKhGDd2U9YS4&`8cx7-}_@yRO~Kfo_6ZZ7HZ+sR;=A7Lo{up2!4N9JM|u`3~0w6 z_@tq<%&F9o0~qJuHD@WFrtOMJCU$=38F1cr@ix|{E#I30ODIR^AL(Rc2Mtc?JG+gK z_fCPQC6$D?k5T=X{x3pew6wV~j%Us0LD~4>(*RF{?Se-oo8*fP=SdgqNMK!y{)Bu? zC5cp#p>*gn6fYr1tuZ-Mq{^Ay|5oDeDL37dGX0a4yWM`U0g zT<9SZ+ypahY+d6;ooB8R5#%XrdnLa2rVQUbX1djUOqB4l@XghjTQ7W>B-1nGPHW`H zmUIhW_2^neChP)wp{QTpOm&DswWR;YUij_(^-NC<4MpLpTTRTTNEN8Z(VBQ4AMUxdHAD z#l-dGBtO`Z#~J_HVCjCR0hj33fiAI3Iow1?u(UiNDBOS9eHJO5TU&1*Jnrr9+{Zd; zuur&z&rI$N#hU+9-uRsYqb~LjP;DKq`bZI9<7VV*f}5U_|KlWd2={)v&rmDS>>m`m z`Pj=?h<}|Dd)Rpf_xmqbwCQE%znmKVm(vF__{KiMZ2tl2WA$I`w?TEye^cIx@rA(V za}wR$VgnumY>H0Z8cg4{`HYS4Y!pJZ;6X=KJ@kyZ8aY(q2)Wdy?nb}rF9M(A5=;bb zu~jVo;0r1cm+*Tk(7t;hA-lPN(vP(Ze!eRE99TEp=^K_4Z1!yiMP-r5^Zj>TBI#Np zd6$Qhuft!T(K_`P6WRKj|B_&?JSctou=}ifG)ra3Qc1r4(Eix@4B8l3!ou%@Xbq-$CMg{%+8-5 zD@A|DGY2$pe5a(*Ce}Dbemw*N!$$Q&%uTkrTB8;8Y3-&FCeypW6B6iuYkKEQXX`Tm zFj-)e3=_PkBb90%W79Q!JI77zS+qLYGi(Kys{)cRBg$HxRPm*c1f9c!q$U$7{9>H? zGFZwgjmYg<8KfF3`97_=m+?vVB5~C=Yp42%`k8+t&n~~(QufRPewdtxId;D!yXHJG z*sQx7h!+KW=I-C@o|kZn0S`zN(=0pb^#@X)5*(WCbyxA~IccH9;!P@Cm%l7K=daCl z>rIIK$8-4p0atS6(ZFo-Yd*myRM1-jMB zKsE{edmMoopNxs9CnE3m|<7nfvsH74s7U|BC!shXZz4RV`tz#*Kle&qc+S4{XEb`IhMGphWlP~*Hm)c3^>+F7cX(XgMe?}J>~2-KNdaxxu6pGGdf z5^~^$-ft}SH5-z|cj7jz=5l&K+z?^k(SsCoIEIIUsT8(gtrr*X2MN-L`9qfD38H(t z-a9kYlY@5)ITb=02XSiNKX)_0STvdoqxd>+++}4~XA{@ABu`qEdMurYwAvhj-p)J> zcfh|yS&dkscJt!lZ9-ssGT-D2-6qcA)<_Y{ETw}yo`uMR+)6ueqs|m+p`qBq@lrI+ zp}ZD)t~Y;Mnfd4+p;b;9|6Z!4;Y{F`iT8^SD^E|waAZPQM~uF}rVbH1F~Dfarw^c0 zZ>4+14*n%Z@NNfH0ds=rAX7u17>v`}7&G~?fWTR1?uu$c_b_^NELE7&ee`~}LV3h< ztLq0GKU4&Eu3y^>VhyzJH?!oS0&glDN&^Mj%bfYNR+4x;9@18qU`_hpP;j!>JfWzgLnF3Q(AeZZtuL!5)s#(g{+f5c1A#_uN?dHQ;+3zFGPCLK@yiWsn~l8p^#pn)koj{^Qk3`Fg@l z5AxRr*I;{xjtm?D+kH(8G0C8KC;w059ckdUh?W&WvHm7z$MqIzDJh&2gcC9_1BC3h z#=-aX1`NIk^#NY2?18+`iPx3Zg;~RR?}}IEI(*M0qg-Axnh*qf563eq0xwe>4LW_h zRv?dwPioO`e8`_8S+0l~E993loBuXxdfYUx6;Sx^Y5OBW#@UV9OI7{0ltnpIaVEGN zS?h>{U2x?|9lJFhq5ASDHBKXiilc2;ttLoWPdxFCTWzp?870 za8%>1^gVS7Uk5)gF-XUqO=2_k;V>X+F(8dL2?G+8HH&H|&QJq_!YNLu7MitB65QJm z1oOuFI0*Uva5!LuyW$qRidsmu!=h`m@oCwP0}(l~>J4K!kBSVwX@Z05Zi-ueu<`x+ z-~`y$N8$JRnF*UDp3Ak}cB~Mr3k~|`N}$Pt!5S)4Kb7*`Fv=pSIWn98GN8W<-?i*) z;6`mTvcl7!Y0xUSt`0^Au(eKZmzz}}u9h1^EyjnCts{vsCP{VobpR}^*5Jm+l1CAwPjS&UW&$<`+OyRrj6>@oFwTHP`+#P) z@#VojFJ)H$avow-iz{NA?|2TlNrEOT9_z%FTpm*m3P-qKX}g=>$nWslySNb|SVg`OR=eb4Q)r>bi|vuK#4=_#Sc?zU?%bu6I%Yj9gT zB5cm4Ioeh&2!$^^7BA9jFA1_(jo6~m@6vy4)qaqtFW)@~j$Q(#} z8>ZNW#{M7TXQIWJ{=wi@+FF2BgGmo0_wG!qlY{*@sFtLb%lCUJGh#VC8G+CcXyBcS zx0Jl*{?^KsiS*0lZJ@5aqqf+(t;0+2o(;RDofq~VU0gP;@x6pbcac4yF6f7V@G1r*H7D9|;GwYRe8s z9_A(zfA&Qbv-(ZaP&e)Dq7|!uppT!q0t-Ev~y>(oe;R(7v_x^jcntn7GE z|M6j9h_DEcIh#jlY6CZE>MN$+v3tUt^$EVJp`E_HuGLpkk$o(Qw7D^&pMuI^nI9v| z8pGV5r+MM1+JZ*ZTf`!mBNKMbS2ffEiCkIZ&f_ZGysu!=qg*YAu1`!B25pK~Wo={> zgh0JE4nvDI({tcOtjntsoHNhGkC`8UBU+a<1`D#6h1+#I#>_<-4a2S8NFOgjS!~+RFY6Gb9OUMu_&ja2v5wLD>u-gA z_v~;Sx^u0HmLC~Am1^wY(#~+bnJ1sF646{+^?sm2 zpzpl$+Rh>WL|?I(ta-38rhKPMt&3}BpbNR7aiYrum9N%B_{$xR1LBc*3l~2-+ouQiyiy_{Zv(ERs)?FPdhguOfTZ}J$$D>OR5gKB~0ZT_Ii`ZGK_{#CdTQm729 z1%T|kSCEWA;qxL?q{G|h)B7dHNyM`fSn(_FJ%A%#F<5(o8w_#WZfZscd*X+4OCl8f z&s~`xB1z;rC(}i9R8Lk|Zm8G%tJ0^%_=R(~uF}waJrP0Qh$g20mjE3^Thp)I%K~*! zQ<@|T>r>dZD>2TK)<;8{d04T9oCEKAcf0fjo8)M=lxnC1sFt^d!R3GXh5` zcRvecXEP5$6#&X1el* zDM);6^*>1(czP^;?9feyB3zQ*h1+7uwMWMZ>;5NIKJr`b9(Rbo$myG^vx+Ih7Mqro zbqbwVC5cLn&qvdx-1YUa*akr+KHC^a{cW1?I_?{pWLeh3W`!l%YF2^dV*;Jlm)%tl z1ajYLuOqlwMkN<=#4C5WSDfB7Bxfx&S9LidKzi-IoEm%j7-^dYLfZXd0oAb}aNdl3 zkgSMhouL|3260t<+P18IJRdh`NH-|glw;;w^7?5Jo8Z>(vzlS&7wW@xJJ8V+Kgmww zT1}EEiU=Bbv$C)Q*^eBIPx$T+7e)}&XAKLOCspkLDJec2s-(_8*W9)+@JdkhQAPPA z41M!s1k97J-B3tg`We*@6y?Y|-Ce428?Chl6v`p$>`VmRiY9gEHs&IB#JzvX-Da=< z)(*w#_AZmJ5$H7KPJbuYu0Z|E*PMb9G=voPCs=D3gYCD-!iN)NQ7?H@b7C>2PRX1C zAmIEP?|6b?t!>?#AvyH9Da*1jxpV>u3x;yq7qDQMebo>aULbH04Zci4c0Gvbr?D!4^~WrO@RPdwc4JFM&rSeLS$NGZA0UEErwQ z)Fyv(_F597t+@BP5m)%8^al#&!y><$olb4dH%aTOrICEp^4#<%-F&g1zZ3Z}v(a-j zTSnVWW&&bqcLEc&kNduW(01O{v!+j_CGDr2ezVcqVgGx=n?s70w%vsS86=aQCiwg5 zJuWw`t_~bS2&ZL$nnQ+jgi?ItbCt@UJvyBer0YOmg1p~SA?Xt#x_F^MG30)$QfPhH zHiM|JNSzg4(z5-8az9->0Dvzu?Jyr$ch|UcO&GY)kPYB@vKapPKG4O&{Fvapd9rPY zDJxr9px2b3AU;Mv8Rc9r@a>BiCuHB1nZC;%>C1OqJdjw!9~RYDR?~I_SXfa)cB_x? z9ep~J{J+#@TLeh5CW`6hA%6GZ0`>CbU$k>2gMRl73yQxhrr+0J zA$4~ipHe*dZ}dnJ(5JN%fqt&!+zaX*%Ow5#>98wKMm(3bOdQIYJwp|>RA|Je_){z2 zMYgxRl`|6l=hbP;$ZG)KU(QXhRz+STZLJKJ#nD$%-Gs`_ifQ9y6m%k5+Mx}b3Dkyd zFZjrxmc2AaH>A!!#S>~yYmV)Gjq2y_`3*`zo#I^PvCvfQj>}{v(}?&Ka-RYj!G1?T zv=Bqf<(die^mUJ`vcVf8ag8g$vbziQWgh`R$VvxC^l<$^rZ0d7=DQiCB2wCO^%@P%MTQ4Wk3J- z?yIz+YkGHXisC3?897Zbip(^ZR8S^z6#YqdHu@QQ|xmaV}L+@OK^0BUbip3A0_CBw!V8Bxp|kcSBvOQ2Ypx@ zRle3~#{+-AGs6(U3wnsoP^^qNL|K2TWr8dzQ2JG&-Mp~W5*&u29J3QXLA&#p>K`S+ zRLAt7WyLt5HrPg}qcLJPx9$&@#%L3C+;@Z&*E+V(#2^YAR0M9)79(-bQcqm32%-e3 zl3kWpeWkZIy6;x%`twFAz}kqTx-Len(!wB-YY*#SyDpp1?b?`0ll#L)%?RG~7M!O} ze_{mdSpTl^b14y*JpeX#s?U*d^YTnSKCx`|5{Gb{8$A3*WT+(t2qOjvR;M)!KTv0s z>8AqCgpb!#^=h4O!3Qm!>B)YV011No3O>wr2Z}`ghX?wn(7}QVrK7oL&w$CZ^@rcF z>69QmoRPcJ^V6w%-;LRk_KR-`EEnx<+Etn9f~pfkT$m3JH*%dglxuJXW*(nCyDHoC zGHv$c>Kl1~0gu9jqu~qK&D=3IpBwW*yZQ+m`a7Rh;y*m0z&$NKVx!Tw=O`Bk;atDB zFQrpSv%WKk2TIalD zA={QL57+NlpSBsECzM)ry{ffwe;y+Ow>?f)nEAeX;2)s?-*9raLn^_FQCRT>@@I65K<-L@2ejCP;_SvRK0h|6QjR7;xp z^>#i~7A45ue_kh>bQfMsw;%8VXGQW}+%9GuV4ZjmqJG(j9L?Z}br{@U-)Ee+Px1w8 zAEjip*sp~0c?ZifzSlf}cd4q>ciuYeJ$O)QkjITZ`%Zf`G|<)iRJbKU`!QF>CiSZ@ z_3gIaapsVjYye*lD`*ljsI~ETc5=BPJ!^8+>waH))a(>v(+grMbj+1^X6jZy)*^MA zV?c*4Cn8Hx*H>=K#QcT<9Yyf}u$lEK13&>c1dq#i zOwI<4-DnzZPQv1dAR+IEm4Jrt`pTPm8NdJ74=r6D=BL5J~Iw+G(EGJsm2 z{@TLoC&9_s9ERK#{&?zYYlj|JHiuZX%RhoPfHMp1B?nlHi+n=Nhxf9IxNISriC{yP z^Dwjh6T=)d#gum!zMeV??~mHzE3B?VM(e9B;verdd_Mf~cROyfaAo~ytMUmpYgSLS z-|*An&j-d1(Hxgl9TUYxM<}m2b{Nr}d1lRc?k6iL$MAoIg6L)rE907j<>T`b&jHS+ zx8R(B4DC)Rb@iRgMun*Q5h%Vx{tPTHpZ~mE0_FsH<=QC+i2eam zsj#dyGH>97t`%hIJLn=xLXN_(aHzz0UzZ0)nLQlm9XUX2FvA$%f1KIFEvVAo3HkIB zRWIKiQmlU^E-tn!hf@52`)(v|*DuBsafK03-lOqat}m?=HxO@-nni?{Rz z!gsUTatZYM4`v5O21-<$ov}EQI*8u>x-dL560fs1SFr`~h);wF1bSiEccRTEPA;GZ9`+R)$`vPy&u88!86map`MGflZ#QB8El#6Ea-C zsnHH|Zv@L%`P?{-(-NA@tui%=4x*zl)EB`mFH)V-|9r(^qDRbnZ`` zK;y5fsf50ZwdL~wjbt?xMiykNahx4VTgW&z>f21Xd(q#K8Rq^c4Oh`R%awpmbCzAt zfCEe5K8CqW12*Z@_NTO)k=Sv!8HS9 zHt4j>>DqQeG%g%r3U^*-nAV%9>~#fFqSD+lqm(=AJE4ybqi z_)Y22Hy+CMzWCA zk;5)dN4_<3&Tu)m>xI^t7@ftJe0pFj(+Zv^K4qUXxDG9AwV~i{6Mf;gGsZ|6=_*uI z!8SXGDoHz0{iUNc$!VHHPL>sjGs7obeti?K;I5TC+N@2O(@_)6CGdsrJkp>4uhOgz zX3Tiki}HW9McxN4FcCW3ik;d&u^kk&xnuXg(pP~DqFeZ`^WLyWcbB^K(COX-G7qbM ztL*fFC9a~8lM+z$-Rk;NUYvWc^4Tt3h63KIgaA=$O?{iBkEM(kJLZt-jf{VBr}tH&)$2jYo!?a zLUL;DH(N@bE;bm<_$MuurUktJK#Y*$!@4P6m9RXt%bc3pV-MJ-kZRM4+-rtF^e|d|o@RzsaWg9Y{biI#SD{d5;nk0R!4cW*MLj9jjp2vpgw1!^4x$ZS;8v_l0 z1W;G+N!S!NKH`~uWO-AKp$>ZcoPxK4c3^G?`ft1)^R}YX%|!;bZPNI_<~OVJ`aPm@bm?e%=_=5 zy6XnA20e!~uazLL{0*76MlN45F|qC^H)+3Bfq!WA#@YsH>7&*Jdq%$>+czfc9TJg| zFkW)E7`TK|2&NqL?O&$w?dKbIE0&ZqLbas*)oVz)ti3*Jax6N%uOSg4&x;mFdGirL zf#mmhs)`Wr>EJ`T!#aj{$Z+@L+C1crwO?X&7i)XwCt2T|YLmDqZBJ_0To7-9fi54; z{ak_AHSd*Nm8sK|-91b^E-gU1rB;`+W}y2V$!&eZe4%b(x35>{l?+;4Q6??#Vqdt! z*+n*WxVfkPj^LAPE5n8wxWIMcC+F8orgej@5)7wl&!#J&aH_qZh6 zXp>uzH7m}*p9+ilWbz)|pQxu81+!d2r6XG4_3z<^V#*L}S(;9UtXaX&vrlvtSODu2 ztw?fV%n15vI#H-WE7)W!LNgf;443I2OJuy?a(+;VpIPphj@wuTSq1v^J|~ul1jrP2 zOr@#qu%o6@+M0+U)dG!{8u%UX+c1Azpf1>x zzHRzSjUFBrqw$s0+!twZM()#)wwK&zXm#4LVFY96Xg1v6QcGF(X3MwSOtLycW0i<0 z$DY;r- z&Og^=QZAJLzE(K?-J%gmUS#)-p0( zr9ANnqXARDGv5=6NwYZKl-B3t50|DVTU^r6_x#TQW^V8YMp_BIj znVegKDaoiz%BH*-kFLV2N;A$YbV`m`u9_>pqE}8{rQt{xBNtAQ_4<^?R0T!;s7HKMGuLvJTa2fSi42lHlfsrPEAnLFGDL@TPmCC-X zObVW&tYa6rNE^$8M!Z4kfRSB4(1@sc$BL8kcAb?g#H$GPIZ4TvJ}|lpzEQz9QQ$MqD^;( z_6NrIKIsQb2HNIC;JoSI+)KvQuYtF}8ewX*(ojpR=$tktOpb1x&Zv>WB4oNSKiY55T^vkqD{nu&B$ zx7P=09O$eH1jx;~$Ss|N!E`FqLT~-f3NK+P4vxkY*pkcAX?2_qq&tHX&_E7K_gr*=5#W7)oEae6(JAgx(EAu-aUUJJz@BKN@JB z1V`l|IIlIl{kI^K==K`PG{1*xzbJ@^Cgx*Ri1x{)-JCI>A4471U9Xxho^$#q)fbtK z&BZ@M0v*#9Rqo@NK_(Ye)BF#=tw8Bq4wm@W6}JNz7A?S*^BC>w&HcKucMm>(F?Zd8 zptw!L&F$;j^$g@}zR|6`sU+VAa_>`553MN=CSSehyPsW5#{6g%riN^S3HWywivKGt zh*jIL4=DD{At3q~mSyqp#Ma{yUbSqiF)!ZujOg%AwsZ3a_a>imthqg?1+pe}w@+SA zZs&tUXQU2Bs@c;g+a%C+ReB2VuN`4XdN*z?M-feVV}mFlz#u=B*wC!k`)&w%@CCjY zGIf34bar`oJ8fpan72@HG#+1E(v{p_f1}%X?@WYL+SdvQB2jtl>hgWp2@n&vj#{EYQgo8=Ow|UvPcNfGI#|WZa<+t$GZbXopII#XbcT6WHV5drdCU-XmOD zUsr$aM|qn~=ymAXWB8qyxg(xWGRC-Gg27IZNwzl|vW~AX4<6 zKDPq_NA4hjj(hX<;xr)Cu)*kV_uG8A#v)5z*i$kyQTpGXOIDr=oD;BC#e2Gjz7~zP zHA{x`$zazKP3EFCYD@xY`V8t<@o_a$))Fb2#Y4}~SKXgN+hkhbG?900cN*TrMP5dd z0YeX}J&HAI={?MtFTpf0W76#Qc5CCP|M> zMW?v%BcZ$beE_>bO!a1>K7gJ3nNwI?g3a^=3=hWB9PTxpG$A41xFA+IEIr?K~ zL(sX?<*$s~0EfCjTu%F>P%MSq;l_ltr8t6J;4$)@~E zA*xQFGv0)Vp&@>OjBReTp~;re+SvSlo;>s|&qO9A^Vo;oQu$bQ%e44?LwSx=_t|oJ z^Bmwg{@AoMMK5M{6HOYB)zw$}{PWLg+>!FW6&&V>P-$1G#&xY;5K?O0_Nj+6 z*6PepROk>I;Tk7P!4{@(M`c>^k2PS34?zW{Qhve=+Mte6H z@htyA9#W}B%ds&AvxsQb<>tUW!`(82B4q8@lyGv}weczrSAOAJ9DhP#TvB2B&9*JE z??FR197SKjH3lH=YD7c28o2z&BTMS(Vy zdUtexW!Lv;AIzX&?a*^}mY#bF^Mdt1X_rQ~|6}_81)sD5K@25O1n>GAsTAO~W3@*R z4V|FAuKu5n((=%bdjBO+i|-d;8@RXVx5Desjg4cQg^5}JPr>1*rQ%wm+NaMne#-!# zNe2dm!I?W9xb1rQ2K$+8+mBJSsXM$CzL64o`&C(|pTp7n?}7D^*fSP{7MGuCw`BUn zG{pF=T_solWf?fPH52%`p*91%3vZSc=Xit^3Tw${h8uW1Q3?lxZP*6htn^6Euln}a zqWN%lF5eV*$oK`Fsyei^-*j%PhmFa(C0IdIc?lpB*y3`BlmbqQY>hWP7M1B#w*3yZ znF}G0LzpTHo_sx(s0GW`Lfx5?OA97R@#S6tW|2;vsQ32PN~bR0rVP;AGgH#67r4cv zuN6>8%q#Hk_Bi2iYJn69_Zt~#veoF$D%J;0dgv*X%Cq@Gd z@vh+2UHL{X2ypvN((l{?GIXAIu8{u7K+l0x)BEm6T!?2Q#qVPs(hFsd!xc(R1?~S4 z*5Poz{X6{|?umB&3H&doLkL(j0DSzHJJjh^{(Wa#c~p{LB-89tB-{p8&4G}!!F z3=X{_$C~|Cyzym|Pure(%Kb;cv4Kd|s*w7u*7VQ zMIF+?y8A&8?8SyYkbDw|;f9!Lv(vE4&$;~BLBOcH)IuSgXn8)vyp`Z(yLdmjP|F(w zUEo2j74x}o9&Z1*`t61ba*Z!v=bc~f9cvF#N*kwy>2R4JMaW_DtV0-+KmQu6aaVfu zbiJj8biVP;MYl`DOFH_OMNO1?uXYFA4;M-4b(g+ZkS#p$6x%mqy=c$R6|56E?%dN|1Oq5+^QZhL2z;_Lew3uq+6^(_m< zI4g%)#)Us&B?!XmjOfVb0P=8)+080V`gJTd?#RC!Mw{cUEB{_MHoje8lZ!wr$M3^g zf>+{EnTaJdmiE{~XYZIL+$+AEU0Wcz^!7EIjAvy^?byU%l?JHI;MAc zfuj8BHvnCS(mNJ!IDwHJ4=hPQWuRf&ka4N?Gwlu`-ye~MIDf^|4BvLJ4xyXmCSv5! zdKIMgx}8yaAIBZ4KJ$6ssh>F>L&5IXCbkwJO1%ogUQ+s0azZ0Ow}-ogd?h{K^U6YF zGBoBiD~gIt(_uYU_9Uu}9aU3n2VF5)-(&G)06P3j!3)ylnOPfKb<#tpKf~{2$I`b} zYZBH|r=xdpwg#xL^Ah~a)xr*9T{K*8&iDK}UpZ}LNAO!nJoyt8CGTC)aSkHAZVExW zJ-X`@s`jbzJAz-hJ%tasBw=ebNU=7w!FFHv=5jF{0EnBwrnOJY z$xFCk{;3&QF`zLODcJmIKw>k;(U4xjMt7q!>99rjHB8dYzUpWl1++jcSMA14v}K5n zW^G6cf2$K_&Qwu?wZ%fq-J8aJ^~cGe&o4_>8u z3g0erEzwD)S7&OunpAWQc^xZ!&0;5#|Mbj4J&CEE`&?%9z~uB-GEK>0piBkzG?clt zgy(Ua#*Bu*o@`=cXttA=!lBH2{!}qH2Wen;9Qu`fnI?9^>wJZaC*u^}DXK_T{Rwu* z(Aq-Djr){ySKP$q=b0QCExaN~1Zh;lws$*a7-twT%dR}PjH}L_`P{);~lIwSO z(|DA1za(5)_9U^8c!ynD6E{{c{a$h8S|q2zc%P5UbA*|&LRYm}n1)R@05nGYw|$WsKif#Te|tlszpE(OGUSv|u}=u$3>C1}cyn1nlkf$V3?|8>d^PfNF;m;s5Jo zwqHPWPLJ9>ZfP-oFHgg8R!3KY-hJBVtzcDxu~9u+ZypnyKFj>^wt&u+ zs~-MF+Nbx%?5eEa@0!&~w-+`bCMgB?OV*uPJrCDkDXj^d@`4>$YHxCAqvwR}S#cAS zizt<$N6+-jf3drty#HGidJ_>@C8pvX+}W4Dbc0oR;6H4-b!O7u_bL@3C7{_)X>I4s zAY`wtr^D|<29fM^nP67g-9z4Xid|h~8p}O7Z)< zz?&Wq)7x3TBC2AR_jAS&4?yXLr%gAuiBoN?+vV9`w_}gaG8kjAN%+k(%#h!yt>F5# zb#6&9tBPOSLFP3^km0a9rFwG@T)!*7EIo;<4*udA{p=y?Fq2LCKlxbo{s+8#=xG~M zy2>3|i_zY%fa3nRCKw)_nz%T@AKVaZL55-dtQ6AOhZ=|3lw)I($HC;@hBw0dXFZ zzDLkz8Kgq8V2AUq(ZmAz%Ar-8dAT8z=jDs<%YeIMvuL(LD#*hTf=n@0{kB2(pFqtU z?&jiwDVh7UQ&kU)l+O+Gy|V@5C;2M4$tdLKfkh~>o*R--gr`$S*YGxOj(Px1X2p8@ zNfCskz0SRJFrK`BPUM>nf!JP;*=+m?$(BUrKWL@Oh6HhX4;R`w7&0-(O*13^iIG|R z>Q>&~4ws`#z+Niog>WA#dlmG+pxZ38zkXeI*SMSdvQc!!6w#ixv?ynXqKoASpky3# z!^@&aVQDSe;r(Z+KQwl~J{Ypop6v@ELr^hhEORpn=ss^(J^$o8V8uM@-`wnb8R-9) zlyds`@&r$j$tU!f0pTAz$Ycz7gjw+(cyVq(xeFp~A~J)+e;aCjyM^B531Ke#fxRKU z0JhJyF&WW<2XAq9xU?YCIC8GaT z`$0T%fp7%ja0zxJe49!9f&qPLtCbH??`O`bkT^{Y$@RJl@kwhRYt$K6)uyQ+nv}K` z#*_Ux+oZf6YPzLN>1i^9b2LpiTd-5rt&XKj92`>PS4J`_s*VhIxIH3cU#JeB5O3@h zIE~M^4_;UVhU>$vd+9zPw+mD>I045&HBc@StD`Df&k9+>x0d(;UNmh_<+*e2QC74^ zjUjb&ZR*#FHiea94hHHrljN|;VW}x#g4OikK;=)h4QYD2Sy>eMte3Es9|o`o1g55Y zX2Nl(x|H6bxMJ z%|nifO}{TaQPKz-G<@ZgipVR7VT?@&=)S2EO_CL-PPEZJqhX?mp=sa4IYOL zin{aVu`#`IUfo)r^^s-dzidtqtZ_1t%TNTUx&A&;puF0|y&69ts>HKxEsrv7-%4n0 z2-!+$d}oY#AaL7mZ2!h}IAGOuTQPydU!BK?=~Ul3@|>$bkmP>G5V&;GW!C@XKPMSI z9x>=_Hs^NM3_PjatPz3n)!?#fN?kDfI~8S4HBcz|ULL2vxQK2SjYoyRTj~OpS$a1z z^i{FRIHO$OF~MY|pdbH6q?tvY!nGPzkHL7z&P`jNE$<7()7s?_1@YteWKRwKBdeKE zs-vvI*0d8Yq(9xXTRVsGnFPZn-3y+~&MLt+crzp}Cj$seeKUVlZ%hz37t|i4Te1tI zvg5s(ryrJ{&wt3w9AH!sl&5odgWc{IxHT;7^leL`c(Ens(k5JVLv^H%ivJ}~RX}M$ zRj8%{I553_F5gQj(nwKGj&$-~IOV2Goa&&Th`3?opJ1wh-F(rWEHPXz%w*+uC`~Hu` z-8NBa8g-AE<5sW6@f)@iZRjEuQHpl@ap z_Y3{%pCsC$!s!=*SMdj1BR||1kAegXzW3+TM~#EkPO9oliMP47y5+WZfd^dd2e>jD z(>#3K|Hw0&{3zA3?F5LUry|KZ?4du0YZoC7~!NKA;FnFEfY;yt z$gVEFl-m_Q@Y{bh+OHsn{S}*dV5q?P+rD87q!SdnpHnTg`?!L{jyzvW4sLFZ2E~7b zcn!#YT}^t0U%tTGvMe^?vX8QYsp4yYUtcv#0a$=r8D!Fy?Z2l09xjARSTqZ(iWRXT zzLJ8L3O+&ld*1^e9zJY$fS4HGd(q1-oz=^neR?DF0y3FXuX~N**z*R){wp|y3JG4( zW%Uw&Yn~fhh~}`%-Qn7^qU|`j6V{$C{x(!*by7clyW>K(=zq8G{IbDeF#{u@;HrIy zMrr!uZKi36eG}6%4yJ0|0}WIzJs3UpyZ=+jp#9IlLw`vm*iq?pxskk{4#y$QgpOQ> z2*Nku7+e*iZsvMWByz;vH$RMy5rpjVA3j=$`QGNL-<_qs8}pqUAnGfZ`5-cgo#s~x zx{Jm>B{j_9OtB{8(lddtoS2yRDHY_R-(eg=KC54!{_CCl%Y9rPNkCI}_ShD!I4E3e zr{}I5sq@^J_k)}>5+}8W_AQL=GF>iZ2r4UhbvmEb=t_g7=~(@>0+a79HtD!xL0&Ka zy?{aDLz%Dy*`El`6J4{tz&_i9hnI<99qjk4P0+q`1;OnB#&AfMhn>!}$r&RuVdPAz< z)H$Am`z2fePi3eAO#KxVOl>XNkBWlv<4-9CijESrXsnNx4xLS{#=cX{aP#1@7l@oV-tu5J4$RY0#CFlCBOTRNJQlPWc$ZuN)GbPGupvOys1J#}>7BGY59D zqCJp}ZzP~jr;Te-mjxGxlt*2bt_}o)45FcsiLlHnoMcPvPhk-eD4x39AT{MVWvWSA zC*@neBNIG=inVx|S>w{~FT1uLmvKCrhP>DC-g8*!Xk45`1_!k&YA@By z-7VF`A(~Lze#6NX4^MZ*b~g^lJXHWy1w^G7b3AQr)idQ zDhUfv$ZOk_sbIF*NF7EiuPP(U^W7wMp!_QvKSk1HTj#Y!UpbM)8h8QIrf$Dm^2O-1 zIp-ZMSHg9_4w#iU)wNQ)mvXKgc6=NeK;QR`2M5`i>gC%1RC9qZ;zgIU1O18q9D%nS zLLHG?t2^FOs;FzxQ#{kDs+rAmAdjsy0N&XAL0lg9XJzJiqgBRHh3rk1 zYMV&tWK`RW0y(HjX^;Du*HZlJ#?oA~Y}d})V!EwFc6?KBW5KF5(3)KgexJ$&_7~pxewfvAbl1PEWIEy!AUQ^*ro#nWa&4y>vA4 zLj)B*W7ol_v*T-0*FHgQyKX*-4fm}{>aFvGvGGK8Sq``!;|7!pqb(^oeQTs?Vf%4s zihtj(Iq2K4`M=iLybHrxcPF}h3XqL!>}{~R!PqnTQg2&eTjv%}e)gP3y+Y(@ZOpkX z^CQ*I=mMU+xC4+?a|(#5+x^J$Y6}HNSTe~Nta^%SqRsB;E+s@&wx^3KX<9y&(Dwoh z-*Jm~)bE!G~ zP{H8H`1iKFb*#(M@V>1r@LV5KhP!E~1;c(nH*D9plTAI`h1BD^hfRkGdAv-j&?V=$ z@8C!-(X>uEw0s$>9~lpnQiJLk$2l`EwUlnS(jL72k0f!gIqvz;{Wb~hbhlSV{It>T zEt`K<-y!GIRKRa!+VQ;tn_skabD~=Eun*)#Nl~q#N;5B+ol*~xZW)Lq^BNW8Yi3v6 zKZ9P!PB#V$8GLWo|3hiup~wNAO%dCN!w0DzY_z||jDwahbc957%&Vwy2=Wt+9jY7V zQ`ye!B3=gXPYb_pv;m6|^^aax=RivjvUn9SGMm#`^yh$I)rt3yZUQa>ylc!L8Jq*v zvj_{aR|c!In}!(ZW6Q`hN6Um01YvtB(6 zGctTK2nt2~(*9?Q&-__MgtPZ9FGq7y#7MqC0G#NbE`Yt8Vqq&+dfI^u1MUxW1bfxX zTA{`ILnOVqMW!m7jrL{-$arBi0TPxy)pZ|D%cXl*^xGN!4iXp|b@OOUGY=!7=lRhN zg0!B+jNd_d(_ODRla~skFV8{k8TK^uqnXaTE`YKPl&Od8d2Wzz^9D+nZ#nV)>&|qt zZXVU4^X_emA%m0sYtADdu*C|PpWMdem9JO9vA`ddZS!_={>xH8;_s>e5EAIQ^kARN z$~B1xN~!ic-n?Iuk=Zz>v}cwfyJ1kq668 zeTIio{;<$AOYNv773Fv2DWTdYO=k+5p=Cv*ziF6-zbn6C$9>2OA=z~UE}E5p zqmEC=`{bxs+x9D9l~nF%MfsE}mD=>r*+RSVR3No6GrA-Kr?oPId8{s!tlDTiQB3$+ ze&pAlBf$xwS*q`E4cn8SXHXjqFmwRTI8b#zaxf`kdwDcvbu7rU=w+0}7p;}!O}9kW zG1r$DW9PLTgBo4FRQw^(PNWl4T|$kcqAGOzx5dyUsM3`aKiNP??~I1IGnibIF>p^_*)>p@1UK&nRtP;a8=7fD@K)cT#t5HH>+NPS5*9q%_s2rK03H1{H)6$z?-!89aEj81r&X#g1WR02tT(pj8M9XwI z-X=RR)P{G;Bqy>jJqKxU4k7w6Mw-+xtzeSFXBu@sJ3nF9%C%u1)YA^+r&IRXy~E&g zd5%341??W2YBz~Uz?XgrDfJff(?(tL1TSF8m>V6N47zZZf5ruCf%GyEdVe+#=<2qL zU(o2caL=QCdI9TGb$TWjQB)@==Y-eN_^ZV&=$SIAO2!!fU0sdxJ*lzTCwm=8@rBI< z7i+Y15%D`Y_4WqI*w^p1>U)$M)HQ8Vn0&K4d~00R-6lhJfmp|4hxfwDE>d*3(6ebo zCRvw9n96_cy>x~~BsPV|not^^a4AT#rU}NJk?tsFv}?cF6D5-_;QU@wO-|R0Ns}ej zDmnxF=8im+$MzKOl~+lO1(Mjj->-$O`wv59P$_|ndAI3y^3PbJ+G>&quZQ-VE6%f8 zt1@A?rCsA2$<@hhoRt(|iR6t7b8p0(0&oXxEFLxzS9PPfW6#aBmj0=U~Fr?53dPk(G6(zwu2R02;;PA&1zvOIrYZ=tr zEZEKTaqTs4Y$1pm#}C{KnNjizYELV25yMzy&YWvIWR)+cw5JF{2zg<%2Ra; zltM7YpFa72k`@zDtAWqrKu*q7-KW3Xc%ovzn8f@2>XM(qFzwUS{%@m$JT#nC}>z^?D_Jw)%o+YL)TQLyV_Jx%q13V-ei#%mJA!2DoGh;Lz1{{^fIzK z6;`T}2U}tO+UM3ipo8koTeOfzjHkiQ>tMDwRm?1LkjY-NFfC5!s)p32Ox@=T~5350P-rwdyJ3^n8(Ju(o@9#8$i zC>}?A?9Y$CgwIZ{Gw4=c^I2`M0WMhVz6lF0KmLg$WZ;B7c_T(MMn^X@z^I`!B9`q1HHh%xzKs}UIO z{aTa5yxFO056W6MUdWsX=S-#^6dzdtZMCQe>O`VIS_tuq*xo-m}E`xTpYjjVxV3|%XpY+5MXhx|F?MX6RqRr6* zO(rcDJfalV$`y8XkNcozKS)+u_q&asc>YBRg=$3mu%#*+*W5wL#)x2}i`FR@X4b|o zUPIVFc;0{zCC@M{K}SCj;EA~EH>QNR&ZGOzGtN&kb{vu@SheUx&L8S8XI~75vHbd7 z)tnIG=wkwmaVWXOO1*ksHiZ0nhzvSq#Kgh^^fDKCp=ZSV(nh#y|28Z-YIuic z`wta3DQ9`m@rHr7*Mtv}iwtNrTPmhlCHg4(!E*$NZO<$`OluBFDJUt#GYiK`@e>yp1nGZ?LNKQjK*QCaHYHF!!RsVLZ#R22>y zTD!~@_*rhT9+g>vN?iWR-H_-aMAQ&biA4vDn(8uZPcbRY#Gt9Mc9BqFSO{h?v9AED z@O2C7G@fYm>3EU+684PZ7F&u%r!$I6uOn9APVkF4Dz-xOQZ_=Z>>5t$UV2ul6xyA0 z{yTV3Y~`}5d+H>v6u+=irdGMwTh<{?@Yhzzu;(|syg`jA1KHvDl8g;QdE;kY9Xbu_ zs4E{B^9ofyLKKTKq-JvbagIM)b0<=mr~Kkx&|9!2g5h~PFQv=V&nif7bIWMR6Kp!u zt2fO!rW|!Se~_pbzQstYT1zRoW+xR40%d1aaRF8V?65p^L_uaQFfd63yJ&C+=$6v* z+D`UWE*{yp)XTIgn$`L+aqtl&H5QzW!f#A9KH{dIn7nKWnquo?w*m!&>_C$}9nI&e zv$GX)DEl7psAD8FMGPHIyxiaEs69S^=Z24OfRm;ZuO7jqgnoL3X8Alfx*15xX0i8CE6 zL#+IqN;ckgN^t;%I7bF^s48b~n;7bD#I1d1)D=f4!bi3BY>jHHPLkplKiG)40597h zl`vcaoR{KLB66v|8(?1Iw?eh+Q_4q7?j|&fSqC&N-yvij)w8y&CYO~0YWZ{Ouv(Z2 zWgcw$(A!`;{FurgxI9M>3nLJ?e~(D?$wQo6>SQxw*Y)l9%d5ninlOJLzUi;#sf9n0 zIa}1HUaTy*a)AC2>dG_#VFgTr;t*9#9j98Nt!Wa_3Fv)hwY$ULfcX|l$l;Oxov1WX zqW!Bqrsmecl!Yq0uoX0W_J+rz(j7(Ia+G|Hmvii^4bCYGDp{HB*|Yi-3`$=my5OI~jIHBp5_hFtyt4|>@b>;@$>pHsW&gjK4;(2z3MLf|) z8z}k5s@$nO&2*$PWQnIxqgkAwm#o{2#JW709l%Gla{ zmBGWmd2P{t<<1@iB1{**Y&bAxP+uB$D6L&4VNWf#RmljodR8W0?-bs6U)KDFzwcq@ zAXA4r6L&BdG}pU*e4~G|Ascyxpr8Kd*>T)AOxZMP`N${WnllV;1?(xD@hKBqq;9kv z?5wnpUDLb#6IO*@YX${FZR|mMN4Ycd!$yb&$3^t`KGvlGxY#RASxtlL$Lc6;t!vW_W0!7VHQ7R{R{HwTsWQk%4EGUKK#3>L3gZ$Tx`Z@iGv?I z3MejU{Ej%Lu*GCmIhFhx(^V3#kf39{>Q<4Qfq`E5*{-}vcdMq6RuU^QC{?-2_tl`4 z=Iz-=C|^0-vy1raoj`Ut zc^DZ~Vc<4~y0d>}ACVBl!e>FT(7ac|KrKc0i>AZ-&i`plN~ClH&DT*)_G$N&V(QIZ zh{owh;n}?fa@}7}?B+%G<#*2kPok^nlWd6Q+qv7f@OP=utJ8I(H}|40*b)%`iKI7_ z)FgnI>!#3;dM!Y!A^^1AS8Q78#Ji-7`~-GcBF2@dIPu}NCZcI>!i?@OV!4fe%l}Mc z%B#F)vBp$)bYP5wJuRqfe3xBb#8BWN>TVFzzdKz7}_vmF*xg0URRmgI&Y zd?OGBlIH^`xz*?u+2XuJ+mSV9NZa{syAwl9U|iCx{OQc~44GpCqdKVyB0ofydwq)i zsrsTuui5(DMd)mIXgQZG#vgl&O-a1l(g(lIrpmw6<31=ot;^#U1-hP32$ z>@%Q5V|~BMvBU>@_I7+aD8P!Acn&&hoKxVmRnWyXT+^U;DR4vv7t>z zkt>Y4**EZsc&f0=rhcqgyCukVK{h^A-wLWlETRr9OD&q5yzPu}OjDJWmp|du107kh zRU;23=HL_R`7clZeKCXY7P=8P%FX7zM2%8z8pav$m(-}5A$N&vu92H@{DQ-|E@FE# z{{<&K#-=${w>M(R4-K0#K!cNnHdrz@BH?$RMmeAq8(}-gH?4w{0q#~Q)>FZZV|MBT zVqcxV(pzJh!QuE*QC(0HxJM4+smkdo<)BsvLM@Bi%%)-sF)AfTDmXXPVwKpuZ|M}+ z3okMF$D)1dv3-eJ(u{-oWzguv+Ta_=(u4^K2Tp2q_}R_k^vhFau;h|S5F%2GsNrJ& z{gbTH5F;SNX_G%WTM5$~YUKFKj-kB;=7OEvh(xwkqx=jyRbohu(2v|$g~+pl5UwX2 z4nkM^W=5z?@{E-iCVX{b!d3EPnx#4x?Rh=ZYFVzoyr+qw1JLbZ6D2IF>|5tsSxr1B z$l~~!NMH*Y7laJmxw^L|7?$ux=IUrbm#pGVDm@-%YgJr8!rNjCn_D2IkkU%NXHqzR zo6>^ZDBJKA0j()vy)Lr{4}>yu?ctBGO{q|=uSAr1_RLzNdu=%b#u8pftJ|RET56&31jmFWU5cp#Hl{Y!BOJ{)9$>F%46@xAJ~}J@y=)Q)zG@tW!_{KFbjw(OE*_ zh=;4iUeEB;u4Wd_i~MXho3ixktNr3ani>yD#z~zHS*plDI7$?8bq>em^b>orTHOOD z_-iT~s%}E>f)(4-tcSb{*1g55-(Uo-y=EeydTCng+bI|Eiwid<4c48!t!prs)}869 zUv-v?_RXs1cL`vO`RzrrCO4mQH`fykyO-7SI9)ts4tgq1Xj-NtYzCWRq?Pp4SKgLd z1e+%8gPm)@8Eus}q>u|q;{i->T` zRND(Nv54vHKdzm_C4!Jq@>Q?5UkOVV=#Z5FqQzR;N3mOFuwc7Ab_RPMm|hdRJiQ6c zw(N+ThfU*PQgqQW>Xk(v?FoDx=`a}cX<*<}|MAl8sIdD!p?X%ke}x5!<`gn* z9VIkjt<}sfJVeilPez@kH!)s^*`` zmxKm+8`JWVmnT5*U&ksBgr2u9Z8rQ)Qv-iB4)eDR+xdO?ZqGiKT)8)bhzS`6V~%M! zGYua(&jh;Wx{R~iK3mz|_*g$3(l?Mr(bnP`y)(4`J{sT}FE-mOpljYlHya==U2MN% z5dGSmPW&q(=C*agTL8Ij5i!~&ecbU;oTlHQTOE=rAgF9#A#@8HrXH0UDcGnpszu*@ zIF+P(4|-08T*9N9%6QO=rVaki`h-m~)Xqf{wB#yMXz1bSbE_Kyy}zi5L$Ofb8r_v- zvards)fID6>^n}x(jiv~-#tr@{0azic40@Wn$8?F+= zn|GS6FUBjS&;|sxpiWNF@Z2m>Xk>-lPgrUGGx0B?=da-)k&(VTFDVrf?am~R;WoDL z0w15?xZ>J>Dycylt!T@{8qzO6f41GFJAHY*K@dyk%B>3wCkf;~R*EK-kO5+r4LfrL z>qT%BjgT_%sR|;(U=g5i2ul{Knr7iQc>W1SVwb7&{DQKV?Lb$3imi91$Sew$uB z^3EhtLhYwKyWAtW#a}X&Ah_CoTyHD0HD6k=xvGkbegYAXESZD&1qFJFylK8jXa?%X zcXcsk)JIJ~92Q4{Hfcg+Lpn#rT*Eq8^j{>(jkZ!=QIms9|HO>JFLLhNhsh%F&>Dz> zs6jT=Q=pl3Zff#*iG}+qhL$iS+mb=<5&ns5X@INAsHx*J7ZGQiJ%gKV%&pD}hk&)I z2OOU5i)P276#Dv8e%V*omQSLNP+3;53&}<0MQf?|>n&7WYh|`*r^4f4@FeYSI*(Va zPq{ww%SMwgH2Yu)dlQ4vd)9e=T&D_WiB^#qkNTt`AZ+mdUs;OyYfxMG7SA+Rsf20l z$PSHG%osPusuKDKx1Wfx)rlrL90Srqoz`lJi@8ln=YY*2dKA{P2Y z`!}zB?3Ho)Y4&Z9WD%f@749_?V3m&lvtjB_7J&%azcpogM+_%FX0NJB#iW!R4B|3a zbP^xuiyTgJkdANk5m;PjMBCuhne0XT`@Wmas3IlGSom1^XOfPTs-IU!)rDz#{W|&wOLEmIR?T4kDEm zCFNbH1%i=2RL9ju{NY&(J#E&t7E0Xc98LPR-0WR@{p?Sx@6ZX@WBa^_E#Pr#7j|I# zwDlo#iDqb%a3%+}OwPb6dsC&d$k6aJiv2GmtruI5dFv}HYo)3Rxdx@uSOb6BVL7L> zvtAYwCVEn72f?G&jh7}zGf{$JCcD5L_q(lO;%1DQsnk5fyt#a2#MJuqr=LxQfOWX# zR}D^v*3IhVmby@yX&Z?-Eu!()LqMka&hEp$bS%~BTJhr9c{6RwZr5hf>1Y+sEmq^59bmxp2Jcj5+0l{_0#}>6FXQtU2;RDM;L0jQA78;@S=W-|%cDrqFhbN(t)UM>s z0=RymIs6m;Fq){1y{9o-;A(B4Gixh*U|wK`fYZ$|#8SEkE9+LW&`AO;KKW{v#}nc2|voywL9=eFdh3Y+Zyt>+wKo=n?L z;j5>Ge%*Z^k3l=138(BX$1Dg2>hbk)2wT%yTa&_GT*uHUPKz^q8I^4kX(zU4CWZUd zd!PUQR57W3`lH{_3&Nw%;ww24JPqR-zl@t`hSx*1+9I_4gJHp0tf023Enw&W@LPKrMd)^WdvyMg{bGN; zSuQtZnJ?o2!(xo*ah1&*_waoZ@4t5K@)LfQY-%>Q{uJB8gUm`)whshGa<%(9n)U^K zc6K)H#b4k1@^ays;A*vJbo1u?9$WVRD0{1@HoNHEH$Z_>thhr9#ogVCI~0n$Ybfqs z+zD=>P^7rKyM`jg-95O=$+yqm7w2N1G5%M%dPmlHleN~I&wS=@QoIh%%aedbwU#b! zE2cXs{BAP_JN(P8qeGuGr9cR?B2=KAc+a&&7ipd1iPOs;5Sqm6syr98N3hKQs8N^T zf52_rY&{$Mt)bt`9K%}rV@oN4zCeNAzlyCMzjdZpU*RKaS;cTWS_)XR?a{_0q6J-| z5{0X+89r-&T8ak^MF^^y-r_=#3o}ZUfeGf_n$Fg?u2Jh(Bfq2Qt-3V8V$D)mkAw+^ zavERwyn=37-xKlO3xzMtb*!8t0OQ(KbzFXcX$qdImtdkkN8qY#bwFZA$G3g(Q54?4&o4m5R+QIN;*H5e3_Ks3)r-+-=oaw?Uh0QX%yPV$ex=!3hVpn&XC5 zTJYcIyDHo?E81BLg1!wUw1IT|eDffPIy^TzQyozUVg zkM?QWzkoSq)`M;9JvqPKN7(?~yQ76j1 z`0NH1f-k$+d?wwW=1j59BEp7$d{9{ce+*j%p6x#ge=9esev_gPh$@n<<1s5-9ICHt z)%wfZd>&9-FG>~;BmWDF*sBp_XsWB$bP+%>tI+6!VqtjPpcVA89GwoG6LEcskKDbr zR(9i&IlCid3Uj!{eOp>Pl8J{UY7{EJL-=WivE6^$31BcX0b(W<`nG(m+vNVoPkP=N z1S0=80BRM4BXCYs$jO~Y|A8}o=~C*SG0yuUML?)j+pxf{*wtt?hU2;p4+NA7-SCZ| z+!Mfw`ygpIVGz44O&6PId#uE1sL0Vh>HT(KWNdfrvoxHXL$?V{z$0o-K>yq5^+ELe zzuyRv6u(miuN-m1z0Vi1qC{?Sn6X>cYtJ^9I5e6Jw?<|1Hkmd2BD>PBOWOpkMcrm* zTJb=QfsLW`mMANO2lq&_7OrjBJ&Og$#-ZJlo&H3<@)^4?KY`4;biN05N0gdJ8~Skd zl|pK9vKE$X*n;H^0zT#FF1h-k*atY3YzrJ=o484JS+*SO7z#+mg{ zo?|oli4}|a@*=cP+C@kAwL&Tt(eiU@o(@@7QVbP^<@U)LSpDj$hbBJF+#A1t%XoXL>^AAV*rWsze9UiiUG!45nd*nM8+_>L7}w^IbJZclgB z*AteqdT3YL+Y%VAeRa}hxFG!6w5_S~HJtaNb=X}bp>LtsH5Zv+CF~9xJJ*ESFsbP{ zIPxSn*yY8BCI!u+&xJz=l9I$6RvKhWV=E|^B&c1NN&{wqMBwY zJQA=&BruL|bOHp5H`xdjHo$hn@?XfdFXqhi^4|`}{xlDS#wzbCi&$6Y3bs1*_ErS3Q*7TNf3uoT02Zc-I^+x#X1g;#wEs!O*Tl8e))OTfBblgP48Y|* z$_{HTOyY{4uWh!qJ&Oz9>iBf1;&9F&+(VF8*+L*&x2qyV{$s*qNo+pt9uER@UBqvn zwW-8^AhBj+lMK$G)#_`tqJ0i|i94~_fIswV${?z9qL$5JjUW1)HJL9^Hh#su1COF< zfW4!KF%9jnu*>c3a7Wx<4F)cn70CE=7*$s^I=_F+`xmR~7NJwwyZ#IU?(x;9GzG;~ZTfxF zeMqt|R|8_O2SfAsl2~os>aD~&^2{k^iGm zG&{-C9?2;1=Iz=@Jv>-jp1%mcoR&A-xhseuBi|@@hdkXdr9@bRF~f2Nj39$x|Jvrr zHuvM!u$Cc~V|@3jyX(d2d1Ww@koVh+0<+-Zv$!zZ(mFkBJSJ}#GR_@Ni)i)CHHZ^= z7wYKWkqvrXvD+o}3t!%uVH~JfhtVQ@Db^fs4enR!TR+vKFY~9?O_We-4m!)(;f*3? z$NMLFS^oti{g2v{J_-0mCYR{%WqFLg)ZUmfZ$@S+1S}eojsKKoa(dj2A1R{dCE)J{ za`P5vFsr6bsL|tOwWE~Eti7+rS$B0f8_W?>2ac|_sHuJft}rzTKv$S~t@dA>%UtB1 zh-H{&=InK-c{>Nbc{>&-@9&UP36eQ-o$dLH8+jkM{f8{$q@9Fu`deIfiw+UQZ)})* z2&6kU^_upHrgm?tx?m+uXvYl?45r;-0DL&(@)dR|`u$Wlnda+%uhT;B>p^uO=rgVr zFZ*p%@$YoW^BJ4>cnhkE-AVyTXn@TGFX*3bla#w0(uFMW2)H5g$i!Pf6l>GKV38Yt zth5Au*@VKr+=Uh2Fnjmbch9aW`L^Ao?Yw~EqGnrvT&uV+h4s&b^p$}+nU%wG{m)cJPdtHe-c%pW)a-zWpPx*6 zrZv_4MxpFu4HL?zGee|%pNG7Li9g{=BAq1EMOvg-)d$g#OoN^O|0xjg;_B;t`@%-+nGVUQ(@Car&8oY(bH*RTwa z`L?049V9oY_bm28c};n!(5q5?%jHCO;DK(TD7fKgwuU{ojMm^F`%aR%{j0j%Mx;cw z2|vLId%_by6H8Zr2a=hKoUZGknaU?M?9^%wgFOEVE)u}63A7hcO~(8-YMsUBU^ zshEvdGass&T}Q51WlDPmwK^Fm{+}}96>opa%)hlY&a=yZ8(c&$AUAvme#u9gX@jTz@pu!^t^aT(!3I3m5n(e5N9 z(ysWG?s!@LC?DvbcUaRow(X~;ies0!)F@?oY$GKrRTdC>U|Z4I-yb*sty<%%#KmyW zyPo?Xtw(aFLK>$(W5Z{?x5J8li6%nx709w0HVyxk3a5|hk$WgEuc1l3O+JteVKn{#6*1CoKaRB zw?q#43ZdO8&^8R*x&F_>sh0(KrP?rX*^qxKD{NPeGN|Vu`nLssHmZHN_5H@KzA&>P zvsyznK>|{ZwBhknKQybv6pcv=>pha>FefPeptq5X`~7&I`87(_zLfcwqAqC{DOB-8-iX?Rz(dMexW6z9B1_QhK|!>v ze+lXR%|-sO#H}C3wbCCgkIV^$}<(C1brU9AP4!J5)Z(1|Dytp7=d zx!xxNMd>$_oe@!lu38^T8w-2~K9-+B2db@sZF-(F8ecYLva&X-%BM~SU69Nph%dOl z-0lhQleW&iE1ka8Ch36%`M0H1tL4|9AryhnCrgatEl!u+{DKMc*0tb`j?iFc(b7~n z&@>ei_rI1XQcCCM1>T3PC1we-6AohY3LN8}B@)$Q?}*l#Y-yUFr}x5$^K0F~E0ZkR z;GxG1hl>@t`BAtPoVuHy5yI==NW0vQJRgzfFlz~xdA^3ZQ6G%nbbPwwz1en+CmcDv zw`P}GqI)#U6Kb{KALrhg$`Cr@Zq(yacrr*zty-8p)pe>_bX^uGba=U%41Uhdz2)v= zW2cU4YrGcK#zd6O`VQ?^cG%uA28(&Ni9HooMA-6xcLuRZtL=reldS~ZmHabFPYy$m z>&&sCA+vy@ECyUQ@ZRjLoHR(yv19|8*pdEj`$DMYN^6t|`C&{YnamtBw> za0Ih>wqD5byZHTp(hxM{7FHns(Q3Cl=gRMrPV>K0zJKDdUraKUQ(HH>!opoqDUdNr?SS5$2iWRbfk-S@}d&UuqJ#vZ~I54McUd5$)Ud96%`^mOCWDef662fn~YFQwtfnfRmkn@ z_VdR&{rN#em-g7F5tW1-`J>&ry~W~Om^E(M;|vxrl3HpZIpF}!`+|QlDkXUuN8aV|duv)R;`V(wE&!bD%Gl9IwiR1O$RL!Q>Cb&cG z>AA(Fuye8t)>uRVo2odntvLbJiF=wIahA9*2J^!Zo$GDmora6V_Q1b>#50|jT)(71 zpAM4Oaf-oz(`hFOT#E}>MVJpqQ#37?k`*|Z;pLULHb|Iax+$$UMH;(&@|+x38JZl{ zeXn3D`t?}X?SDq?nMu6*tVv+7p3Eaqz-n}^%bw7h?_*l(avPcdOtOXjP z0TfbL7uaiEH|46}6@5*I={DZ2D?dbCUiB-$^)sc{ckPMGTLYNTk(u3xH2*z2;{Bxx z4#?Vb`K$|f3eT#dDUrsK0r}~u`(Jjd{GJHd!1|wkQy07Z}%=mw8B`s$ zgEUu;E}NJ7xo~BKVzAKWY0n@(${pa>vMbkcxxbEbHF+!i@J#;Q-R|Bt5r&3$5WmVD zo?hjiNrh9BA<`9HzO#*FlQQ#cbE|AH1l%(nxV*OQ$4Y!TB--Gy=zi4ri|Kgxy_jDN z5X_|(z#i07@q)BeO3nRl{tHvSM#COx-a$w3Prj5stNxP`bM$V5%+mq!W-!KLqnGr% zyn)n0-Hvk=GxH*sD9ez!2-BK5ZG8A6)ckP%ok)O^I1{l;NR-B!0$4BjfRc6K2&;UT z8riIR@lRX+;)Np>pH^K%Hf|Z?6!@K=Z7w5)IoYR&&)x~6Sww4m3%|{20mO8q0rEFg{&zl)J$!xN5)Itf_sRXol^o>x{Ker2 zK?m;4l)+L_lR2Sk5xNHniywEt&-ppvM&DKl;C)(_^igZ=RKO2{!@65?`<5R%om>*m z#5Ykpsq4QlZI$C1OIF}1<#PDW&hQlc4UA&ht4Vtxe!@@pCzT%mU*6fwX6xkWT4RfC z*0RXQ)21&=-|*GrWap!3g{&4GY1u)!U?V5ecfF>)?jS;ca_8|LksLPVHdUL^R2;8K zjG(jkk8t@Xd@rjJlQBd?=9^hc!oIssn;+RQZm8$sr@THS?V2gmS^F(mP8s+!+J8fj z^ck%!0Gj{q);kb;h`PQ5hq$TJwVm&^-Dm z7rB2QZ-?74YZVaDk1mndnQfFwZNEd-`?pcB=!0*=CJR}F3?MjZ$h$%pd;0`qS4F@1 zD;VO7G(HB=RI2PLaB3cmUcwoxy(++5I1UE1uw^jAA zXH8>it7FnJ#rgb>wi)w7!i=-FPeyLl#VWiwnXpUi>}IiHE3Bt@-FsUn)+K1FLc~mk zmm)yp?A=Pc-|&NO2k(BS(M@fz&%NGU5b%%XWO94CV?i)bF{IP}e+qTRrdP|SpYU#Q zl$!%{V*N2%+5w8_p$5&iJgjy~Fg`~*Dl*ujV^KHKd2e0A!XSbFI&~@5I;apCoZt|H zBCO?i2lrt;NId%)F8eS&_KKASmT;0O!(gC~k|`X+6Vps{C_^!j+O4d1L0`~)9;NK6 zk2dh?ta7wsVmS@MqcU&LAY+~25>WDf=DQSi< zqw%q?T`G(h)90+`EkLb#>8qaRIDW?I+S8-4e5yUJ)Xjj;jGc|hDFqv8=RP{)UA#gJ z_PDkEsxRGc(bYZR)gsqbuP9CjZ&IgC>Kp)@7eF+1)O;P^(UQl3vh`h(UYS= zb^rF7`;)-hATo6+$nA`3-7}h9YDci;N16-1&R5CnEd^Fsj9VBVB_tQ_p`?RFJ)tXZ`ccdsB0B>HzyD?2ZN>vClB4QtR$cS#v**<;bz_|CZ9|a zMQYj9;N`tt)$nwq<3*r*;aZZ~aiP-X`{QXETL?bZPy7uSi%Zwz0|h~Ol{ih!3nmt? zi!~zU^JqG0^`PEJnOnOyN8~2GN?`PNywUY&^foaapGnDod2Uly_0s0E5X*682EGT9 zVKve_8mSSLqn<9iKVbJ7BtMO;0h*FaX;snL=JwGUrS2*oAY)y%AFdR}HK#bTb#ZEG z&=R8&X#MQN3n~uM4pNN3iD`~O&t(56I^iQ z#1)2Lr0g7Yr$pEf!0 z0@DL|t8N!tmM@Vi;Q6KVTr||)$tDp8T$%XoRYs2B<77V{I9gGS_f{|>2Mtwkxr(VYVmD97;= zDY+iW?Vid|ehFks*;N+Sprd43EFeV@GWq;L!V>33!l3d_&jBY%NZU#YmJ9#L<|?O` zHI-Xd+M}N0MU)bsU;I-eq~&KF2H%}c^as9_GfEkmgMPt7u4LHVSQ*{4S^{`f9t$hu z=7E*eYV&ziZrkX;JWm-7zP>F!Ras3WeG&b5#ka4nwVtJGm3mfc%M9bC)ChkHM8rom zMwuQiRBJy^@!c@$MHX?H7~ZW+l+oZ_-{Y3NzXKgtIo>>ejYY zQCRBG>T-B>jazgLZ?ka$I_;N(n=dN(FzV)51VJz zW6Gs|Ii?VWH9k!cPl9!G9lbCir>qa0Bjjr5LT#@K06@CEFgzeo-R@w@{Oh>F~5Z`yWW7nVC2BwNmR4I%^6cCDh1_O_xtB_aorYh(GVg@jJfalYVG4#hj5MzqV+i+i}W( z92~4%7I*d6^{9yWf4#hM6NAX+6^-BYXO6Kh_qt0S%Ntrbr}C+S=fR#WH$P@V^^4}b zZwg&B(1i9o0|>5oR3;~r!iiz)yUcfeLGf9p` zQDPjD?Z(s$VfH5s+!_!k%EA2*`t_G8-T&odfPj4T;2NG?bUuW&%Zb?k6{Qx5e{5E4 zeH`Wk?llF~f6T$FRcFs>sfIY(-7V#Z|6XmCEUibqwvOhqZNf~5Es{AZ z4eCj3(mX8~J^WKw64X-Df&u`*MjLUFPPDN_qn2AJTr}7V%Xrz7B;h?^IQRvJhwI&A z*tlavcU&r#MlLp28H3HTAu@M5QT{N=_Ufl zvWS%KfRzem8$>+1x3#SSYSF9Pm(Svz%G_kC1ffyoCS%SIJK5r&HD2|L5OM23a*RIx zT>lN5VOx1qGvnBT~4Y=`o^S~GloEn*{Rgh5!#V#J4TLX*S& zBc5wc&aBzUOS4|9D!=Fk#LEj?%4C2$$(7{k)JJuAyRv05?u@r`n>?EXX~uC{#oq{a z=a28H&5N1IYfk&=bYsI|%nLO}9c$TK&PuK6FkUzpWV=O9h52OvrXj+;6UxR8VbdQ7 z0By1gctCdwDggkn@j4M-z?VG`S55N)bz0uRpX&RV-+KzjXL;&g=a8hp;cB!QM#XzK!szo*3y0otS4#HN|q}$ zlyC5~Hc|}6(_J%aM)F*^@;zs*R%mnpHwzO=LyPfLd_V$UJzp&=QJ6C#5IkDra zy)7A4?!G}Txf`(+E1I_V9R^F2bxu7;?~oeJsqubZxSxgP4vf^?uUzH9TeWv4n=F>b zUb3UsY75%A8D>qVLw$3HZtzJC_s0J5>HPTH-oPo=%`yb7r6$ty#~Gzbt)ZaWa^lM7 ztjGeHMvphfR%|V{4(mDs=J<3O6ZLq=tF$YBx%sB+TE8ebEbHVqO})_J#vcMJbR#{~ z6<)77x>D;h(ikBm#X~O%Prw8j7W(;kGln0QLqu0*7>tAPEb(S~6*KImlrwcp>{Z`L z+@*eiXkQ^5D706>_3fwHs*yL60@q>N4ash%H2N^Cr#}z{JmNJux&Mr>w^QWgDPgGB zOtGgHgBWZQgU;FFU)KGtZl6%#Aj59^f)Lhhu5fH)nTJOSdWX&*q+6prmKhe^!jRIT zfA!Pkq3w%dyw@C~GBYV?>$YcoE%%6tyvl5_K!|u`VaDQ*wPO8`6o*f`2yz+C^qhv# zsJ~JFUqDZ1I5CVs0Y{K6>gB>;PX0Ok&Z^JliFV}(#2aIh4+n7dx{yrAYmpgk6Mxg?K~XFpXL$^;!^=CC};DRxPH1f zGx{6zxcx}TDpiLoImBtQ4;)Z!?b#rhNQJ&G1LALa!1VHkek+lS}c|QI+Fr@^~tcLgrzWN#x^k zsIFh99rt;Rp}*JN=j&G1;7{{We^4w7;�~f_Pq(cDW_<-UVyGH5LG{(jGf5xv#SQ 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

    t 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®VhI_rrm2+pY^4SrR`;;BZB@ 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

    7+8uXKu}j)hNuSMKWF+o{oW1_K=ym!`=#jR-* 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

    d)WT@$F{UE{%70TF}GMWlFp$hVZM>>JXt5%h#>! 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

    5ty*)0_e0YrL8I zT95Cigl!LgVP6rPf9X6o8Pi$Pyt3zBeWR6R?C__GH>?OeR?5g)(eH0JM}kua*l4Te zg+k5kkx3HaRl%jCzp}I%liEWCr$rO9a#y>jx7vd7=5tG^mer7DWOwCYe8uK%3Ugyt z_qsZ#h!?7fY<@-Unt34dd4@ zsobx=VV=ZdsXV;G7^L?jUWV|SD!98E9(KbGem@f%V!wc?GfihuIzH{zDH1!NuX^e|oXYHp z_Ud5GSt!<87`p?C5uG9k{O#sA@LUP^**J**H$%vQCh(F%hNifk; zsli+1H1unEl9$!=LM)iIg~?Q1gL&1b?KdM{F%%~mH@vjV+3_f?GuiSAk7SVLa#(pF z5IGX&No$cvs@*c;v)pFe$vJHYMW))TbodjSK%;n4FvU2h4= z|0T-cr)TkWzWuX!Ethkrc=}4SJS<@E?PKfx&CPEOxH&)8Wizwa9MjMY zZ1nD>DsO-WJa)ygM|v<#xUPTn*R%ELBU%-X*yh&4ERov^reQkozetBp`JW=~o=>KI zQlO}_*GUKHt!z4{J%AmCg>a!K;pEqGD@}Mf^}vNMb-C};kzdR>YS29=Z4C?mJ5&?e z^nWM9&*E3)x>$9cHF)2Caey{=Xnvsoa3l|$>x(xzMj-;x2<~q3X(%9pawX^+-V|~? z)$$kkJp4`s1!Iq4LEoca-uKXJo@5}td{tCQ>ox2*^t4KpR58_O5T?9z!zS>m2fS94 z;#bCrJQ72;szPg)s~J=>c$((&$VsV}wgJblJtN$*;wf-j<$*0vu>{p%#t zfu3a*=2G!qTTS0~#7=n2TcsR02gzK3G6+n?mY2GOTzjtfD#U(0HS(J&`1xR6U{h4G z)`ImiikDxp=JQlr5DKh!!YRRboXRQtF1X9~`PF z$ipM=4<3pY)qVfUQV@Wv^mQtjW{jdYtID0eUbWPN!L;H^E!Qvpx>f?S3{b(7Yo$OQ zPNDzW2jzxUi{Z)*Blt`EyeWDSj{JBp zDs!{m+p+ISp1)A5&94X-f82jODb4DqNsvya(u@}x2;6K?=99Klbwzcsnq(QJGXhQf zK=k8;Yhiq4_|Uz}dBce8-*6w;=w1~(uT=}sJXfD+jw*AkO0Sz=?p#Zm$Dh}*UX62p z#D*!}cu&(Otd<}3Ovb)_8CvX&)pK~sz&cB|sY?cbYVY`f7N{_*ZG8GMYvlEfY)k!$ zAB$XOZltf~U5LEg!Q|aRV|on8dzI8uxLJztp&yy-o$ou%Ufxs9QB#;r0qW&Xmj#+C zo>kwT!8N~L@xBXk=l>>6ES!zkz^4l*V-2|4J)C;xbsANOdvjz~#d_P&Yy!vtN6j4i z<|R9{vCdZp2f@tZ$CKIVGMCrl^D;vbrVf24b`NGTjYb`Hy5Nr^v^Ghe1R-Gui)N+N z1E2(*loH;{1b5k-t#y$Ek@$qaUg1fon@Q}kVP0qvjC z@)Z~5K%N}=KvnBJUA$&HNTfS`7t{KP4wlp8zjL44HRyEA#luhl-y&}f`^uO=7(qTX zhAd|wlxVZF|Ho-^cXl|1ICq~#>G)QHnV`ELmP`)NzRu0q?B3|a+UqHRcg}MHB~u@s zeE75H$gF#5#60@njF@dSm+h$sA|EohvOAQikw z4^OM+^K;_7<}U@z%KrMPPikGmgX>8V$G9Dm(59~`l=s7=B{k(Yoi2%`B1&m_-cK3Q zF`UxE@UkN%6!Rq$ut;UD)43K7Pt|PvB~ZLm!l`2^%t|pG;x`cjtq-17f@^HTe~vhA zTH2?0Uq*{vO+S5#RVO*O7_K4%?=s+#C?m{c9RCRY!ba%ac{e4iljO%+zQR^UAc>$L z`Le#gOnl>DxlVmZa?Lx5!l&@u-LkCsP2IDq>ge8t*I$otn$9NA9|=DwZu5!I3Mf7cYjpjarSl@HDI84xS}NFX zKzzQ=`6?_vbf|i4VOdLj$V}GY$n$*~u^s6Ey*uS6*Kcb}*Qz%{G@iE&kCkBLc&GNT zaQ80m>;jEe(qM@A&hhu>ohbGc?%P~9-p&lQtG zZ5oYrZD2mF-S0on$mT{I?}s2^iT+XB8zp2W4rL<9MP3Qe&zBn!i-{TbNhC|8yV<_T z%aYWcBD?ET(a32;5*|ijDg*xI-N^>0P23K+#G}Tbot$aO*7JWXm+A1G-MdZ=;!QTp zLXj_6ua}xdm68eD5AmaaUYNn5X>pUF-Tr(}`K{o1lm{_5Tik|^__AIwU9|M!TZs9| zdU`u7h|QJdme5jAB-h#$Dqcyxyx#n7jxL@iG~plNXXED;X~(>5oUMC?tH@HWkA|za z$bs`6TXnNxyK1fFF|*9{m13BVouz z5&_>@DK%s5HDQZq%JAmSl-~L`m8rz*^;D-Y?wAiw9!J#c>WQ|=IhwY!wz@OUvAOL{ zQ?GvDrH|l9o@e~gx9qQEJjJ9@$tw9F*GKyy>!yO--;Fv5&Y^LOjE4;vM^iRw#$56lFYcnhT~bUYS%O;9#maP{>r~EM1v$#I-lo(KepfT z6I2S;D3eac-ee7dRWd)Wv68OaLjAg0jEA?g?WjwN@r2kA?$67|aiC}Nh5Ht?b6y0b zIJSIIHilh$z+&lv>ImB&_Z%#*tu@y#TMnxn8;4p`{XZ=8B-7A7t`@56Jbb7^#eQXJ ziAeMRvfmu+>A+tn(YI+AbF~h9_^$wb-v_?$r@rH+x-(m97R7UiQ01TDcFHXR9MKmq znQjZM-@B?}()tEIW`2U0Jsso1xt)s9hGe{1MX<7N_e+57_tCu?e8=}vRBjGy>`dR% z|DzoAxt#^3@&8?GHnQD&?q2;JhTH|DyFX{(5W}AICL`}lQXD^OpBD7EgzhhD!`8bZ zj$Mr<0^(uePp8?X8BS(h(ri$>%vAdlF17c{XuP%}aT9EWnX5fb{f2vEz%ZsM7c^Z|;qwL&6q56N z4*Ww)67WBcwnz#nixg8vk%V5OA+fBFTI!C3`-Bm9it8zdqz?Zm{l8FAsl|t(kyRwd zCS!F3VvSPA?$kw+<*A-XXY}XOQIoOY%Iiu`g2yuXM>=Lp^fkk(F9HkY5fqZdvplPy$ zkvRM=f(>GZ8aHS0T6&FyW2b*P%<8_f(dEO}b*vo9dnsRe1*%~|F33kbqS>>rzkY@O z84d?2nV~|%2{bNc)KjR2%Xb@3o=da4om49L)82Buoj%>m!m%EJ|1``UW&c^u^7Aj+ z%TEmuEUq4Mq-`|Q#PK}pG@GD)7Hj8iC%zf^F}6XIgR8hck8AkQU=N&<_kMO)>=gQz zM_)94hM~v4l2{zj>bUFGvDf&W`1nlP^?Ul9^Dl0~1d{9`v81KAHn~Q)p_Bz3jd+{^ ztYHuBwkd)NmP`v(uw`%X{@L&QPb9IWWdt>$#a|ytdmNvjvo1aFJvHEDL>Z&cG{*Iz zJ$Mz?*Z7!NP;GD$rFXn~b-ZgE9GBben>qB=GHrZ(w;r*zQTLecp}#cC61+vFF4?lv-Lul%ePQ_i*Fi{Bd_Q0=6)?d)l5@UIHP=M|M+YTOE#}{cb-?_;%dRS{}iE!*gx} zEorjtO0~mRbFW*~P}YdcefxCU_xW@WR&C=%f|gyf3`*2yWlMHauHM_G$Omgur4;Uk z?^XLDIW*|7Wc3@}w}Pp+h?J#ID=pheAg4e4Xu^YW+#v%qwyV6WJf^WyWVgq3vr0+- zdex`&V(E3vFKG6YxiIGb1ee!U5^WE~Jxwd^D3jT)^a#Mi86(q&Em+8o@JqS#Hr^Fn z8`8Glk5MK4p**+|@EK{!cv{$X!$eQ!MX5qz&gv8qOLuc1#)Jy)ER(J_)l(_!eaF*hEksG=mkcGkSMX$qYd z4T%PE-<fo~7Ww$9Pm81w%273FKhQ;(>EXvOyD8)$W{dG8IAEZ&Q}^cPB{T zT>IerFoD0^n{8)ra2h5m; z;88v00y25Q&O$2<$wByOt+lUg?XrY7S*4M28<%fZvetb!eBa+<=i;^!X;^biaz5bua z_iH}`C(BaU392~~bJ!)}rwE~=Gzy)$R-#%r(Vxj~SjG~&pg*k5uk^hc#RHF+4VvEV z;k>Zfh5KF1&FAEKD9>X8Gf|X^Y@c1~TTzz1H)gW02p)u~vB(^5YBiXhN%%CIe9snr zTe7R(a6|%tIFKu{R3j_bpOV35yu4Y;4)M7sEKcn$DLk=!e1sN_3o!ZNM@RX~%gFsdS-8sn zl0Gf;nlKgd_I9lllMP>nj47aZYbi_q6tc_hGOwL3HF_~Tc%hJ`iwpsCC8{_Zg3Gbt zC7A4kbnLuxb6?uE&%iV}jwf>bHACh^L%c?w@x!lJnfwYDBx^j+=?u2v-QKVNC1crN zbIoQU^)|b za$RoxFhWIzFGHD{uYG;ifHF={4%Za@BS#e)1OZ$l0NjOw@N;i0|7^S>sWdl~ZEZtH zNK|3qmMRO4>6Cp+*6`D4;A=HB(x`#@w)Hy`mFVt7R$KBf3p%b)umF##I$dRzRg3%T zkk`!(6z_xo`L$W^0)_W;@!nJlZaZWAbL`8+2m_ya{EZ z{la-#Ar3xnvOa(O#OY9hI8wa&Pt``91-x?;ktRSN8+V}5>@#H~>bEa$tmhXB9xcj)eq|Bk~8-ODbPib{B&x}|p77Bw57p=%w$CD^}D=35!o8qC6( zPkclz;BSBXKohNBo{j(m&@5*wMG`LUg0Oc;I4t4Z^w1U!7kS*g$#zr7nUd&?T`rV1 z$!>b9beAEgD4t3I4Y}6~ey5Ut#CD_mPi3joS{U72qZR!`^qyp5Y)PVqF>T~cuNLC~Ia%i>nzp?jlfwKu z0LEQxzui@FjVt@U8!5H#QJF4UCL(cNpnkvSJqilvXqU+jEg6pAXQx;BdK9dxy48)m zz)qXl$U0jp4!eR=k<-y!j6&W(Pvt&-;P!(6gytyM{P4Yv#Q!SKoxapT4TASCwW$^~ zn=hceujOj3jVRR{gC*Gf0_&-%wo#Zc?1^X=cUM7|(t)NH1GY)fe!?|+WrUAp#9zw= zpz7ph<%7}r2sJ;iAqu*mUn=jY4(v=0KhV_fo>NYBpq#s6BRs2=M0Kf_YyFmXi0{_i z-rgz!G~(T#NU|V>D%?Y!W)CRItxeB3mu(S+MNK}!MA9Xw46+Ts1p6E4)b9s~&d^X_ zrG0aVt_JvQzix4Qvk_fvy3g&!9#DDoQuOY9^sdL5ryrGW9VE;Ve?o8i=t1H3oYi_V zFei6G=uDh><;LGR;kpnIp6IgdV~m7<VbgiYSbp($od>J;Q$aHIgM-uWGGRLTf&T~6&hKQWD^S|;w9kI@COa+0mJpP>GkB) z&<=S0t^5a`In-zqR8U-qJgs>fee>8UY2tqVgyHQReYMC(ONdU)Q%Wn+WzC8mzLE;& z%3d+KojbIM`HpobDx08`BPA4&7=_N88XZ04!@6ZJ15f>4_i~U18=~ed&j{xC{vo6hgUGm%jTZ5jH65ihRxxGx zLoGJ0$k%{~&DY0NL?0DOC5-dsdkEmiP`)OH>i!3eSj_;CiG@vM~!)bs9;@S#M&VsUfhrUJ(It9ZrXp=vEQ+G;NoVY@9Wr(+I__x` zKQbIQ9Y(T(oanw6mau_MMKod3<<~qgc+1E-)aRycz2sjA>PWp#pN`s@dR|?jF!F-) z#+LKcN#;Y^yI4+3x=rfkLFTT?bq@s>@>ZOq;&4yLFzNPKKOrJVui$thE)jE(kv(CS zCh}^b*xh~~>$KKn%7hkaSHQ#pW)Wt-<1Qbc#c#il)#$IwU)F#6r}d*|kku9-G;lsk zSc3qbQPOCzaq4A*&%kIaQY)nDKm8G3gvFZN!AuJbcbv~lhv|*94rrcDb~EC+tYVGz z_=REnl&YV@A5$Mq>v^Ed#%EzWaqE8EEpGp;uod1R0TwOjROr$O_nBmh=`%-NkN=vP z9#EbitL>B!GpllSvj01|+T9$;?8dggz{|N{%DAMMFW5Gf&DTqqB0Y=6bU`DEUkZ+R znaJGkij}CV(knxi1G^4!arn^E1s5%~F+~dpO=0>cM0~z9)lUSM7Y-9&++@wdH?xLf zF#2aU$4n5Q4$2PI-sLxvUY-XJ(cbD8+LenZ!nP!a)8y5qKYeha^)Y8^GU&gKNv+8k zeYseUPpUnStB-M85yT^O_GMyZ%-d>1eP~S|nDM(ndfT!J#y~8XOxaEiY0=g+jX0-n zFfc`o8xf*y2230=6#?g3&)rYR=gIB2jbX%4ZZ|Z4s!M^wtE;bgeF^S6-JbrW zO45t?-Ebros1R3HT`m+r>fMkQdo(@A$m`umUYtbI%%q5tPntsRsR5X8PtbHr-UZ3O z^Fq>(LV8EV1w=ZK&O6x7T>6ChC=Hd^I=q1zp-v;Z2m;MSfvkX@2=R)QPL`m*F1PMI zMtxOP0HA@69vQi8BV=Ee1zNsHdTugOdr<0qAkY7KL{Hi+pnAs*mIil>NgPZ4P{tP~ z9`1fG%X|a@_`ZL*4=b;bD!vDalshho43Q5)XnNN+!0XzGh%(@m>(z}c3m}@uO*Z8j zBqe&rC02UMhwEJ!v~4dzF(Ndlgz|jrRZuQs{(2I3Le0Ntra6xD`z}j0;a2~{;|cQU z^8SxHE9*0orE`iEPOKF-y$N>}TkDQHgK7$Td@@IQ(F20}i=T!f&^9vW{8ge5fIub z-M+8-%ZQ1+rvh*P!?e}DO~32KpghRe8iDqEk;32m-92m%~xzbUO9@lOiCE&^OEZj44DaycY*al`lP~$3lBa49`mu6y5|$DD6`GrAkdx z2ifTYP*iL%2GvGU-ovV~oIC0N&eIj#7)x)@epM5N2Rl@iQJUJC9qHxsz~pb^{T8go z+_)PLJSE^?g|b%KN&VHMRQesOFg6fb?4zf98W)PBfP>rRh* z&UTA9JP^`(?a{`%cM7Te1DwBfvDqpN(@(B^kXi6~1Yy7QD%pn@9LV7)b2}Jbq4R zJ5R2Wh-0G75q0#i@bj+A>mrz4EwcDqr&?lrZbv??OV&t2XKnF9#MbvwE{8uo7R4bU3k zHXx`!Lal}POOTV#_o0By~EPHXowH8y9a%s*hPf2RcU?J{CDdu6RB z6)U$D0_LYGH9K^^uZy-L_tJ#syrS<;-$#Sc?03_n52$>Q6>@XOv%fp5WxJGP%w^}t z-2BO%6yG*`=txY&FrZROgN!aD$COSXuIUTo1y~s90in8gI895;VH$f1Z<`+mSNGj4 z{3Y-f>P^_}bYBk9(%Y-#S6|}#rH@zGrcg}PX7}%$Pd#&AWu;Zg(mQ;k6cx?$v(W9X z?8dkDMZ3`UH{=71O!mZ%06nthelt8*KD%27^2)@0Wb$_S-n_l+U&%>XZaDv*v+ag@ z9JUWZki5g=4;oAc}vg1zWW*Ng%kBRRC41m0-YFTF!Xxn|yF=|i;Jd@RZJZ^3wms*<*j zs0d3z|1QspP!QJqg#K`2T^kg-$k65na`eYJAH8SjAP1nIS{*!p^M4t4RSSps6swe!1cEX3c&ji8KW3J_?+ zi|G6FdG~tjOXhM=Zal-^Z#ZqQDe6mI&eA$<_goS$$~4Nv-ey(0!B)e{`85Ghn4;pB z8KD@bujU>sg2S3e!s7EXET6WRR4Yu-{M5J_?i&f3$f%>DiOKfvng(1RDx)w(`OPLg--3k? zFOr4pt_j+x>!R-aUH@#N9@acf=*Q9$9qj-6P(Qxt+NQ5qv)b>4S@45vYV;&Joz{u%Z!evTO&bhZ1X=P_is?bm)Gi>~*n6$tHitu&t=%7MfQbwtG6m;}KQ^~W=4h^p+rQNh^FB_n z`fmm2SaF?a6vAdU1-f|)E_i1VFXBk3iJEhL)LS)_5 zMx;>$AE2JJm>J&6Ud8HJ4RErmMf2_LYtQ_$eL06oAc78)&8_Z=F4QWv2TSY^cW0_x zXMgPa#5-caoWo({_YSFr_EI#0kYQ*aao@W2-)isSCh^b(x<+vOq9g0UWzY2*0dz0u z8Ykz_qJGIrG&j4u$*OOn9yRmNV{5+v@iN%G72})6Fz?A-zBjW&T@6p`Anyh9S(^V{ z?0+&#c5ibF4yWA{wI(2gAz18QEn~8CJ$fVjzB%eaP04ag19DM}3R;Ky9FPvJ+Ku`8 zUwEre9_+mu>{DI``xK{YV6$(E&Cds1nJ$CfTArRCZjajDh|ex=Z{=;=WqiH>&gq^t z=|M?KzVv+3dO)>q@+z;_J?w`uR@;$qG!J>#hgFM+5umb%72fhj840=~lIV;kB7QN7-P@_uJgO>&W)cX`Y}kDx&@wN%LSWacuN7S1>OQIO?r9(D51CW+%ZZ3s`;t?6 z`!oQ8y-4nJwFa`je=5P=6fD**4BNs{%g}swnOyv>KQqQh`Mzm$PeqO=%J{3hiZ{9F zl;Egb+4t1_N95MIJBaSSZ_Pbn(Y^5@qbV$AX}nOVWk0_paxiMez`o+DfqHQncmh_= z_nvprEnS6wu4wzImWx046pr7p2=<%OkA7Oel%TfG9{hA+YnDc5?zg^bH|lWf<^{MUVmMZz&w z8hyerx1E+iXL^T!Syzaju?URJ+l8F`Bx=w%J<>$|9MpL$Umn&ynGmS*CLx*+tFh&Ux?Fs|Xkf?Y>wfxLT`%Cb6?D6yV2~ClVS6-8=;!-tx z^s*-9JfMaQ_!U_I+r@ZMthA_viy@Yoyr3A4vzEY9~u$HElg+rtMv=^qL zpbz#f$|+ps??ON9~)F^jRbmilz4gg$EIt0Md804 zM#FmWp=_|kwcg6+QS@eZgx0WDbsHb@(e}=kXynp9H7lms>;cAw9 zJuLe!NE&DiuvE#@O?bPR%_iZQf&-uydoeKpbj~!R{LiSTr6Y*DC5sM7^C%BEZOJ|8NCGU5xgyCD+5psDok^@X z4N+w1f%@@0cLl#o8P?q3YsdHcMVq$w=Hbm^>;pvR?=0D?`j6ORSP~VDHjqEd#9WPid^+v%ll_26u>U2c?!z91!NjD|G0CQCDwuA)6g&(m)VccsW2J zt>6nUbVwVv7nS-K(uQrktBT+MPB|>7bX&!-gD&Zm@m1@HPI?E}?NTJ#*CUZ5BZ4MM87Yw_j&!76#u!S7NH;^E~u-y zV3ffU7k0^21wBZ;gJ_|3=FnE~cfvR{(e*FKfhUc)kQHa<0_edi-()n1m4-S`jwwK$ z!N%?cOK$=)8AjyK#Losld1LUlBm_M&Gz^TMB~h@uy}?^tP@9!oOU?`Su=~f3f`47i zjE=e7Yrd9!MQkzt<QS>Dm%yzeNY?lV&GaNGH3!@%To}k54hApzU1N*)U z+e})>2Xk9vwv_*)>?@n%>bj;ANN{%v?(QUbut0EkcX!v|gS)%Cy9alN!3GHK4DRyI z_5OnAu9}(;Q+29No!NVx-m80ce@lQ7ocdmVD_@89vX zXwihBJnJNG7LSaiOGwr4L$Ar7wH>=ZJ)fkzsmciRyY@+uQo^Y!iUn>rP%vpS=!9Mt z#ou4_{SOH+>W_)CWRCm#0K<8g%#5P`+YfiqHz0XCcJTrpK2F2+yh$5I$J{Al`_*&< z#agI(o12KqWnQ9Zp-^? zqN2QfeWum*-L8$)?^%LtMF->NlDuTFzk}~{VM0U8O2deU6ppHU8E3#Ms%y}Z@7v{t zuLaoYhOu^gvuCU$|BI!X#l%gp5Q~1dQUB|Et7rB7ruJ)l^Yq)tg>K1!&lRE&WIC+( zu2cVJ-c=kpR@*i10-AXrJcOJZUFpr5^$ia_OY@okeB^sYORHB-+Y?sZLzvZ2?wOVS@>)r84Y@ zRb(&lyzn8G=!JK{{VCWrF@F?cO4Y@2R88Wwy$c2{uxp+pgace`G_j4J{va2u75>93 zZJ7pTj@1<|!|u75{2vp4!_W|DKg)5jE1FE&f$yI-;1u328Y;9tDcz$kJaGCl9a zr60;dFQyRu^a4q4g`jz%XKzRs|LGp=p9%o{%JY{)(TD~0_PI&%7-u@!#*eJ|7>v#6 zKY}3LRTrL%MR1?X#t;D^BeBrUcnU%(LlGN}4eA`*= za9%;hj7-(n7N?K8^Sv#(1eLY5Rl6RRW$EAc6N#FnMolT}DHl}16}418ixRm@VN!A6Cp3(JB6+U^6{#>p<)L#!|*=xO4( zWTmrlSfER-F*jI}X@X<7%J|y#mW3;u%YSSBK2Kz3LfoW|uyM&KjS&RsoTe(_dxR^~ z2x5=rbk*e8)okAA;fviR8|B=}H)J}67)lu`=Af1G%&Gn{qt_P}sOVndJf_PVt?-%@ zy373%D(m6X{sc#bho^4hT16H3^qd7i>dveGyUCcy|FDCbA${TT_waJtE6(BF5wQru65ndHADHKM=0Qw%s6xH;h$u}IA$`ExJ8{DD)%uZJEMgL>0wzf0KU? zkLy;tw@6}>xg@u5$@GZnC5dJFZJc8bzC=)(WvFFv+uV&!rn=7nyFs!!!p@pAdEO&^ zXUTB1bZ8<4n86P{R|x2u1yk%tpTxwn@1Y__uCx}6V-9v7)l;{bj?w<6q^=fTHoLDj zwlu%~=Zy#a?}!Lb%U8Uco>DH)rX5U5+5~{{8%;=Bv#=Hwk@Nw#$lP-B)4nieZkjki z`d0Sc(_-OWx9}2FN6@LYdJuiLz5l6p3vv;?ls~BU{_$p9vnDZx2qh_qfIZV0{_s)e zXPFlG=CIw=?&jQhT>|5l>fD#si&}h>15Ljz7i~V1w01PiL#j|7Yna=?rRFo>c`_ruwzmps_;jIpl6r-`vI zo4d+2g?9GXsNdhDD2-|dDVz0{$})FUmW5DQI)uA&6R9QnANg#5O7P^&hqwI+>{61@ zr?k((URNYgsQx;d>yPcmc9~rn1l7CzsseZ@M*4pAdfNIRGdl-&^Xxg>cv*EDi*wuB z`7SRtmtO#Fs^j3rAkFW-(G%+!&nw1^^oM(tEfK$rmGr>ImYwWq`yLw8jN7b2!aJT$ zWPsv`DK7kgw7}(ACzS6ylcpJr{UP(P9ig!^=f64;GrH22DK6jY4c!8>PKk{R@@o6& zvfja6G2qccJ5g97{E>K?w$mWr$m2{v9X-Mbp?=p3!wu4jo(&Y)%@12L(fZFyKpzY@ zO}9KP&aY(Bk%nLTue6oW8$O{c!Wwf><-`KjmeG3SNCtxz$!-mF5Zh&GIo&45-Sk|e zNwHcW!}?(_Aoq~JPd`$Ma(eH0N8fZmTG~c=MMmY|pBo6NLzpx2M)|^YdVME*;b{}a zr|;r;)Z|H=54#0&3R7{~VrND`LYdJpciy_Zz3n#rHd{S?Gxx!0@Pvr6x%s(p;)$Rh z_D*Mue$M>wN==Dq zUzAsB*uwyHhqVJ9{7h9f1v*BZeI=sWGTBbiKg%)#U`!Ot+W4!9A3okO*6%t=YmkKRGGwI|^Ba%;N?LRObPr;tMcC5b6jwmh z)f=bSmu9;tDmRs7b#|Rk+ZFh+&D-V>`Z9k4Q!Ai_pK49r)WDg)%~-lSmUWM^3e*t) zkY+66ysVjJOj^s3w= z_VYX%d@Z^kZ;5X*XWHzu+8UpL#-`MuTT7|L*a5uyEkZBVY?$jhHuyqz=T~4&;Q;jB z#B?JeDYMWIGd>IJppl3bS>-Ag{VuO?06?$X%+fibVZ{zJs@4AW{l7{0Cv%?36-|lU zth#p);UD&p*9SIrp%*M=%MKI_Dw0O#BhqZfAU_!N>tge?Q0MdR|0b&#{4Zgt&r<#0 zQ`>S5L>il(DQ2`)a=Lxi$>Gn(bpJ_QGP1TN8Clr}lMn6@~supwDJWfhdLEjH!>7{XZZk z3NG8>l>n)u(guI37ZSHgt9d=cvYq#wmE=n8rmp!y{YT|qgTVL28P@h=hspc%VfKgm zWqs3z1Nry)|Aa^^Z;PceX`TA}9e(GnPdCq*`u~+Xze9-4knB& z|EcMes)pGVQ_-4uqJGUe=Zq{=*{hW*Q-(_m)i6E#nOkfeiNAta1Bxlw3Q=318Z5ov zU~tj=E>K8fZ8N534GUy=d2ly z8rE!@lWerSzjY9kpK(!7{iT}!2TDN`t(;ucbX4AdOIh8)@qJ{-v6qD$WAvw5Gf5-h zq1(Oo#nn?sN2oXPlp`WOG1urx_8r~Y8l5nQck=d1&vm|G{TdjNWnep`q^anq_ELD3 zclL$Gsu1W_rd+;lc^1JQf8qsOSE)`dW5q0VSQ{*s+nT z`j*Z<`i8SulPCW*DeVs}HXWjDt0GXT9&=xJklq>|ubzAKH4&74g?mm@Iz|4ZWRk-; zYIeryr9el&g>EOayzT3Yuvx^_Y5s<-91ioDL7^ znL@ZqZ@G%VXxU!HG68W`Y@&8a_O7K0O?PHT5k5;#jv8hUk2%if>1z&$fa*u5BJ-O` zam<~Isa|SwX*kOUvK)pKD!~n!39r7J$yxGM6*U^W>}8ROg*|RilRMIN5M~)(fsNw> z+uE2fs1r6Jk^gSAULkX|s~8nyC3tzQ;cdQh-2EeMXT?t!{?4 zOp6d}mlgoSL=U|8XSHb&kuv)FD7)Djo@7joZy4ylkLcRlhjpA8GQd|W+q*X0s5doLAi^u3-4Mq?3+_;Z=7F5%cBtt?bX)lA~Wl&d?JUx*BGzo$3Rj$PD__ zQbma9ysBX345Qnth@AdtY?d<{Gx>=s>C_yEi*T&18dYv!&Kd;ID&L1upE(S=w!?dk zUBPREi7pz850)lC?$bG)X8l;CVq76fJSX39>b?Rb3W=*=UMMi{9mWhH`YeK6@8kdE zGqUY7K;-f1KHntTnH(RHDY$fLBw$fHmblq%!qJD!+~<%UMYzZCD%0&w@H=)X{9Q{= z%fZqeM3*&7yg>epqFeN}PxiT6hp(~E6sR`3{5LedMI~RLrOxAYKMyB=qst>;cZDxw zbv)Ir04{L;J=(N(0g{rOj;BkLL>VRBAZW!#-0m8WpMc5OYdEAkmCY&e>sn+~;vGzZ zHae~M!`@$Pvltco?;8AS`Do|J&w4wYYzGgQU?)BDOhb))L0S2jIQN<$43qDopPA2` zgcuOU8zzs23Pv8He*WN3m!mptK??5rI<8H9j=HqSVLGjLF3v$khSfX!b<^M6 zYCZFvAo5xw@8(sNI-6gpnAd52Pa=;It?JJ8-~Uel@((S$XtN}&3VJy2Y}Ccs4PjiK zsR&n^D6anc@#vFfs9%jwzj>`WosBiXzpDqL`+Vz*o6hPKOWJShX%uyy#K&bXnY8sT z7bY%eMOl=N16lR5bOJxj1ju(~gRYrOk?6W!5wb%^$!MX3C_02s{G20i6nM{%`!0wD z!X>{YI;V6&(W2XC8wO4}P`bu?lCHU&PgWk@goquPEhKg8e&@V^9Z?SGYMyXqG~IHW zOwX0;7=R;kfa<8cT@^fX%Ml6j)5@y*+Kq@zTQE?i7(grg?dY4i&5tuE=V`8JYgt97&S=A_r}K^JleKkgLTv!1o@q-pbEYu~OEocCbkmy)d_EIl3pFIVX|{OZ}u zAZ8#n|1!_tSMnJrtLvx}{=xxFv}2sK+*_VaGT?IRv;*JUWhm7jTZ3sn0Rw^|YKx-f zX`TH?`8L7EVWshl4P)}DTR^x*s<5j7{+N!Uq;6HIwL5-UD|D8U^C^cM%B5X2nW)27 z;t?bU=mm@S_xV?egt{Gs>b9M*mLjKI?&I^DFYDRz`Np~JWB&ZI?HQ>n@y>a*mvTX&1=Y*wP4D zh^43`8LYlXm3=sOtF)g!{rU7;OjrfZ`km}FaTSW!sNXQh|H{_y!oAnJ-|rY%FH+Cv zLN)mFal_rA#HL;Fs-8-5Z5bX88kQkI(%b%xC$+eLYSvC56d1-gGqu{5Qwhu66IaY^fh@1K2ty^ zb@_o>wv0HV&zAZu^pEXyH@2;|=W-mvgK-Y=7sUJJv=;~68_geqOA)3js|lzj>Ic2Po4~>25TQcpA5q6rEIvX2*7roS*{%uluVY!>ZuKmQU)N>5pjvUU5tZ>i% zjKAt_ckw~__OrV(((`<5Q7~n-kS!XeNY|Z3Y9Uw4pFa=JcGROfo=x+fplD;y541@f z6nytUW1|?7<1m?Kf4@4^7{T8=Ck(=U((Ae9D_OZDkST|_37g1sHO_%0)y~4ckW01l zMN#vlb6G_Z0NwTkeq{a={8g&IKd>l{cU!-SGwE<-!GGgaV_jQ*{#x=PdCz&XN-2c< zTdb7wcf$YW<8wiUo}E*_=lN?Rg+pvRK*yI_@de8jd@COg^EU>7dLDPw^ju_~QZ1Rz z(;nNEvG6xOvE;zyVnG|jY)wiSMLVPR;;EaPpoPOfXGAA=K8{YmY7PNuJgZ;^9tthw z-TbcnlCh9`VIMzF_tgnSk|V!q9M|1Uj?3L#h2$5iw)kX#^$4A|=ta0;t&cOHv>tAv zqsROt>K1`gU84RMxc=#kK4O-h{BhX6Ro#p|B}L*f(FnW1Gf{i|C?~O^0k>^ zEnH4|mIQR>N;Tc|S%1c)W=Ij1M^;_@Kr`^v`|X}YgTZU?NBx&`3$l_)qc`D=iW6l_ z*RDfasdTms1uVweEEOLhln7(&;}`FJmjI{!lor_m98_e+94n0_M#CWvYz9+uf@(*+ zdY?{r@P9|I$JZMboLuC&a@%mD!G1~A**yDWK_wWG607ENW%Zy4!Qs}p@D1}9zSO&C z0&P28jl%}s94F6vSVHQ_`{%EaY>RdCQ_&MgqFcj!Y8+kc$@Nf_Sxcyf$Q4f(dNPK9 zvd@wG#mfF7vhXio5hEflayy=OD$QR&9&U!39-o3N&YQbxZ1O>?`v7j1hpwjS0La`Y zqjm^W4C9p{_ikrR_oSL9$I-b|Rrk-rGI|Z}`?DK_q)ZLJmOl!UhlupoSy~Dd_xDvx zrjboHfiea^;zfGreZSA^74e6hkwXG=n34zx%U~G>sH(1!c_a{&q9QKyn!}sv1z=Av zxASf<(g)a81+Cp{D4wC!PK~b3nT`;XXoNhrF+lwRpGcH&karq<^%+eN;(jw{um93? z=#s9lVr;8L`PKpSh+ZFX=*MpDoQOV4?Rkc5(hi6C>Zg*@7Flqv(>l)&qsS*DX%aFs zq>;SypSiX+nuz0DFJ#Juq1r5t8Bs&1aFS(}{pG#F+uFDfN%86RO#HO4DhKsV!)A zPD~Dtr~p>4@?X-*M!y-Kj;k&*wbm~PC}4$xm|28IY;A2fPEKJ_SFBWAgi&uX@jPOj%L1`Rj zZ8%$`E7@=z1dK?GaAr?i^k~cny`Un8N9Em=w*+@|Bs4K~b=0dhX4%I|763KpH$w&+ z(hR5Raav<6TR;n^PufNW5~wKm=m%G)^403phwUgHK?S9iX*BZJ_f`-2Vyc6Se ziEE{+>8=Vj51Re&tYLyY{ARvJcZI#&dfAdDAd zo}3}J4{nXbW<*IiCZXD2eCQFF@!7F9fxM3kv0zf6v=@UM?I~LxW?T_DOm?_otVv@l zG+>GduTw=AdOxQEhOdIP^-+<$9SC7f#((f>9rW20+t(z(340uPaS{K3M7}N|wYSh> z;V*mP!pDat^-W2wKz@U=!@xYu^H+%6H=Wq zH!=x`L2jqXFZI_N%lZ~}JNZchlTKL3A*H%Q7L$W_Tm;O9G3V6xcF`UQO6h&SV}V$F z%KJM(A}Gx8wyY&`u_3mJ>iVRRS@RoMe~7;zjdRTISv#aI@b-6Hp6Wjpz`tyO{~KFC zIRMS2CQmpy4z4;JtBRB-3E=y^7YgV(S8bROtvEMmC-#=W+TV@sEI@H~ofg%SVF||rR zd#CR~enjr)#SoK`-wHuG$#rcf_=KZX`mT^WcU+_bFz>-@V?Pye%)b z77yj0xE8o?S}sx#tH&*Fvt2JQ+=lozMv}}+2gNqe;0Vk)oX-1JI6nmfMN=pn~0(d+~fU%K~;SMizs?gdsY14tGZT0Tv*7WKdo`nsMM)e@$H#N~;|4Giy+XH_fr&iGY| zk_JDUnjC8yqB)Vx|+=mQ?F5}-cMyF*eBEbgma zT#Ed6|0w41oEQ_V>84vJGB2k6G zgCb%o;mzIDJim23Hqi!yo!2uD)?kj{*Y_O)&N@0q zQcIiuCbk1+S3+kf2Q^2E`S2b7*dWx_c|dhry>6}+76~-nA6~)8rq08;dlB6WJH20% z29v7K8qcQ!j^HQ*39tZ2Gy2Smv9^|LpU~%CNZuDykgvV&=(VS&4aT$JSTb5l`qn|_mZic1e;a&cMnC)Gh8QUMeFOV$u{g{p_ zqL6B>0qP@j*iI1YNai>9ZqxNrG{9iLT$Pip2`MXC=3$HNO3;ha0jZ#hUucM+(hry9 z0xToswPO6jBAvHum(s|QFi=VGo|xWfn~8uN_!clx$t&=0OSplj)h`q>DVEhM38}~< zIQHM6u`K~T6km`R%!?ATsA3H3^7vy>+Rl(y88LaIo3yq4mGtmkbWnMv*3vj9<~{Wk z>$s|p;u90wrnf*m#;3?%3KvABtNsCm;n^;st`o1FEXo|5|APP)H;dKheFG)p?CgfHTK z(h0pDW3EO+A`!x+Pl!#KpR3DBtj8@Yv2zEIsd@H&OBg3n8LRhSpO~0udX9prPIzxl z47goiiXj+|xDGqgtM^+93fbx9A6NaaMzPkFC;t9E)BW8Ej7~ILe8g8eCX`sJka#f! zKGZDX(qw4jQ_~Bw!AKD}UFTcqup>_5#+umnz+1%N?t$lF|YPUc1p^L6A(?-(P z#+G>xdRj>wSF4cQKDY`pX9aOdd6;nBz7fQ*zW#$bAmA}ge4uumE@GMjLIo7YT29w#t$bm-srIQVwB{hYmCmYGt~QEa*~ zOI+a+@V+dXiP7D_v(0w9pUSAaS4zU+XyQHEyM%Z#FfyW(Qz$5*#VA2N3HSU#d;qBJ zd8gL@^WO3|dBv}`_n`r=MylpN8;-N!8DsbFB1@0<}sRDL_e*B=Y6?lKaEY(-*>F{)ylj(Q5je#&SAA1=mJM;Wyp; zv2LGU_W<^TK%$Qg_y6QCJ@?fge|G;83o9o22 zC)rBjX`4jA>N0TZ;byFggq0ew;`roreVV{h>-DV<ybo69W_KXrFCwtF;a(VD8 z%Lgjtff6f^fO}quFz?m<4lB#P@Z(7Lcd5E=bacb*ZT{zwO*Pv%uRu61jZF6$~D5?Q!vM40hpIjZ8{8 z)3m6_-YZ7#*O31qI8++Gl)4y@q5TycD?{9WsCXHf%k6KqG*lNplj)O;ei7Yf>CG-E zw;Xx+E177u2VI7I$*XZmoqX<8*lP$hoW(N>F6GnXs7WwjbY0g_7>2;G?gW15{|UPg zxk&w=x;T_$hk6O89p~K-zB;tVp!$|VxT?&4e4btDD~%QoLT%l?Hc=CO=fY(#irD@tk<#- z7TlJ#OLDAFNijls*CItmS~dS}FH&JA@X4BW#Amzi7K%tK!_KZ0yZWj z`7;Mx&3NNHZ3I~d61J{3&)3atO*CkfOZ&NnyOTdP2S*Y;xeR$=vtRfPR!bKNk%F0Y zq`0Enoa4aXfNh=*tee&C!~1FjLoxz~VC(cYjz(r~ub&L43NaGOZvL#Hh*49>Zqe*n zm%fc5;u5H##*3(hlVN2g2zDZJa*F;Tt~82!J3BIH^HTPRf*?9D-S}~nwyy(d9!S)6 z2PZ`Qjjh2KX<5^JWHQK(qp4Kj^x4$bn8=j5MsF|#wy?lnkx&ImME_v6;So61b!jIS2+spRG;X7})1z>I) z61vR?R@6<1BU`Gc<8NChf~Pf+HGy%1Ri~nbRra!flP17izGkx;8dLjI1I~XQdR{T{ z2QLnl>|ulhNHylbVIA(o{PRZbpKm08iPrD$d19Pxp+9cvG#_Fuyr zZ|A--*PQT_-fi?glS!?ow6<|`)M#9iI?gzs-peMzLvTjdL&w!=bue?^ao>eEwd zwL11m=2&->=FSQHlagT9FvY1?9qqpgCq-|=LD|AK+iy`eAC1Pn8LiU2p%=+IM18U- z=yS(c5Z1*cW+S%kQzpH;J9Hb$+A0sY`0#O7P*f$LEf!5(&?{$-*BTkWRbIaBe0tkx zw&TODt4$tdfd6hz{YD8S+$WBU6?i(IXRA>uO~?!To%8{`K~8=eI(@bI+xHP+&3lmf zOlB*fa&qYPi{-6ugX1&eU8b8R&4V~l|8uC0j*ZKv1>*V_OBIz3W;3Y1pbDzPhwg{= zC@~3ibW^-cLeRQOLEE;MC@7L=Ci$e*nR_ccS4ABap~TYGbZ@ws>40JH^fs_)Yn4;a z^8(Ua>~Ou|t>`Ctkw`Pg61}M08BPS0alb__P?=6vJKgE8GD%P~kE zMmG}>{YIHs`j*Njbb-(e^ye31+k!a!eN~999YsIMJ6Fe@fbtWbj!#K8Wd)TdyL-q!=?#I7S_?K(vGmPu` z8x{vaNu3}^{~rRI5GnKkga=I9kDA!&S9Lp7S}v6&OdTtP{bu%~$&}nWlAt61X9j&z zw5G&p2h_z8003-l`5|P1+nC;c5Ni2t*>zYov(1+gw(NTibb6uGgTo=pj*;^H#~{_+ zMfG|c^!|FQa{xNXNuF9Kb%HLI4Cwk}Vh;TwKQXcVN%r9OO|Z3C5SZuOb`{CQ-8_Mq zo^mHPvJ30zo6Yl9tG?#Sn9A_MY$r0}aG1_xr_@+NRiVurI?;_&<8s1tXsqU>2{1o! z*3LZe1aBBEyGmCbQnM3Pv`4`xJ1*PaX~a8kwZpa!?1cJ!A?Z)oB>ctsXO%bZ4fX`h z97!30@^lt`b%B;3yQypjgUkL11cjoT>-xf{S+9<{C!tgK*s-!z6Vutm?kF~&h@a{` zGhP3?HCAPn@MZU(kS1!P(Q@NE62NBSa^Cg0Zs8 z|H#4bL~b0O2=0|TNw){_uHl}ajsFdC5Yj?l%t+w%#>(;N>%Wj6x|^FEzVj`6yuEt2 z)<9@7`P!ScONQD;>1zC2kNqk0+a9Zt9N(sy;Rh1g?8AhO1Uw3({AbS2K(@M(1!QHW@_yv@6krACo$XLO2GzdyLh2{=Xp=_nf!$F z`siCj?Z6h!=tz2FYB<2+!60{+xA}CIe}EtE{Nmei;V++6vgmnwfo0d76ot-Cr!BVl z-o%9#KfflcDOo`(f9~6Fr$M#8yUUQr(EE=2kp%$MbdSE({aI(<+DIkI^_*HcInDa= zKvafwv_q}~nvkRBe^^^F)V=z5@IpPB+}bm2I5x`Ds3#}$zZDNf@(43*FC1h6hI3m5< z%g)B;)M@NcKL$mVT45v@$f^7w&{>;GIIf}lVS5b z+GKa}v#|!rj43iR*YQmamvC&U3*V7gdK7Wlh^&iNN@DSLwvv0N@fD$v$^C;;wmhn4 z$q4JBq^Bz_(F5j=-@*Z9m>ZRH2-Zrn7Gwl`Q!?^s6pE8+e9Fn2^pP~i$mhiCYO?Lf zRsQNtmg0MHhtl&ApjO6h>norAq6t^=u?p!DPXIO`^_TcLe4YHpeMh#Mno@2CKaOls z#InYOH4z59b;9c-M~h~h-xkJL4oYm&)IwI;wAx2rb84l&mgz}iIeP=QvK$M*eJamx zN6ptU+VXiDA=_F6FHt+UYu1c3xk_95xC53$X_gQn&L)LRyIzeH7YQci8|h$TtUar^ ziT5GW$d*f1;D@K=fySqDc3i6=xRix<Zu?P-PK@cynn?0xQO+}~Q|uvu~^$LX0i4$ZSwIMDvf zBYppZi`~V`ENr_3e%ab36&t0P&XpNiEyTGO zt;B7Soz#XddF(6H*yvk!vChj;i=uejg)uEXo1zC-U$+0jZlB~aVYK8B&D&GoA zem<_czSiWsrGw?ePHM_LnCu(qa!4*V>5x%S~VG+(a*ij!V?BVu^AAl z{DIi{#R0t_{mFTl@dXT9%~8$6X;$o$Zh1EdO>AK4`fu)=EqoD2zU3YIN1nx1CsSe$ z8Sj&6O?9eOstVNG`X9hTgq?WW!`25pByR1ZUL3r(mcfLf5*5czzjq45n39V9%)CQ@ z%=EdcLd^cp>nEkDdr!0-l$CMMo+d8s3^&w-NR0(DRQ6woNB-D6MX6dRza`~->_Y?@ zeV4Uc068j&Lm&ma$Ajaj-!Sqbju;a?4I`#xYPn)+;LH=KV{2RE$O(J?VP9$f87&Lc z5fQ&XcZGT>;#E1RvjZb}y^Hhei~N_5kCbo>^QW<0U>-PbksgPEMORtdg;|GDUbn+n zl=&0+{>t{^{wUTI{xBw`tgwYH37pKb;Q6t4S!^7M5%MC}sJ9 zD+PsjOdxn;hfpW}mBWUQ$7#V-*fps5=DlRPWVC<=n{aS~zcw{Qiizl~^kwE7Z|{*I zQsz1j0P7cgq=jZGoOnYRYvWV@mv)zZPe|EwehE$e)ekDsION_CEfiW=Z*C5I%vdXB z9Rtx=6M*^96?Ng?YPpvmTY(hR;$yA(@WmhTAt{4vteS9=>@=Ezb|R$fO( zywL;5Xx_ng%?4f*>5=AB+0eo}TSO~TYE3L z|Ko@A&98fn!I^}KR>iKW~Q7p{>|z+LrhOzFavy*zO9ymOw$l) zYv9VT$!E;G@nor_#!-YbZqR+dNda}LAE=2~PGs?<+~z~|X6LnYc}6BDk2Iv9+hGtEv>*FiQk{puz8mMtz~jIf~++$@oVZ>(cc?w zJLSUA_18(oPo87@o^XMapAV=~xnXD}%1<3~X(+q+?OM61i4gPU8*gLF@cDf0UbQ(N zx5Hcf*J8k$4+2)POwK2~UAkdQFH-TYWqP8%q1x0}KCU_dO3C}JTfvPA0Uz0eW$%Y* z{H?2FjBH+n-8Iu$dpFZ;qjH%>&D{{9pRgbEshbcIMd-N^3_%S*%}sd??N;kQ3&y~1 z{a5y_ms0YJmu_qOt$2UF8_$}`&6e)NJ2XRTB=w+rkwv>BHq|XhDDxV$qh52BwVV5~?+$szpA4x(z9$K`v~$<)eiyE_Z_>GJwtX>u zYdfI*(hn*wNqhUer5%=E@Vi(vw$oUO8f-dwW4d`o z*MC==UxIiuGBJz2dF!M^7!0;^?MLjP38iT(L#c_tT9XA;M?nx ze2b)Z$ZK^35^4)%jy;NgE7vxu5pEKN5`gjzrfKJ!+{4PG}}Ll~eS@W)q(LGym* z7DRD;42o$iVT4LZtPtulyt<3jH}uNBew~1LD9%Mc_!;!;c%G{N0L+H7M-8o%#&J0| z_j!wnhH-8fovXCGYboA$G-w^2->Y_3@v)1a)Zef-<2atm_YRzB(3o!W;VsQ9iO?yt z*sOyDaQ^k`Q#QvY<6Cuh%7rUOPI@EXT{PYS10zV6o(-WJYBL)d?*(Z=m3I%mzS$7$hIefu42J1VzfdM7 zK5FcCbEuoz-i{(jCHc)1?@k4tb>bsoMLc-_GQ`uxsmF*do?v0wW4A6`PV{k00Lc9x zvB(ohnw(cabd0^AfN?Yn`WAWn$=+2-fK?fb4X02}bxnc;&4VPj{wVIxoqq;8u!u2xN;omI}okhBg>euEF}=k78B7 zh2Q=ZI|i^5@Q9TvYfOW|=a7AfXr!zA{Z{PPr`%s_m-5Ev$?(Eq3tCJllijffmhR+5 zNJppCe;qjE&7ZP|l(b)8)Kt5PaO2bz;GRQ_fAjxU)eu89L}y;iz6!4HMm4}cI*EXy z#3m9>8Q7dDj6wDHc zX`bU}sGFWMH}6~OmGLC!uN`MlSy|_fb3zIKl;jq1bO<*OO;UWEIUg`O1L36ZKG)sm z$cr^qJ#Es#@w-wu0yYXY3^n6D<-Z~}YgteqZHY)@1Ztl@kuD!B_7K||T6wrFwA8ED zG`ND!!(`ZgRGa7xx(cQ{Xp;o>b3^q-0FJPLm%bW6Yyp4%@uG9C7F773g<(z1b9&P` zyDlIB6GRY+|Kx3`{?n4bQGbnmTa~mz#<<8c9~?}z0#6qE6>=)HD5rEulPQ&&hX}V8 z*s%b-*$#0aCDH!?001zgr)`{xI#Z@{avHf)sT{R7UU|6DLaiLazr{!6-8;O49|}r zK4S9p__P$=o1@aO=yOgycNbH_c|Cl$+xelzwM%^8qXU=tSW?c z%7ood0{~pvIb|;GI7tFyXoA7Ffo}BHD5V%$73G#%YrccV+kNlx`nhfPY>mDaU*0-f zrgLL2K#-#U+2UK|D)06FDSm02q;V?LV=3%+g=evuawxAnK6nNEIqNL|RUuVEg;*i6 zJ;xF@c)P<)Oxf=`Dnk!ZvJ4=ekyCg0OqTI4BbfxmH;4Poj|@p!!}xj{(jHHj7( z;i=LX>acGkj9YcKIBdQ?e7poh<%|`AR*n9?6Y=G%r`zDU>EbSpot;b;C}1>%J*6FV zmh_VOX(M=cWK6<04<8O*`N&?RINi8P(6KCCzK8hv_6YlXQCtQvkA<*lfo#|@{jdXh z5e@Y+v5Lt_lYxBF!8~%p%IanQ0Ou&e$Ts#`r@*&G^H-Aj?U=8$3qh2I{qJ>lFZ`(k z7Qai;_rj68r)S(AyZ&jmkqYOyhG!jlc5wBq(6}p~Ig=NuYt*B2JBu-=er`aIv**G* zgLzmOZ7VVsE`oW0*f@U=%5sFcd)oYi!N*D^O+Au5s~f^n$|wd^RdX-(jlo-(r+7La zmauZM&&$~-r$=6vJp~qxP~PEA#|44u-Fm-F zYxCagiV!G!zgql#!V;Scym98;0417+Kx?v%sD5UXPU#e17;Ac<8!> zWRfmmCp4q~kE=~V0aqXGRFh~3K=H4 zVWKX? zlJmq#aE)qog>ImJ-rcvBIr9Rqe+&nwlNf-8Js6BN^x*CY_9J5S4&9=-8FU-f*cr^* z19OS2;^U$w`FL`b%oxZ@UP*2?nUr7;64XXB=8J$jSznGBtQ2kZ=-|-lz&>(6BotgU~6>8Yiqi^BnjCWk~??%}9V4a-z!J_6?L9;!$$}{dc zwv|I$>Ji=FfiCSO#w-zCJ$w2{E+NdF*old=3-S*)f$FAK2oIECd6!o=c_Ez#GhJV5 z+D?strz==Ru{Eudk&1gm$+H=@0NR0B1IeryP%G zd#ysbkSNBzdmwvFzp~-a)Y5N-2kSz)0~nf6boFhR1nGl4)6>HVv*DM2tk>V7UFJO< ziD^npl1bM7D46~ftO>~n2kF%8hYn-q&mT3gq9iJsmCgQ=6X^`MRV`rmC2ub-U@Q|N zSRv&u1du zf*wq^rHr!m=rQeVuDAd!&cK9!@90-a^+8j#EXA7y9R)n?aq?NZ#eP#lW8yIU!4 z#jUuzOQ6Nw-Q9z`wzvl?E^ToQ9xU+YdVj%le&g+E%ymUYIRxS--qNbv$Y znBH_q+|WY1(vhq0?Wh3N!+&tusCXocN&Sx40737r0?0q!kZbFB(p6PscDxO@po2s* z<$G3cjM0qgG)4`7ry?47?l}Q7Qj9GREIKZ~E-sJ4wDIWSFLKff2YQMCI_rc~1 z%Qi1eHyC+xbBI56vH?Wxm|5u%lSYWnHR8H1+ zv|INLS4Uh$>AM?6Kfs~}zwE)cCy+Zfx1Hh0MtI@mM^Mpq9%x8ozDN`FN7UV@vSM9GOh;j$S*x^ zp1bU$K^9J;eGPN_b>Vkg9rFL0yJyPYF+WMtGi?9y2IKyH&6UQ>eAVnZo};V2n=bXV zhnt7h6kJC{cUpi(85Qjp@k1VmiBA5cW<)rU@`_NrocQhJ$(%Z!BUHg4?7#r+Ln#7~ z-Y1%yTWSpXz`K%ah@67E+9I8LK=0C;4pJ=6s3Of)LzKa-yC+`k6c;dN(cbvsX%QnV z?Dc1RCZ1J&v@CGYy+H7*2z3SVskNo-k#6N8J_l^2q#OL>HZ%0hvP$3xTN zm9IU4(%fVX`Pf$Uozr}spV5>_Fwj=vZxCFo&_U&FPAPxKkqV{=5s0xg5*rq*=!DZA zc1?W_1G8KlGR&QuLd#A6Ugxj1w|{k-o-0l#ZdR{~ax5fZw!z*#!>yu(pHOvX^5^pm zCBB)zIGhvkaQv%Es(NZ``TYFRD!4N^bLimpxR2l_&>->Fs3F-%Plye#YoTZGm zIl8UrwnEHfQ|X}O>#b3PJrmFYm;nrh)!6K&=FGBiu|eMjjxWPb|11cfhVtxU)|?<> z-lVv{)2=|D-9cI&ZdMl5FY2}N&XX8uQ<0TjA*z$WvJ6@^+Q;N=4yk4uR z`$!Y}>L{>Mx`|@Ilnhl>ArI2Qi|ep2IPj)JcRyL3icOdM9zI8FDd*-^UG%pC_2Q2p zd;THx$BHRnZS$&+@+B)Os%9A^PwCLr5PS~vJl}G>{{AmM;XKzzc~wdGKb$i4mjJ^J zvbS<2(f(l9X9_XZgo--+n3P??;DYDdzUP2^Gi4GD#Uu zIb+(@4s$WRT{rxf8s%eZ{=~lPdusBJHNDy&-b4V zgOR0235Y*smSFIR%&r4`ru_)m#S+hw`484!^(r7DEuwiA09Pn%-4XCuyUD&iFlKT1 zQL&#R0BzP_M-n+b0Y%gbC7=1`aOex|za;4UpxJvl3MKKUUuw!x9IwJ!-5Kc;5_p4^ z(`=cH$UauOEG5O;E%Vjx&AUsLXvNzq{ye2d2dHHBH)sC^P&{x$<{{fqC3djOO9g6k zomE1^N>oseA(HSTEh%*j>Uqpd``p+Q;Ji0KbaTK9wk}i<@H|BpS@)}ai|RaLT)`Vy zm|dM(7rNB1$G&8ed9>GXrP7kz_4PEf(eR~x`UB$RCXT+Y19wI>zn{dOR>TV=yNi@9 z+ecBlRe+Sc3%|kNrF!SF%K7h%!1ObEI^n7Jdr)kA^~siY#c1QWiR(uA!9*I?6`E?_ z^lyYR`aJn#AK}?4b&mL7&tx1^^h`vx2$BfOVLAm_1XT9^tPRzSI!E_;N-FE z=I1BuG3NOP-wQ#zoMVrSdycCH!zi!p=#5Io5uPvGV%ZgAopvdqV-+ZAJIWTuI0ewu z#VKklYIjzxMZ|H54-RV8@~RHG!k|7i4{l))6A0bn*ZGGKF3Yfe`2B4U*8O43YE@s- zo#h&`+)Li>z?8fo0i9o42qkqW9DY`WU7Oags5TadG;Z164l>#NS_nX*M~(BPI}X;@ zA@nPFFeH)jK`wdVy#%nU=7yg&SLe<~g=~supDBa;zO1{jp{RbdyRm$Kgfb=5)uSMi zp@DSZd<09@Ayyn{qeI+dRd%YAe*wX(3Qp15xNh4;@TTqTDl2ek{zu6Mf!}9dICArp z18Aa7d>Q+Dq&6Wh|2R@dSQj%lHapTBEfL`0DAsBUQJEWfVKNjv-|8EIY+IoHY+t1Ia8iFBGyhD0jdT8N_$4(tQM6aTj7|d&H@yWWM+nOd@ zLGT2FFe>9+dOibUPDBkN^2J?5RR9hGVR~i*|8l0`#!VEf{#m^4YKO+$iNez z-(%Rx)@J(3xNG=p+(go%3Dvo#cb;B0siN_-g;#30Y&{Y}i`@_*Ae1Ze@lPl=tcBSO z^V)fA(S<3u;6E_ac}Tm?&wusfHdXM>iJ{4>ppC=3BJA*9_$c_huLc1$uiG3v2BbGC zHY>2>Js5%vdn)iF-$D)vj)t&!<4$rG)2QPCX*08hp4$o8M)XI4(a zkA$#1xI4lTlYcSqFU~PMT?v0W#d1BWV%ohhmuUf#LTOG~(-|*#?y}3fw$`ASUo}yc-!?N9+Uq9O1)zy8+ ztQNR&87D7MrY0~;`ok^(N=r0cSu^OBqZsDiYV#DJtyE-9+og}*HrSaKnHRXh2s?_4 za_6B}D!jmUG{i^CzP%ybW26pgbE=CMGn`Ob_DfZv5XtyZnNFx2h-2IN3U=iDI^YHiw*K+jflYz=r@UVBuq{si9 zO_lIqW3j88YI3uNSC}7iqV(jLyuq8%X@lZ!5$m-gPX*%-{kU#%v7>~h6gt(NYm`fi z>9yx!Q7h*cDl6+LEFLS5I@x(p(Jx8cwCskUl9oe~j)Rv<@+OEWC3|3%PckOHC|Q-lJ!SYB7uc4!rxqf zZkd6KMQGRXQzf(5%Y5`ZlRxR~GBg*Nl=Th{OB)Ghy-i&MpSGEA033AHQ!5x&3PA?l zD4Kr@BBs9U$B)MxaBt$oea78#KuH>`K$)rq5unumaY-N z-IVDQ%q;`0m3YO+_lEKQ@}IH_$Da-t_!8be`rpkCK{@Rd@1^QC*g0)J>i79^8~Z{O z$=?1N2Eqa|4_NZB{t1re@}IqbqBNB7e3V-TlKS{zJkOfG5W~uX%YPg6)9?0r{DzJN z^62EeCvRWYna(aU$Yw{*gJRS|n*$idg(|CA=c^G=H4mDs&jfCn3Ll2A?A=p#YDjKO zl)s2&U_4$X9Xdx+QMiN@1RWm8=Or*@t`)UGzL5?F%P6P;SH3|D)rpAmm}cO-7AKOr7y45aSc3Lr2DCr*7sNz{ei|& z+V8~uiZ3vk)Pb6WW@HCe-boe9yr0fB7-=cI2Cz=36oDi= zDosz|_&)Jk(dt!Zjk}X5H}4Y9?|r|6SMUKGb)tL|l>qSH-mx?Qr_4>}T?VsS%K_S{ zXcdDNOf6lODp?3Ht56+`t_0MS84nbC?^rwquW}b3RR&+f=6D87C*%gJdj*!WHHSYG z3essywEmB!i#P-(B!SegMJwlR37(?j@-H3sDVi>LiF!e+3WM#-m2wlYrEdB6BqZ^a z6;4YN3(E`)u6Vl)68lTQwr?108bIo%tg6SbqTV|wc7Ppj?Be&bA3Ix%9skA*8Q(qK zRt0i&t1YaDg1Vk4@cc216$=|@11YDS_V%1llX4#dsFQPcZkmfIUfct&n3s~$R7zE` zdQ_xIaU4j}>4eu7kIc*Mzo;Ubb5#&FY0bPI->?V3#*lI=Kd`LSV4db7#^@AwYHiS8 z%^`P-yE6#7-ISkv-u8`hP+Gdzba3-0*6bG&%I;SmfjF^pAftH9`+eMe0=N-THC8P3 z0d^_oDehC2e8(M(Bb}zw`N^7%=%pSr#BURtMIro+A@Ap?xoUIR2lc)YQ~~NmbPY?< zbv{HGUES&WR>n;IwyEf=O1-XeYAe7ZU@?*yGN1q2R^(CFQocTfzhM$|ZP9KHou!0Q z!(!@mm7N|SuNMN*;|7jBew|lbhPMS`0R>U4i1dlL?&9#c-J6XdP;LRmAFaBQ!7FM{ zZ6K4m^Bp6v@jL!lL#FPPW-J~8i%rdqS9%=3HHh_)&y{Q5U-s#bU0BS~7XNxSh=@7teZR34ECMDIejKi4T6Bd$L! ze!q89wPBFTHro2v>V)yQLdP0=LFpFZEs3nxDT@~;z*i?2{!=%m-1s6fpw=^NT8cyv zw7g8+VgFk_0%lmIW}i;mx8C*^mk+|H8k-f)+_fCOnsjBc4D++PSs8CNfhBQf z$L=6Wp}fO2Ls^)M)*Jo7yo_|4%n7eDv+QJO=!p9~`Txb;%wT7r6}GpTS^vz{{k%LV zKR9)_kg|kChPgC}d2+B)9PxGD!@-Z?+;Yx!?UuzE0>R3Xy?1yk4W2eLib6yXW$&XAzKyoY1q&Ed9qmxevHqRFcf zq3iP~g!qVBdv}o^i6*I>EaV^Ad5U^v$qmoaNUlpC%v_<%UMOG|^s+5q5!`Ku@tH0% zLSyh+{|mP?n~2!I{s4@WX*}Ulvd-PQcAa#gd;`+qD&?oe&C;Y1levdBW%*;{uU8?m z?z{Y_QS!)}Ca~>Mx1Jf(@cU&jy0+4RSx~Se`PBA^^nuyO6)DMi!cv_9q3BsFfV_zT znp}a`L;$=x9QNF6n2!75DDsyUQPY2}C^jDhdOpvyE)w=z0<&fem?|^4E9l!XKTx4Z zA-)}-Eg@k#&IWUp*xdM;0pA29-=^kNPu9ePXS)IgR=OJQF{&r^DHX{}qbe90QO5G7 z^ms)OI4zo3(DkTAixa|M1dz>U3Vpnn^PUJ>e$41ZM2Bx}uYLMd+wnYvn!*adi%-zM z&XL4#X8T)pW7Z&8naRxs+jDW>U4fyp@+;pM{WQsV^oP;>RN{`IEBeIrT{a3xqK))G zQ#7Gs(%#qwO*Uyr;AEcU(!Zb~B5X-(UqJ3yqezDYuNl9I@@?p?&7`%Dh23)g|cU;Pg0cG*oAc; z&TA+O15K&4NQ6d#m++mt8iAKCJ%i%ON1cOxQ$>v-0Ck^&J^AOlxVMcDBg2p*@QhwiuBkY&5O9W{LpqKmx9shd7*{Y+DF z(C%@^+sS_k2Dg{&m6ffh4NmG8rq3rGf|Sw}x{v$;#M?`R9)WfE6%3;NGeqzlVvFT; z!twl4S)xe*<1-(uCh^?gCPKnf-b$Qj3sTAFv+KPs>Im82JI$>p+S#XZK6zlN&RC|d z6u1P1PbdaIZb@*P1?_gcMH(SVTMy^0;&hWG60_;!5#wrXjR){w@Nh$tA=;QIxrYtC zj)S6|&jCgSk)mTC&9|LR-(BADQ11t*Y!q@N&q1s(=>QV}$QIF7CUjLobxNX+XVR*Nw&J+!AcH9r0)T$e(>jnpQ;p(cIMM;qzVf3Caf z&G$PEvhTc-GpnCQ4EOQ_YZw2>r+dlD?WMdyIsFF~jd$CC{%X~yMvtJ05|{Nm+Tk~& zuJ975!_f+pK5JZXMe*-rJ!(I7hV`k0jg*43zT&spW@A9&r+-$p3whsFK}P?pTEyt5 zGxtr9i=l3VRg^gUSS$6Qs3bVWSkGsf^hJp9CY!4=b>JqT#=m zjhuUw5?Eb5^OY9lN(j_Ke4OFISBpsP4IGA^c7@dNQ6VYN+~0 z_-9?D;{yV^K-No(v%FsC+hpgr&URqzrKel1+TEeBW86`hYF(_{dqy@|1h|zH!70Wm zk4WzH05e^s=d41D%65^NiC(o+neBOnNi-((b)62|Z(12*?BuFc0NR04@hw>cyv+89 zrN=l?{X(k5g^KaugszDGSa+7?HTSNZM(tHdKcoOP0Ls6Z?Yv`UKlezqisp|_C?riU zB-FnA(37|t1Dhq7(0p>>deMi^FXO-r|K9iw-G|z?HKO^??bfmj!;fHax|$J}xB9nX z9CQ-(dFHqP28LyB^(ZXjx_&~X+00w3rp=RIlXbcVv7f0sqSDun;SA&QDVnUz#E{u0 ze{Js5z3C7ta~(t0#2a%4Pe=%7yex*&hPW0c?TF(ap2;%S6Dc-tu0_02I1U9Q<$eYJ zeJzgj5uLr0(iSpVJ=E{kisi-HJTX$aP|uVN=6_f@VJC~O(uNxJZ@8_Vl-1~1qKmz% zLvEHw^B^;P_3*^V!%+d7!%9Mu}PdpeJ-PD>6UvV679C3ox_vRxe)%g<=idWQ|LyL zkND!R$Gi7)wju49r@JP}8d&Jifd?+beO0M<8{1MO=sSv>3=V4>;H$P;8#Bb-CfJ-= zqHlr_)*s-=xJzJl5Pzwyl5(I@hePAt36hEVk7um*bF2%eHcnX%4Uo+vSb&ue7PAc@eF&HN9}A=0s}i|vUjtEWrI zjbWJ#~yvdM&dJK@28jt>XYC8j6Vzq?si+cXN*G$SUNeGhi6%g5htC#Hh% zW_FIL7efzj@YAB})E)|eEmSiHa+kgMb@B&A-Kg``Gg1vWnwAcBDDq=u2V_TPN*b#y zN79;+UMz({=+lbSpHNX(GKTJLbEBf@i&F0-Te=}pE2C@$5<|jv-Flk(7*#u@^Ajmv zGAiO4%&9_oyeHGk02wlnf8lOl`^3}16ZvZ&HnioS%+xbE32Ge~2>v?{W0T}>nL+8E z>VU?Rbp!0lSXsx9Z6cN@P_s837I8^Q=vH|u3^jXiA- zZOc^7!cQtyJrQ(M?x!p?AOZUhS}dX3wsD(2z6B+&IPbiS{wFRS+=zN>FFw;da&3S5 zR6>8)mvh>Yz52XK{QCM2R&Eytt}LXPcHhI?!%kq=Aa86)vS2XB{F%yOvR`El!zpnXg1dn?Of3zqF8@ZgP zNOVi*`HbB(#{VlwlJfSlnW0Qc9hHk>e^xv{F4*7h!!1+gE1H~q=Df(|RY~7mXYj5; zbaT?;Q5Wy?4Ht{l)}l`AH;PNvE1)6!ARrN-NQ@35>#KOLX>5LjVrg- z;qcdi!{e>{agh?HeVpY$o_u64V3*bObbVy=_hr8QDu_VSLAhHZ>9*L4H%b{p~Pg|@% zeb1j8dh0;2&9UNUO^wE-)sGjq@$r``%Zh$>XmR=H3pgDE&gz)#+<+*zGL^Z1Avce@|}ZArZz*wQPoq#hk+J+QYAqgfDrzR%dio;mn7e@P2e*I(!#s z+tfnuv>sl%Td%%S&4$1s<`>4DMPwFe)S#)R`O6O{*jgMaJVE0NDsnU!kjQ!=rtQzA z7}%^UaxTjoflBR$eE491SEcRY5`Uj6Qh$0Ka@{Q7YHIv z%b3;PN04k=#{P2ch*@x_P*B+fgS5u8cAWEk58j~l7B}dkiSC|Tz@9CUfT7s%1kg(a zh+IWD`!AVsamBvZKqpLtzYU6ZBeK5b4Fx`)!&c610ijn=>61R_Urc;!K{M7%+hLS_ zA&H@=jM)GB^--^f?II~{Qm|?iR93orL>?Z7 zcb>Sr^}o#H6S?!1u0bfaKI1;nb@DU;ykjTMze*vKD+^JcI*^*Ijto|4sBc3lBtW0i z0LGSELu)B6bK=98U+CCFTPZ8Ql;@J=nqloTIFGneUx<&&cOVn^9!82Eyx(x`<0ct@ zn7JCP&2}?8Owa`mo*?boBRsR9yiL3B3k9{dt;gL^KN*eop?S2`>aGITQJf`TgM)8f zU|msbGYDVTfu@s0WMIgv@B2pTYt)u3CJbI|yK*0S^&}jlk+f=(u7%nQJzgM&e5Y=( zK8vu2TS+o~J#le|Mw5!V_35l*V4-(v4*9N7UiYPPC0$jBI%UC3)E;08w?jJi)8UzG z_okx9IAbECx2Ua?_&*`a2QBd=GAl^@!7fHt)6e>y?_Q3PkriFPA?5E29m!iArZB0;PquBa}7W`alBf|zWGD3)+iiI0gPUE^);aG_+{5}3 znGVqI3}M&QoZLI);D+dpjLyY8m5~pJ%qw2MB4%sw;$H}nlD$PpHk$Q^KIZ=dqJ3z_ z{wH5T7J2n%52SzA*G42~bq>krtLglXE6`#yd+FO*)unu~xmD@%_SkXUrVHDhU^lW{ z5rd!RI+%0lN&G`X;?&10yikqak_o5lM}Phj=v!I(W4FGM<1Uexg6zW0K;X}3RQ9kW zvf0GWmtc*Lm)*mf{b8@J%)X-A}QC4xdfBradAis?^39KBT8>B$aZ(C6yps_m{eW%EG*zNm}bQsDp@YA^#Ee_vn z_tt5*yJmiMM*}xdh#;z~o@;*V_$Q*(KA%$DMb(Pm)G$A~z2WfMm#6 z|BbE$th_0;3S_M(>-b&i3dqQPM6Y}^9RLly?Ys%~5WGr2UEahiuj0IF+1W2&uY16- zG1_l7)wd6BUL4@C1O9l4*WF+R*re!z@{L1~(t*s>gY^_|O`b5bW_G*#TB&L)!)nwi zuV<&^WTbQWW+)3Hkl-TVreb4~L)>Ay+AuzJn9aZWWRc}puuPoH&I0D6FsHmYk=tHe z-98kO32*uyW&3?5i|huuB~1fNT^2Oq<_CCVPo#$Ll-V>m6k5W&P&>^D=6Jr(Po(XM z6f41F_d)jy4tpFi+I;ScPP)o{Y1S~@Wa%kh+d$bgQ{anmZk&GkwS+pVKaJUs;Nu4S z*B`fiU{A^Cb$bUEeihzJ%Imh~Q{uGY4{j|RC#o8txMm3;u`b-s4(+|?@2P*j*?~4h zkHfC^ivfeRjZ`sCABseOrs4BWFyU&qh6j=z&+;?m2;%y~MYSVo#^-HIzw^kg6n7<{ z0v1Q7Qjz!b#MpTZ?3^X4C-AUa&>2DqUGN7J?VEJbUkRAx0T;WJ^K0Cf;yWkIX@cct z1Qc8bJ83DeojZ2PE!<%pY3;PS_b|yy; zr*uB%wwh%OUe@s+NM#Bg*<36<{k7$vQJRUjT;~0B!K5WIEf$hruBU0!1OF$zN%K1I z`qy0E6D;m+TP5cqw8*`C`=d_;gU_A9Lfx*i9c}?Jz0i&I?2LV>v&G-P1UUe0qTWSEl*Fv~&-HrJtVM44HqU@A$nxX;J3QytGc; z7{xL-6>+{$dZn~;>BtE>f%W|O&8-j}xRtz_XYT44qx`YvtLG|9q4>So;>qU)K`R8* zc|n!ueT zPa`vIFfD+ft@=2MzU+d$UvBP{ZX%WoTfYvl@|gA!bQVl%{d_9#4SKE9r){;eQ}V~)l%HV0S)N7g#> z7`5fwcpFWd-_TO8p-eDA3JqCulvu&c%sk?qw3G3uEBg_}9# znk~ckS*4X`^Etnm8$*7Z#Xn~18Fwu|@KXkYs{Vj{O!^gJxp!}o!7!YA2iPOa#0-^M z8lAY|%E%fs<3?%E;S|FV#QrV0-?NS?ps&9Ww9GN^`6*3_S_r6y4ykCpPrx=AEj|7q z2WOJ(oykq3btDNjR-Ndm(Vxa-MfEq$iTA&*Kx$nB0tvr8Tz;Ng2>uC(|KPQonlSzG z@ZR`nswTvw7LbwB0Fv{{5YvP)+AA#teuauE32&8r&pCp_jJM zkKyiQiLs-WltjcyTgdmDXKAetP zysFVYX%x&XQlaP%EWui8z&PZO5G6kLhj4K zrKh&Kwn+F{h^6D9o)0)=bmM`SUP)M5Xo)?CeVc4ghWNepdGyyyN9Dn|My+@^gq>NprB+7`3l6%b=YUT8W|e#erMHl zOtkSuMb;Gwb^RH9qfE zT;>VrGrX*sLSdW43A&PmbX(!mkfN8c&ey`%zmYIa`Sqm`wnY4PA@S;ke~)sywjp7y zc~$O3!SER|k&U~-_a=rM^7??h0&AkS241va5A8X305(2UIucl8$h=y~*ZH7Vn!TT~ zy~w{5Y>3=Na?19>@TtR8kiC4!lUQaZ#jE8Ej1s?b6-WKm>2X`?WR`ov^ov9C-*Vz1>Hcv=6f_Z+9rEQG*SDqZv%27aT#y zQ}ol=10cZ7FO>@8{H|e(H_fAY>wyFx{Y}4M`cn%(?WkV0%9lLqQ4brI(AiMQ{@~%= zd!~bgQcUVebZSisvRU}*B)($s-(g?;%k|c`gt~Jo5^sEz{KoDg5hkB|gUeTyf?6i0 z7n-+aJ{-h=cv%vCmjavH_TVi*gZWn2u#Sr*CRKX zR!QLjM|OI}Qx-Of@)0@+rWmi&GsBKbb;Lc-?lhZI0G_^sMN7;U@?Mna7Rxhd2 zXD@pL)kYCw-mgr79KXflg}7L0(E?g~2^|i}2;VpUA#k{;V`Q8{pA2ZnZ0iCuv~!`< zJ`jI?(^ZIjvzu(fJ;fMfaHHvO+TY_U*mVV+m@&l9NUp!Lun)bu$+ zQ8#%JgV#=BC5gJOYnY5l;;T?O3^D zhFLaWtOMMdx!GY3bXevnMQ^}Mrt^OJBmduv=4w5p!)F))-P-YmO{=$kuSmw=rk2nO zAz;1t^Q5LPX!X%_8ehgA{gje%Rcsu&v}bHgy7-)WReOa|=Jjf@HeG7eye(_v5wMt~ z$ySc3GjE{Jj@cc8O}ydaPx^4nlYxH!Msm#p^>(b$CjMSkqxN)wmKC5nDDNZl5)KF^ zaEz^(ejpw&a!X7o4J746+({nm6<~h@_W2Y78*`Xd>2bGw9tVeCbf_`Mv@Uu`@!QLU z_1)LVW>#}ljs#?70XRR(URoP&=H3aI(^aubwnVtJ?DiYFh)*yHSYc0HP8O!hVhA6( zK?9HWz!+cT#cpTNc86M}*LnHo?)Cm4|Qh!xqT~2J{s%kio zle3+Fw=qe{G5buy9126Y3;%oMctbmEKuAYYqNWbN^KWh=Yy9b=lAN9=ydLa0 za(@n;jz9dEMs&2}H4CyUHa!`g6|wnHIWf(NGa6T$t`>hJMDy~9yK?sz^#H%hLm@?d zA!cFO)P?HCC|Ep;MaH9L)a?s@n>rSucs?tRjg$Amrci@BP>$_s;Mm8vU{Qkb$W+?B zCZi~2hR7tVrd_z%K#x0uBM&rBk3Y-5oPE%!XMi?FcD2mSky`x&$INQ`ly@#i(VkJD zEN9JVl+=_-TdA@xZDh~(9XX^DhKr1K~>ovNbQeD2yr4kQE@7^i`P+M zD~+KIzR1$@rG$l>(&EX)H(GrX0+RMa7*-%cF|RmY?BRHX+7;KjyF%zoDp)akf0HnX zq^DBb7bl;{Z)_JS2faKuxQ;m;-W6wmz2F;gMxN{9nH&D>P!~I5Kj5ywQOLtGoK=3X ztM%|8Vky?|cMqfKP0mX&AG@TVSGFtyUf~sv(;EpR#ZS@oG53&NfQfx^bes-;Ot;n& z^}|3vU^a|RQasDT z$oM17?L<>{zsxT!E-CRj>;0}4+`n z|HV3w<)|KKOlmWSq@JLpRO#y)yMoT6PBsQljj3%y!ckx&{KwXE>}YWpfF*M1W+V8o z*%ak3D%!?x0`G!%{xNd>9=V*)Vw#8E%Eacqxj)j}f(s{9H%OJkI{m|sUBG?MFerU% zlZUjN#@x^ryiB_2Xqrleg|sFc=fTo!|I}5;A}7he4!A>?z=)083pk0&X_^3y@wRDW zO0hpdO<4+E^;EaE{%SqaE=W`Lza3tT;>}+^iV57^;2HKH>VSQ7Fxu*+vd6W!s3OJBwb!oOHS^yKhys(GD*0leN!=?q#( zN^)gTniI{SUi)~bB^>?tpI|nk!^q7@#xX&#`ui4&(`pVt@=9Cb3s(cR4|eutYu{*E zS@Et}aiY-g^{~4uj=ooJ*heTG{tn57Ma6;8cH{JUthpmD@7_*>UjeZG#m8wX3}AsS zyKJ$nwPDk!I`}Y$f8=5Yv4??!$2ugSeLFCKVJ1xS>jOH?f@oy&_K|ydt>&l7=R)@K z!~MXx)IYNjqtyYlJFgUq^FkMsXX|KoZVvOX!^DPQZiI#RWLixo;# zq70h;3e5MSsC5zBY@f1FjDy*&&pqrpaLv#QF;AZy-cF zd>ad2WICxNqheiPKS4YdFBa6=$4e~R~?*joo-5q6?RV^$Qk$SR1}|tezS6!)osCiCku9IPEdm;EZ9gr zKCRUYy|^3mA=`@tLw0`mJRV(>Eq=Z;LUvO0`I*oc#8Ht^P(+*hBKkjRS}^BRMv9fJ z6{zV*&+P;hb_FU~gRgjH(toRI&X6SI60r_&*UoQFuWF4pJ1goC=5$P9tsJ4zp}Jpc zzQ$z7Ch*rf7hD{18RckcR!?2r4fp8RVqF_KVp^$m{;)9AHtoE33)>5{{N&}oSo>Zs zTQf2i-O7!wmHw5KAKj;AU~Yh;0K(4epITO@L`YzQ?hAuYI_UEBBDsT%WXQ`lU;$uWaOYSjq6q z^vSS*km4u7gB@b}#y@jN)yb9yczJR7FVG7HZjyVK$ptH01Ka_*qhq9;A>>m~Dr+u5zpguY_+>5s`zLIO451_q%b1PEY3v)2m;+Ub8Vns_t!?xTku7QkvbxE2xg^P06 zUnhwNp1MQ(w0LlCP!^dnxK(&P-joh7*I;LIn!F@@ zQ*)5SHA1-Bu&{&)N!pxAUbdBg?^Qek>nYTwMb1d=fL=PpwJwcciYg03o>Bf7n+ow4 z+SOjx#_cy=ZnGYYK+C$cG`5V4hs!_I9Uuy2BTzwC$R{|re+awe5qE7W&!WZl(N=&6 zZq$Rc0xp3lxN;mhbg+rt6!t|^`sMKi>efI2j7t#_iu-T(@XpNYWfIGf&SXRAk05ET zgwiO}l~FJmV+_o&RsX@55}{gXj?m*aQSo4LT=!gk-M%%m8^<6F=QU65)T{Mv#3-STwYc1vhdpFfc1)%yH~?ASx})?TOTuC1oI=%7$;vZARWo5Q6Aw+7S8J zt;bMm8ihsuNf^#d8YPsk?#l>?K^1dLss#h(RTCF-w$d`!`-D@W8&Erg1DTznx!aLp z@B#Z{@pu$>$rVak41D&$^Mc?KQ&R<@x$OW5MEw1TSMG&!XRp6KZ(SIC3PgfOyV{5r zVAJ9?6LBJ%0%XIOO3b9b3HSQH%zd#^M(&YpMa06~FwPvxa9s&uH2B56&qbTWF^Uuk zkab}%Y5*$l;Oo1u(#`%>{f>Q{-ueIDoTF87nTu;Uh&kQo`z}bNaGT386>76oU`?jb zRQJ_uAL(r@k-mt+zz|5&EnZ}sUyaP+l0ZGHon0K1czi?VhxA^(e^0zG&!8mrXo%WY zx+FJ-BADZfNoQ5eW-G{j@@k@+0i13^mI7Ya@Ld3gbG9O2TGQM4ha9(2HpE=K~ zlv1Zs@qZTe29t~a^Za4yrOFDP&_uKxAD_ck!ZVO7zIISh1+;Fx_xiLet8sZ}GUV?8 zFjpWMixf=|_y1|Jd&)5|G$1qZ)k*25y}0hMZX-M+8c;qF_I#kED^w^gJ2{0rxi;%m zsg4&ZPgR!V)^K;)c1b{DIwYw6tzTUFtpKic&Er5pEUp25dLoywRqiOE;-GP3W7CAx zW=kM9q`7KLSNEipZhA=N8Z@Eu2ufUbk0|I|qU9NB?cahpBt{$+uh{G(< z=1nQfNT15J!vcLCI;DioEFN2IU{|L{?#l1oJ2qkQ&C)eM$dgI8}n7=t{@KhhuUF zd}c7^%X@~EpUM>S zt+=}tmmrhQ^>;D>U1Y>}fY0UP-6PcodX{o-S!|{MW8WhN8 zEA?Bgdrn0*xxKeO&t@lUuCh6Pjc z87eBOs1paDEht&|Q0Z;63(B^3?|fSMML~5zsk_lDtv6)YJH}Yf?fx}m0j$;34XGJJ z`=xH`lT~@&ni0lrThF3(GC@b^^Mj4!N|@$vwy|&m8tH7;+50KkGH&e&Lr)AT7a)T`FqXVNTLsV zaSKeZ9Hli>*jlG8O0TpGck8q)-HbUh0yTh3;uf?SA!F-a#7~}I|5tRL+HeVr*T64+ zxAy7hq_WxG2{+RwB#*$=cy(v&p5?t5`LH_QQD}xBRw)m+?8?w zo71xM`DRj617%+0{)-0fsw+!{yL+b5a1vBhwrkE$WD5JL4T+wXwMp}e`v;6=G#e}m zGV&j}&W3p|hO-dzONqCRv|mDjuk2dx@Il3?uC9aELHva^@1|#){8q*}8%iB#Qp2T$ z&KZ0ny%9`lB-=Z^ep^w}iojvL3g=|(u-)La7HtJ^Q_c>DN`hQ1fQam5%813!BS zso`x8bp8fF#F1>UHYV+MQaV2A_{8&cw}6VzxR*yZs+5k}gdfF(r9ipz&I~v;oKcxK z=;^w6-nNM0N_uowzp{(pzibrfCw0zwX&nEkdX(hY;Yn|Wfd4$9yZ^E75KZl0|FH2G z)4!#FbLZZ91---iZgDkQ2=IN6JnBwmKx`5=j$CcH<-#cn?WA-oDjIAY|8_D4mcpA= zJAif?RV3z2y%-YJwSG7Zr3H)aZtdi(#G)@9pX`svLWdhNie^`1a-Svl68p(IrJfKo z=9@A-Pfp9}x;L&MYf2xbfYd&YY?zl!tWEsRJ*z2AOilut-}%-$v?mx@ZfkHj5}!^c zciz&3LFBOJcA2F-JJzzAD71gs%#1-fKuYR^j*Q!>Tg6vhD9}EYc?W^wFtOuDtsqC= z`zDge9&)4L#ObikdJDmL{lQ1#E4vR=GyCZc`*?pv(K;CLo)J#I4@Kv=^7B_u@lPq+ zKRZ>qInpKp$e#yc7cwi@z!K?Lw3Bv!Qj9B}v_Ru{`@jI|+_Ap&4u@!SfM7t97lY&w?5el6;m2NUs4Is{KZ*LyzJYH-o=h`<>EQ@xQp=$K;9;%hVE#z%PXBIK>m{g&E*=C4+Y#pD z^UQ-(xUiQC2Z#AJoE&1i$hQ{DxFA^d+SNG8Ha#RZ`v+Y8nfWYcM*vf1n$u;aB%bwD_vYLiG_2ByhaJsTy9{!Y zrepx?pV6e=VqYQNT9n^}hv5;BBlIF?pInGVBf^j4HKZ6(u6}C?&n7X+Q{{PGo@>zM z;bbNx|5BY|VVls-3v^Pme{S!PDDr)t1&!JiCj{D%NLzTjhl{dL3>!|F9N_@D{lM32 z?qM2;i1M#Gd09xlb7KZ7Ahl3cTCb6En6Xam80c>|xDHqAg1?88O90g;Ly{Ff) z;Kjw$Bt+(h-qKcZi>n*-qB0q-^8OmP!2AorCSSzo?K5eADh9izKCiMX7q^9OYWHoS~<$Y^cjBlMO)`kmZDh0nM2>edfo z4YG-K;az_phsbK3W&@G5$UPrA$f@V|Gel;_0B}h9HMpbb@ZyfX?R)#2A(Gd;Ha8=u z^M^_2)#;~~9o7?;6t|IIcD(gN+G+8`AABh5b=@84@3%i12)y63XY-zCG~zLWN!^vj zJjCtlFWDw=GEi_NT}ZeWTGx8%(9tPd>v;J`fV{`x19xPvjnU_{(NT1L`_sC0#njgu z=ykuB{I$f>{JGz7ep-Z0>-DT_NjweW-D$4l>BNa}kY_mYg_A?T))>~ZCl9zXT zRINg~@Z?*n65v}*=`(5aN)F}fypqjMPMq3a@1RvATM1fQao2fE6eVTQ=2#8FBeiwB zY_C!4WpBOth2LhO|LoY6W=e4drkMOg)opB_BNB_P8VBM8VvQ-+v zOnR5@LKBq{KwyP~_@7DZ^~8$THGP(BippZp@vOSq-TN*<&sWLp&fIeQW05y6uVsQa zt+$hi*L;wm$B445a797jf6;TZW$eK|d&BlV%hw7ZoV~yJS^kqU=w!f`Emr;j(5zXc zi2d+=mJ%Tb)>_O<^J9ID5BF8GTiv(pF~4nx%=RWo-QXo)H?XUs^~j+^|J63HBNFsB zF}hUTd|x=pN#opDJKL|g+fyO*c0D_^7ArDq`+|lqT+f;D7B%f-T@#ulj8xgbYSZ%5 z{rSZ+rRLsq$LlmZxljB0$gE|Xs4csYT-K9?41Y=O+g<7fXl2(y@6|;FB6Vx>6<6 zH&lG3r@E}EwaIEL+kt#)l)iF&_YS$fNQE?r!TG}|c}(|Ab$ZAck(}2;E}10H*-Ha^ z2cz15ATIPQHf+HvmxLxU5BN>76M=4+#YsBi5ppiaNYp7b(K@^V__gs|V>e34D`2?E z-bUYagbeRVr*Osng02E7dc9xcdlBrrA3OMNS?pFtl(M{w8+`K;8e_0W{24w^>gQcn zA{Uki(%n^}N-c5R(hm&6FN;z>I*3~n5T2lFGlv_u!RGG9Y`Eky%#rd#>r(B@ z6%8V(U8{acUndew%laa`h&~ltR_@;CvUH85%~F=5U)`Edm-5t6kfBmwvj=Qw0o~bS zP|7$OIWNG*u#uuVPpFvUF`oBO97{Oz69(vv6rE8WMX>6J##O~iyPVs3`5L`7F5mC@ z1n~S#CBRx>Vktlo-$?o~Jg=-z65dCE7k?e**S2DRqO)+KSv!D zlS@{H9)s1E8WQ-!DWVC6`N`29&Ia{V91ETqW{MJ(=tN{g+>Cb%EqK<{59s9lu-mq8 z68yI6+31zQe6}w(y%QZp$TW55UydEw!^X7zG9q$?4-={@+e=6T>r1-7PIN?D5Kuy~~mzYWcC9bBQ znV8Vh$Cs+>UZsnUW6-N%lM^Ycdx~hNSW^9q*v3-5ovm9RUggD_mw)}^Co#ZDU}xdf z2b4w&09zAZh{h99*!xg5dsA2i29zfM9T#$;i+0z+cCmtks@nOh#m*}zkSf~P*RxQek^Lsih5S&g~goQ0B6=Of-pqPI*Jp z^>!lSIr;wM)7Y7i9}dv#^R@1wV3a`xM+(l)PS042SO_DpJo%^2*C5E%_wflmL+}4P z+?^9#Mac7w9riveosE*ZkK;~Q7MN~W}yPBX)S#cydiGTzG*%el)J0Xh!y`oit9e-G%c0hAwRKHSXrYWaNQGaEUZM|_lVhF zzdlG*GP<>&gj9}izv|boa4xdWe|C3!y-tLD_V4#p!6&LREx$*fo8?c_Hez@yI=#tv4CO}fp*SPD#AcLuHwLjN#5V21jF6HU zlRS;H0cIRP+pqN~8-lat82uD_$7`B#sWwM-bBWz%ITiZ@%@)>CjV_!;rG>zPjR7cV z^-Az0ea2nD1b7g{R!Q`7Rh!+qIUu!~+2T6=t9F`&O>YAp;h-a@eUanwvvmPhC2*I+ z#+p@8@x4B|tn?SZ^S%m-Y_Nd6C?@SaRM>a^lv@R471VI|07+@FsEXLeOi--Y^?<&Ib`}cB0(d4k13Y+;QN`XL5lj zCPb%#C+eHK^rw4aYtG)wwfDO5AAK6Q#Rv~8NxqV5Th*?!@9g_H{p1hwjsyP09o zoeY*e7R^XX*p|{;5@eed%9M|`HD%ikm^W3~0__bi^t8-GUjFi*C*5h~pi2&3U(@E- zAX8U97L;2$#y1G>H~zgG*wXr0(edh;a(l?fo9yhWKekE*zm|aVI?q%aOQ$<{YAnpi4V64fVvV|8?kc{-CUlM zH0H_6;uNZpr!Z!dq3L9|aLB-RZZ{S@xUw~LZA(zUVckNNC>S@oJH|(LaXjL5KzGf) z`uVKD?%5CIHD+G#GV+zZF_n4slM1tM%jE&mWz=Kks5yIL?`@7iRa`wfuw|eNUlso_ z)*f&dLDnYYvVfP_wJbN_yw&_-BUu~~^HHdA{{Z#LV*P{sl+o*m1Jo;PvO3i%_f3&0u&xKb7DtYP2*1zqTYZ|*f=HJrGbNevn{ycfM#VTs1=XxFRm2fw3C-HMRX_4SLvVL zxHP4~<~4CywVEX;F-bm*L9jtsKcX<-FHfnqa`hjoxy!dl@NcV@GG)oCf!|}9VOxy8 zyTpw+HDh4*Q*N5r<%?!O)sB~YrQd;&K8473*<+9vU|(n{v<-87gw^bgf%p1j=rih0 zY$~(Fc3V`U$&KNs%cme-gpHD@q{&XX>NV@h{W#LjU;F+OT}7}G5zx`xa8;*(Je5l2 zkX!-f7wNH*Ov4q}=8%N!<9JuoZJp)l*W&?ZEMJF{S$8Jc-wYdqbe|#6Pb790S99^S z>-LR=cEv&CY#!#+{s+STZ__Ae^4nVPc@k2zU!OmOyyw$+rwGHXOLs(@bEu_{8}Ws9 za=i7{A}4a!T?%FR!^`JS!MjDRKF1kT2>MUsQKE>tBC$RJr>c|C?-%4lf;r2Xqk-=u z>ZHK%-4U^PqKC&D%=YF9b?8EEX5i271K3*9u034V4c?@`meSbTS#*!; zFB`+o4Q9GMw=X;C(2yl-uT;s;k2~ZD9r4KCm#2Jw>%s}8P-{-HzJ1`&2r3@aCb|j{yhbGz6wMvS zRKr-%(vk)CH=UtohhFuFa+3iejv|JiYWv5lIa}1Io#$nlHmZo%{WGYHKqgAh4`QS( zKu9NY8)%GeKGEAaeV}+W`fD;K)e+v+MD;2(EX^>a7|GWZJpDH_#X-dTRbSgmHun4+ zy3g$|q$6LiY7{MTePwW+0~2zr)zB(Faa7X=oU}}*I^X7fv3t0S_Ra()M1>Gxa`H?~ zPug#q^poZxNXdrjpJz%B$d{U`(emws3vb{m1J(E&jcLXSI0hun8LtUv)AwPY1Z&Jy zsa|IZ55HJ}G92HTzBCyIK+=KijNH!cy;zYdO+2c|KU%Qy{=wmz>{33B~ zi8%PY`Wm+qiaFt2hcK+tg+2}FegU-dLPeCw$u4ndiN#wG#PebmJ=AHWF|?79|H~k+ zCH-KI*hf#R*!@bPj#_pb*uazq_w)w3W%z-t?88@*vyXcxuy5Q=Iw0Xz_fe$)HNXFy zMtPt9M~>-$su{YkG*dUnqV5_U8W+NG{7##L#)<{ov%kYMd7Seq1(8aEYv26kyn;j# z5*dObjyroFIOK}W`G zRVA-_g?#^?eFaXh8bSA?k59w27p`Y}G&WgoKk?OZh4PD?U6nLZJ;Rx2Ie024;0c@) z1*K~N$MgjxoCitF6e748omuG@U*QBD)$dwV>5ju+o?wf;@T>Gm~eB* z$d)kEvI(g28SW?Ig<>Q4K_tY%y$)7s^2$Gyr}FgC-qTu+3^w`Q@<0!i*QZ6ux;eJL z@D^S@CZwTCt9MglyYr?qZU_A>PVU6>DhkfmIg4DRXi-`-;uo=nBayNzT%fmdpTpwt7$VICvn*4PZH zz)0JS55(gjLRU!5$0>@u5mhb|Wd)#W7`-CS>`w9#6?PSz{rP==0f z62rpK?=S+{>Cs$AK<6c_?@5cJZ-dl(FHy114PQDGeN24iaQQI>-R=Uf3N5cP(SFv0~RfzATqe05XpA74^9QYFuK00H5W~Zg0}(XRKu96^12XwyEGFoU3heqr7C!K#lCq+`nEYX~> zfr1~oLn+LgDjK@Yi6{9IEu$W)u_I!_&Ro_MhLC3e-H=N>ShAxfIXge|Hii~qoD+^1 zZ%y9n-GrKt+dX|azTA?K<9(iveO<1w9tn~Ub>ru0?X?eB?R{vqm1Foc++su<5@HP! z5#IJmq-Ke%vrN;!oxSh{pCEY-8St~nD6*5=m^>`quP?j%ua$3@^?xqOqz~-&&-Q-x#2y{djkgbD z>KIh^&EAL6$rPZxx)BTkE10Mk#Tn<%BtLSZ^Gv6)_e}ms?IE!+2mt%5OU0H3(!m4< zy(i6@Dd%u3GltXonlK%f-R8*VQ5jI=B8g`hD@cFcMa&*1H-;5yrcG)Y9rwOf7C&8^ zy5O?`56sapD)EfV>P5wy>5cA<;cdHe?ciH0yAM-{Mo^(gYRo$J_&~zVb@im=p-h|~ zNG9VTo9BL4^}fg#8VatEbsBk)5VCZ=r1Ddip99h_u#E2{ntNNWH5>b4D?w7RZy10P zodxuUmxGMUYW{A=4{MRi$}CTw!e=pIC5vCi3wYM|$)`f=u+4*opL>?wFg1siBgw49 zst-Z0j|b3)MpjdoC=@Y2{W}N?MN*zMR?Pm}uKsRSPRyylzqjUvB%6#}@6)k$ z3#a?U>$At7a41d5uQEEiJd)CWfxaLZI1?h9LTiocnRFczzuDPvFq{4CM2 zm#h*a_S(E1t$ulc3mce?+k~@vHzt8dGW?+ES;twAC^m#Xfhx>MjDaL#XQu(YTLq}E zv^sk3m%AC?cokSP)`0yXOr$2;ydb@1U*SYPBzwq{Gg#la!5q9fcW8yS-V5?8I7QP} z#Ck0N*()-~7aRu8sa!im(k#AU@5VePmYQ%aJFjU!Da0YBtP^kZ zWhU1hus~Nc+mYQA8?7qn7O+e-Bqr6YK8%8CBx)G%)A9QGBw!SOGQ(SXC-+;K5BD)7 zL1r=Yx70rUPof!Z=9ZVPn`N8KNi9AM%gO9QDDb^3^IUc&=kxISo`beLqMDmYEIH&tk8>~Zrl=FJX2EWasbPzV1~&d)G*rjY z+*X#}34RCAPTfn=t}%d-yntF`&9Lc$2U>xUV3jDsWY)%ZV!rc8b{39)rw^2@7K7fh zmXsrK_l;#zc*MP?{_*qlfwvX;SEUs3Fk(v5!#DKY^NfurF7;0v-di7veSwy}a&>Yz zE0jg@FZ%;PLmkVOLzB1#WoZpA4&#h{(yFMhHYAIlic|)Dik~T5&LvWYLqFfXE?hcedt}+{!T<22K4~MrLg!B_AC2U?g{{HFXPCIY zT7}djW<6gh7PjOH^gOUOzBu1>do&VB@c8*vVC@xUJ-B{fuJ7BrgUbpW!&o_PJiilJ z>yjrB)HwnHT`e?*jY*rmtasn($aUT6bxDA3pmv?! z#;sk6E@kxC-4Gz=qdA%@Wagva(S{8lsYG+4ZDye2ET2Ae_#jh#%>qfzC8VS5Aj(}J z!LvCPo5zC})6sNs!3GqFfvW+0J;SswF5>lYscwU&2Z7Bwx=g3JXeW&`A^<((bw`W9 zm6L{)Y#w7ToXVAaoS1_%_fC09NodryrQC7oY};ITZVia8Afq=PPwq6RY5e@SZsZpW zdK+O)qd1tj@M!pi_^P{C^up|_c!Y6?7o3wOkXh~Gn@fT$fbOg1gqd8f%#B#o^ zU%cIy5I5(OtQ@>}zy1B^IVUFHfNob!MtjYjkdCfhpFBe)rE*2xmCXm9IFaeaTD&+o zPyC7NtvnG(pa_RCMohC0JLeE<*YG5yaM7ca>V?LAd9Mxh0t2;x&xf`(hxj4j|72d) zM&A1(0F5YgkFNk(|5ASJEx?kNu zG89~P6D!hg*)!q9+pK~JiCz&nj9Qu_8{p>`{LPi7wIj-b&UT_b9!n6kiZfSyGi z+US042 zp2CFnmBmC+P$c4e?u-=%Kc8{!gWT2xoG2S-oL8kV#V!Isy=V_!D<7RulFS4HnW6S) zP&}OSIco9pD)n3*H<``f?YZ^2rzYOB{?}Q+hZ9Y;bb3sKgC{&Sw{tPNN4<4U9urc1 z?@0i#$>7NxIFL%>r3Zj{Pg0`GkHMrYvWIa)& z-!$5vnXOqs&r%752(%5eI^grpfBBu8$X_?ORw>dG@Hz2dA*d=k^a^`fgk+owQC-r3 zp>{LEsfr%jTES|UA%EmB94Xy$m5&B2cdY^%0N)XAe8Hz3&)| z!&}yXQFiILl;?ad%0EGacjkgA612_)=I*f=^h4b>(c@ePp6urj{7T@RMWApO$-J>E z*A#@ho+LR*V)6NQy(3gVoA-+vdXVE{y62B~V?XNat@WL)IGJ6VItwL1qbYpHRDu?| zC>3GPy+iE5Wn4OmVPu>B%eqR(6cWqvp)=r7Qn0Q8yTK5^<8kxg<2Q$fbz8heBG(+U zMPeX5wV*x=Kjk2dAs>MmI!iX2!25maXTdQ$L%&;is#=$dqZ*-9j>GFxis=;guZp<| z)+E|555*$gFPaxogCuW0-IsPd-wmVj)VAWLX9z7X$Q;`%#tKp1rdkD+o`zqiJCPy# z#17EgS{kWvDnn>BJCom8w|g&p~Jg;P8engr9w@%~tPzAW%a4D|SOge9PuHg(uNuPJ+ideMDcj49+Q7 ztRhs#DzrDvWpD&>GY23l^T9R7T*~QTj0NZ^pb(P00Pgtu!)MjeLai1gDk)BDT@mh# zsKFZg)h`i_({4@p?7JkC_nVCa;qxBV;=Wwsnm^!Mf9FPJ@TaKzv*V9MU)oSPg`a#m zIVrVEJmC-IXX{-1i*+5Jw>s0eY)p}^xZmUiKXLg4ro^T{Rxn_qzrCe!v3MQ zw|3MrlEAo36Aw7eg>Q9gqc>+gW4~`Onj1|M2h|tZ$xT02Vs!jnK1M#Ovl^Pw7%Tidv??IYXC4yNV+<)&))4)xtt&oMimBO0 zikIymgSkDzsQTM;KQulT+YahEtt%~zDUXI23dbl~-0;R@6H*{o87yrdP{j0S0tj%F z-OjU?+1uL&7rk;IO-U@(Mh!UrMSz{^ni552gxwjKmatw#S}4G~G0_N7X@0 zv-Zvc5I_rYrP@3K)(Fos&1Yr@$=8|yxarb}Eex}>s7rvtHk!J z0V*M4nuzcwx9u_!nHoR8>^`-Bfiiqw6cfu=)8>63!g6-=dY?yJpbz^yWGNZRfS6Ck z1qdQi%KO@Ny&0hdf1>|@YN9%}lVe-bzNu=XXFV;~&tc z1?DVRh%Y%qB)&=#HaNb?^iTQ9*FS$~P+?XNisSjwHoQlf5Wlck0dB-Q+ue`;XHpg3 z^PV`hhnm2Twy=tqT$Lic08?bw*mk-uaQ5dI2r^*OVmJ4H=BnUpeQwJ}9Xj<2nAUP&jU^*R@~1_4j`0hx7yj22@tgi% z?bLF^?7yyhv^67wy-%=h``Gn#tPo`ik*0?u9Aa(!DT&S`V~ia|HLdfz+G0ofhwv^r zkK{-{g(U4Aylt(F=!q)}UXwbxn$4oxoQJD5_)G*Tkzk|hDJ%js`1%UijL$0UR#bQL zXyx~J-iHZ-d<;0FmFlsAL@ktIS)#v||M2Yzgi>Ql2Px%K+ljBjF=c$7qA^{pLy^oz zCMEZ0)7Ym-M`|s>bS}l>vp<3=18-!yY_t+plr19O@6)in29_o;osv@?h)(C=azz7k zpA5=OmCqJ(jb(IeHSZ%A%HX>4E$1wPbCuq^aH>U#e{@DdD5{9yYQ-cFEe-#ftosJz ztgzgi>;5Q-R~4nO_Ef-zLhl%_%VEGf(Q+N`^s7=Mu0(Nc`~FyFIm|w;-I5{?se&fK z2bHpkcBDY_2-7QKKEDn=foA!~&cg|Y2$cG8eK48p;rlsJZ$bCoxACWr zZsh0dBqc3?ck3m+BB<;$EvJvq3zP`j+VwW|KHi!^wE8GtSju}INGogxlp7imWyWHc zo_)9}HUv|1txZl_YQ6+6E06H@IVl!PKdkLPpH4uFezVrSZu+Dsb0;e!^B6(tS!-?bfFtw9Nfwk!u=$<{>#UtFR$zO5 zp6@<|D^emrWjyf9YzM#1AOg=gfOqggon0RwGe{4Poaw zD;FXJ!d^1AB0Yts2uwKyJvYB|+IvU^e0J!#Bm%GzDa2=H%0HMN7+jVrCGXb%fGb8A zY_$-2`n%=3+jbBN7>3o9?@LKaAxq$$K#(SX+_?p zj=;=vDJAs};UII`_^3NxE1r3d8O={-drF}v)0QTYH_;&+X~SMly-qum+#uuQiy2yA zjR!<$Je%<~jDFyNip%fw7Ss{wEgD3?TRn(QRk~9N-wb5a0xh(n+8@jnwO9}Q(y*p+ zeQ#E2Wh~O-7<|REngmBs^O*9n(ad!ou8$g#8Pw|@Kg@qR!vXRJkw){4L#9Y^5_zEV zc~uv5`Ml_aNU+8r-rqrI%!lI@t6GZ$Bv_5fu^kmWD^&5M4AW=K<4;)Aqg4jb4-+dW zURJIjX(v9e_CtlEbq|x+!!ei_e=}1 zoXf~`Yziui)=`4O*`)jMSW=d2VEPSlPb%r(Ra^0!9~#H2Mxo*7t}CfiPm-|}4z&N- zR5Ka-KQ-8(^Z(aT=|Aq%yFk`q*ENpBA@r1v( z+U|PMEo<77I@^2!bfqwP#m+ZF6M|HlX+GOwk zsx&=VC;XUJAL{HAl1s?X7mX+7Eurp;$c5%yHDd*h=1R6bwR?lBZPf|ZCEqNkmxBWd z68$hap+${s+4rlNX1^Z))H<&e)(be9CqVX=QbVwJm6mO7I3lWl{mlvzR9v(+*xRGj zatF9ul#vuSY+KM*8uer!@6wIVe+2A2kJi>mcpLtPSIIYcVK9eJVU8SW)kMkB_XoIuXGRx%|`52f=gif~J zCMPM$Bk~*;Rt{mKIzf@Ow!~R?o4ELGFa~SyX|Z4@AIvWj|AeK*?Wm)LJA?PoN!8RU zuCKjUl3*BHbw*A?&H4;^S`IDxV+s6F4P$bM<9m+dxo?&Bd)@U^-96dxSe(HNsOli|%tO@_=oKd!#GVIY- zXF3Y>W#6*-*mmiCd&|0c=_rCc7~Grd+TnuY{*`ueJLDI2VRQ-*fH=eAlTxvbesbe6 z8T4mkuWOJP8oPUuh-pe{-kmjD4La*}O}g;{a0PNzUY8F(4Z2PXO1v&iRzqruSh5OO z`h0)hY~@uO1G(I?GRH7OAiW6sa8Ks*Tj=!~*P*|e4a}bKUF~G%c+Y6G7NP33+RR1N zL8)D%f@yQ0Jb1LVy`nw6n#{U_afjqA&%aI7 zNvB10DbhxoCosA>it}8C@dA0k+-9fkWm{l#qSDWK(N#5tOV=&{EALQtd5YDmochT( zL&PI7|5bTa=nClV2uf267UX>*sZ>KvR0wu5EHzYuW3eFV43X<>{Q)&PyRP*)2}nzF z5=4(};Q!x*^V^chD;Vfzy<0Z<2uL4;?79G-M&(_an*-~7L&B_hNhnF(Ca8S@F+FJ# z8=UM{CKC^bzgsKItY0e-Q=$p81*Dfw&uTLot6oO_xvCIbBf}0icX4lfFAuC(eCu0a zcZ_%D!~)SZBP)4WU2$FX9FdDo6JO znH{Ig#Q|25(~Dw)E-S9C^_hG*ZjTCNn%L(3Yd=a&BN(@q@-`lQRzd_Mnb-jG{|H1?PEkQ59k2oW{fXLs zc%QHjcXTMX!K}J*QelAT0%l-F zKg^?nSTiBhB~6l^rIow{wXvK+N}GEi&(IkU*A#DcCHOr`xTLYsPf29o-US#D&=S83 z9H2)$mjX=i-TwEr;sJVi-tGgLu*YHHcXk-$yenBuKfWjZFt;S}M?#wXF+z!FH*m!V z{6yQE*2PAFFr!&MwW`X%T^ARZh+3y?RbX1C&W`iTzJPr2pO&GZATcng%iVM%=yCRf zLv~xbP2Ai>H3svWWH4@U-Z^i}=Wj*o>Zr8en3M;JZRC6D<>UhR`7Nv^=J~#cID3W; zqvN~tcJ@cf66V7Uw!LTGnGhcIt*wra4ao!#d+a6^`wxELDvjo3N25~%V#!6-^XGMM zNRc@Z7EK6!$r5o(OJ;6GnmobRr?cd4RQS^$b?swe2|dt40Vzp5{n8vbQZ#TeIw zo;$tu-g6x1@u!=m44IstVzjU~zW}#!GFnsUlD^D0lA_Z9lG$%7CzSS(cFN^7+mS~> zcx3bUd2$FQiaS%HHivn`VJDrsf3JgA)pLaQ)07y2qv9hr4i4b3FmAE;C%3r6(~o*M z&9Hgj%`j(i<>b_le-R6$4Cm@871PmEPa{)u3^p=1AX&Ze22bsAE0?kYR>b|8KG>lG z#^tK)nkVP^9Q*+z3aey}~^?YfNIbPCqQflVC}|_S}f=>SWf&=&q2Yf3dN# z8A3d8aO>G?xepsGJc3Q6mFRWae=mdy5zQgcN2nqtmF`5mdp+B)=G7;zV>0mV%uk{fZfM!mNN`Dz z5AKwa2I;;r@|E&}jHj&k?gO1E8C-Uo2UH{L{QH!lsEuA1C-2xEt;Dp>|Givfr)hCzyn!z;Nh>{d}^GccQkU#mJ79tt@p$K`WG9zKh+w& zUTHyv+UXjJz#b|SeRLK4%w!k}UvWVuYiYgB$w&EpJ?n~m*N(ue3LEg9*~z?-Kx?&H zS`$kl$F{d2!6`LaDEHYIa5QtYNRo66KeOv{f$xcFk7xav`cwFBgs^n4VVsD#rzTg^EKP}d^o{pn#N*sT%VF$R&~4<62BkHMN=>L6SB6gd z;xuJb8?0$k-0#yX5<73>UMA&zp}3WA^+yfJ374OE@)&^_LXrIa2IAv3x;Lb|T@2+D zLPEwuI*pkJkq6C!-i0?RH@#O(2UU%eqjS&YXbVO`>@_yg2wwcGUbM;0W?SZIC!0;G zcgl{QK=z!S*_LVOrilZ+pv}2wyqlj19b1Qe6Ly{Pa{PTu2P_jFz?-I=L0D}G{QY=G zF7#XI*_U_Ig+$Oq_x$dUMH%ibYhkFL!}I>bhhJli6s0VNQQ!;R2) zI}YbybsZgphOA>TXR7pk9eE#b=G?rK;#vXg2rQZ0!{Dnj(k>?QNs476YmGD<6n5LY zKY*~^L(=#clArNiF6;h&=O#N^$@_M3XU0Ax5F2a-7aaFd?pJzpdTY_WaQlQS>mEw_ z?kIkv3SH&~qMDv2pNl>DWpoa8$riu0Ig6Gq_Nj~4?=JJ_l{=!r8esNq{a7#)OA72T zf61AFjad`Pt&rX9$CPXLvYkWpX(=@{&?LX9s+|914Evh!ZLlK4`djMNNfYQ?wtS=c z>%2f!>P5F(<>&l!)#y`X>Aq7n_fzAq`ofYC3TI`yQDvQM1=W^*#9wSG79>Hkv-hZ}Ei!sT)cm9Ts8$_HIw$G`a#^J@73haHOVmfbb$tX7-6Tu^Pos)WaOp;Rm=n!^q*C{J?vxKsL5q&v>K*J7c3JM zUYQ2`Ff4{NopOEfsuw2mxQ=x1x`)DrmY24iTu)9t6IG%v##M*bks@jmU3)yDPBQ(i zCxD#-i_l88s*We_(0+bhq_raSE61v@jBT1Fa}`R_jVPN89-oxB>RsBwUO(M)0med>T{70$K*n#}xMit}b^PJc+ zx+W2~#qTSZkAP1n4-na27XvlIn9hW#uD~OH>M0FHFn3`VMhpT9ol@6R1sRQ}+t2^p zMjnGl9ub7Vi4X@uKZLUX)$KgDMVX)8|p zxLNlMp$>Nwu+DrJtZjhj$^Ij|w%j9Tf02W86`<9!pM!(0Fm`!W;iiv8M)nuA!Ee;l z?-FHW_F@>7kU-$(F?cE*sH|={Mo9eec3XVL>oiezc94s&8H)h-ft99xbbA}G>o$r} zIT@J2cSbsHwbfp~_Gj}+$0*bZ$-Z(NhV(5bf#4k`mJk7HE}9H!@AvQYp~qfBUB2OP zO0zCqf_*|HmmXvHf@2R-*YJ>-KO`|Th*@{BE$g3yI-Ui|xdl9|Rt_%NM2f`+(lyaZ zA)zj7_zKRv)_-I~ydwe?hw2i;NggVaJ5d+0E2F~0o*q_6Tz>V9e_l=4e-*p$;fqkF z_H#<}Ixh#&v$6J@SJaI&BZ%+QbaS}cCJQ6G>tv$9?0`23l!EN-`tbw^)2d-yv=hk=p!R{BL3|BdiKm+ zd^rPLm97hDfA=eYe$?}vH*>DigYWK7pkn;V$hUknrLz#WS9!#&xvfp`pjh$UtUd%6 zF^g=iaQiM)iS*n_HH&oSYJPOz`@vr2gEbYx4_cn%zsio05U(ePUNO2OD5J~%I};t1 z?k2_Ahc%n}$tM?l#O(55<=q@LoJp;GBNu6Oey(Hl<3Nb5tyXVnt-wcu-q?piU^!3h zrrYCY7{<)FO&4t0K#VuMDinL~ZP*gjGRe2ViV@r2P{YxL4L3SAIaJJdSdbCQ{d^PX zLh919MQLhwLiBx0Z6BjqdSI%M#3O>tqcaJb1fkBuzA4-3J;HBV`Y%&>R!1L@%^_3bfoC0!5DN%{qP6B>w}vV5<}P z*ogM3?L_c@DEq3Qw!(JZIxZ~~io08Z7Kh;O?ob?pLvRQbcZxd{cXutW#a)Xg5S-w4 z^3R!bx99A=uU0PCOy*nP`#vhWf^or1yw}jVzzGr)Z*Wh+x;N|yJ3mD|R3iB9h3JvF zHR>oG%YA1DWM=f{#a$Cv%i0=CTVB z=Fv%Y4x761gFKt*kx}S1(LAs?zTyAzKrJio>hMG~~pd(TXrw--Uau#BP5457<9ZdgGo`mXpUj z|2H8zvuNN>SQMLE?Y0^y$k{jwMS$r|_<|A7{@_g2c{l$gkUBbbY&0bG{mrgOs&0}U zg~ZmW+VV&=KYL35ep`;9UtMV_(Ct^}Xj$bBZX4m+lMuCQNKAM#<*N9?Q;0u}=DE)5 zFU-3}4E&_)gS&`0zlS(cj)67FZ)sCn^6f*HgtZMfGVf1Bh4CuWjG|){(X;o38|QX) z9U6!t-7R-$wVs460g(+vpQ{Ci7W{Ln#|@yy&MYprwSy@F%s}?x7!p{?6%?Me?V;V+*#xO;lCp0m9Szh&+dMsNuNvJaQdhsr*f>XXG zykSPR--ui`j=#Aj%6{{%AMH>T-Y*J^#^*weT`P?&T}YZEec!cFuGerkRxx60A&xw&X0MW%?ozLk*frqdj*5qCa3oqql(7>=H4aX09aVfbtoSQ3ga zoI`vz7K1cYBksNeAN`zquN+&bGtKZZnPsKh50~+>sgu+gt_gGsaFoYKW*#z=Y_1a^^{vKeI8hAFN9+UKa|L-gn zDcyzL$=KNJ+c`FRzj_QkBZ(NdkUq4jP8v+}aeOyS~HV z1-i&PkzLrQ9^$;0qQ?MNRnRAL$M9e53Q$8vCSAW9aj}blM?Lm9Go1w9C z%=pB&yd@@NHk-%nw{!aFTNU}q&e+;W){>x^o#2#oeGh*kfmGU~fV=is*Oa|ER8V>9 zxzobdg}EnqV&=Y0c{EQ_2&e_wo@`70>p>BFc4`vL?7Pgeh#nzc0u+7Z=bdZ6xQd9H-Gyh zpF{ctI)z|SJ8E=b@^nFW3ygErzps#ZomrJUCwFJu%rNkeE~Sb3FPR|bBG#j`Wc-|+ z^)%*?XgLleksQ(P31VN}N&J0B^kysyg?kB>;}R8@%H`feRI%^$b3dXq?_<^=6CwpH zBW==Lv_2f!tCO6ZU1l4dZ;X@pxE$;BCvp1#@+>l|ZvQZzx~6_LADm=7uDMF=bE-9Kp5;X!w%;u@k?WGVz6-nmM7cDK8@A+=)2BnDH+ zjS(6x96zU$6mApgB9?tuQAw+24(^X-V#zAi+_{vK&?C&^16C`;yvQ4iRHU6hJGrh` z#PDx}8TkRrR0N`eq|bj;Zt4)%f;nJChxucfkmU)})dmZw#4XH$r2!+2$I33GNN;S_v>{ zA6e7xw(uz9BE|h>AG?+9_4QMPJ8~(|8kjAIWDQ>Gjz4dt3tjvzmDQS5;R(Z=+c(X2 zU}Yyq$#Um0M60hX<+5QVzhlgtpfSyj3euoDH4Iv#R|y8rYT}qBN-uv|VP6(&sdF1m zN{Munkg%}P9-ceB=vZQ6NwCn+yx`4Jvi6-T9_3BFIRsWCh)5*B9TQ?)=j)^HGdWUI zGW8C(cpPjKh9=*IJ&44-9oYFrLr=Q#fY1~+8TlYiGhQ9pmvMtmRTZPFA0?x5sgU3S zc-F1=_R>z9x;tLfNco5Qs;63w{6hW9)u!k1^f*#UgQu-)LB| zslJrTEZL0|>a;2$GZ~>t#DRRvYo#q#3!LpvxBtXzL#Uk{k!0clS?td#>v){U6PZ3uy$i;=PdPje4E7rN6<2TG zxqp#tcg9ps{xv%*iULF%!LPt`e&Nmb4dxi(n#4gf(O%YZA7o`mx`FrK{{&-Um&BM? z_hdzO0})0%_Fr8f%3qDooXNTTHeGz1JJ& z(VwG@Aau^GouCTGwT3dtxAg11#C+}C)r7mQ_pHHR-w)*}>2Q57BWVrdGv_t=A%Vy) z7_U$N3`5Sk;aMM=Uu=D5S+oqjvIgN3?!xeag}Xxsx~?+dsYC7Fg&O;h+;8j&D>p&x zTQ`@@sr57?CI{)a7emLfshaS8A~r|;!OFlUV&tK(36lbJy6k>W%rkuEAEUCK4V-`? zIMk6ZC$+$lNC?ysfno{y#ZF&b9=rkhbDd~^b?8+XywsXJ6MU=8X3R2|TNPW>M6&MF ze?IS#t$l=cC5cRLLXu>@KnO%G?<3I9RZsfYFeFU{YuqUDPLVdC2I>Ww0iw4`7Er!K++IAd{a7$|`t34MutYKzee z82-LlCRtJWf!s8DD4%@%3#c81Q9;s#07<};qDr^Ix~a*Z^G@02Q!Cq~Dc_sp_qdq9 zQ;12N4A8w6I27O(oo7!IV_#Ox92tJzGXsHCjDPoV!HHrm3nHsr)ReKp!#7n5EwQpgpO`+zCAkl9A$g zMtLs@kDf{(M7_#pK`Y%Ee6bfMI`KJ^(ZbhMvfMV5()%;N&GC8{&BtOwAfLV!3*+H& zbs1$8`CZsw7B}EG=Yx0*)Q-IiCXsd>GY(5kiFnO`DypZuFXF|d$ec9rEX0RyIMzmS z5tTw}n#6HBG4V!F8{i(<0@bCLyI&V8!kZv2Q$oQPA7jvK0Cad~A!5y+-{_$jbzUQI zjx2eIbjWPc7ONc!?D)a)p;0If6bZ*#T|^{iznh+n3vdnBOHlNd2ou;?nVR@+#;VL8 z#4INE>xaf#&%7w(#~YSZF}`C7SNq>khvd-*0u*}bBAVUjTbQB-M~eVal!p*|juT0k zAxV^W^>9b;I#R9VkkGRhT!977N*DHfHvo_JzMS2aUb&yqX>0FLXW8K#Lg!}Z?+jvw zrI2r+EH`C3`ZYH<-L{W&ix@CxoiFrS-Mt?B;G*7w$=^F?s;d{jx@UKSwZjev4Y~|h zwEVeYJ@Zy_jpr=-(v0gzluS$0&pw*TGTc#4$24ZmKxCQC6hy4k&iwC9#fN1_J5%}g z$aK^pJKeY2ams~eq$;HiW2daI)o?`LjG8jNBXO5!=m1I*q}LXJx(DAc<{nzV#EN)wdY5Fo*)VvU+nnd)vNQ8{*@0c$b7~J2 zTvv~+6|W%u1@}f&G>0eayrT&`>{9vnm{Wu#u`tJ8PI=aR+N;~Uo1rcFK+gi)yO9kc z9+HSl61sf_muML4Q>*H(q%b=DtZ6j1Qt?{Hj$VY~3O=AF>J{R3Ip{Fq|jidLuY40I@ z`!{^K5>o*3h1{w?BkCG;Y-`VVT{3eFbT2zJ>9_YIR;ZqE3*O{pe==&eB&7MgDy4Z! zSr>B;2ZuAwI*xr?J6Zrf8XMv7+}{rp;Ou*hd(~BGBVpviXdUgo1CpJ3gjVB%e}W2& zA`oBmN>`{L;_;t1cl2q<}-pvJ-;hAJE|Ei1a|-ttS5 zDT;swZgTv3-xa%K>fl$7_&R3Diho<-fz8KQWq%n57*=mRhgKDims>{Vw~@}@FGmG# zq%tJz49ZoEQ%Hc@;Ib5A@l(7ANm43K%O%XzPRekg& z{5|Y8&eCA-ytzI?ys11bXQ0Gn^(|HhbqKn2zixb6C3;9tXA`Dq(PTSe*ddNEs&>7Y zA|xch0C2Uea))uTOa!>;(JOTvV!ZZmmsG-DwkPTxtG0$@k#J^ zHG>*gMvX2u+JihZ{OE3MQ2R8@yg{j|PLqw*O?DdxP}S=0kiXIdOe0Cm;Z?95&%OId zY9OAJ!3YGR7b;=4(^c;L02#FGnVn*nOXs*I4iPp6d>CLUFZgctkebW^bTVdFFeD^W zV_+40pA)V9{=toFp=6Mkgf(=cvFqm*7-&PLnX4!%0XC0Ty84>TC>j)|O@j)Oz4>7+ zrLYf%xB`8X+EoaFU#fj&&&^xCV&aq@dx2Sy#+hfAc_|g`v2>Q9x}J2L4}Bfl%BkNT zeBFhN@<=P^FQ0`TvW&97?)^LZpm)z&HX1z&_{wJXN}ETg9CdHQ;i-tfgEs!;}y zcVp9T(o%Lh+~@=Q^YQhNe7l#21OAvhY)VQx- zl!;Zhr(QuHcNeVY zSQOA(J6V>IsgZs!$EhG2k|B4u-sF&3_Qhkz{v7fxL4Z)Jvkul?Ex_woy83%ecOmyd!lSG!1P*DqOeut-*PO|#<*TQW{6Ir6G1PW%v{Pm4^`vj&Unb*2Q1z#() z6EK9M;<>&;_|hW_S2}?kpRR7TnXhqR9ZL};=I(AzznlFxUh#|uU}xFPE@!Oh*<+-) zWEoFkb{y^v+; z_$I%NNW#%}|Ggi@UM23&I7(bVwT&=K{H7iS<#&M)^m3K6vs7ro(%!%vn;~kNE^cEb1wilxJ_z}a;z2T$Z;UP-l!VMVb{eVd+h5>0 zkNAlE0A@IbwmTC=co?loEdWREdKO;*yqW&z-YATEOPD3i2(?j~frl2WY!PYicLR6f z4}avKQ)eULiZWr~*Mju2@G)K_2P?CvN*Z~pE3L)5+8rPck}mdOh6kAPC^Q->Wd$ah z){zpkPf-ZG`nX~_C2U|wLsC7dt0{6Llm15z-9(%3~u>LhPU#jBw|YnORr zkQy5S+um5knWt%SJs}DmRmeCzO)^_F5NAjp-H z?~k(8Si+Nk@?0Q|DEr%Ot@pb+Mzpl(R*fZS1P>oxXIYcqU%E<3|MVtypmG^E6DY_J zB+->RN9~b;*M5g99EWPCTa@oHB1g53VaFt5#_e}<3hITc7-l5o_%c=s<$dEgG9OOe z3)ku4TY;Ne;u09NOX$&YaHHv1bEE}L&*~p`xUiG3j>i^b{PdtT?S#L@FZehqw(ReS z*j}+*W$@!^zp@@~P#76yI(O%cc5tWNHrA--ifdK463^?4o2Q6vW8fz+QK(rs{q^>G?a}`)l8m&B(|bgq)A>Uz0calNW{h;AJBnvj&$_ zZN!?|ZA){polGXy35W0gQJ>OPaU(A4g4HP)jtISeh6<7zoviQp2JF%Or}@kZIU z+3Kq-!^x8$zmjxQg-58syXGTuxZ^sB+L0jf*#v&}rEHZsLWEHVkQh@vd!H9Q8G!e3 z78$}?RSmwnL7b$^YXeG3LbQXp4}s8dm1XJuUy~y|MHD9_8#8fiWWI=aR#<{1LKn(s z%($}Bg^#>QSVs2yY3oi}4Jg!?cs-Y6y>nhcdh=QCOM_mqlfIUZ>7o8Ux14jlmuy&3 z4`ChW{oCuICpjF?UM??{wd&d~kVo_9_^?BfM|}`eeKfY&rDYY7ms%=TVN>(DU#M1a zuGo-+&7}!9xfmPGxu1W0fjZey`QjRrUwzykT776I^=|-yZ+%(4%0*5pvaSo;2GBT` zr8mH{j$%gNzNOnF+4kB3$B z1!KFSEaGtZ4gQq{J!NNc<6C|z(^@4hUY4rlK$ER*FwS8{VpZ(rd}@l2D@DdylOhqo5l{Vn1hm3=mIRE@Ff{w2MfRl1Y(^<9N6lrBjq=PPMDZ(#uQW5e3n83U5;B3U{ne#M3S2U&!d!twzh%|?le)mv zBxFz6bmV)HI(D`BGH?3Qkp%nGk7cQm!ihoq_A^-dRWhs` zN5-)GuhSY{B$zU9HYF1aJ9^&)bbT9iS+DIxI23=LvDl%JAqDPtk=D)n0gyuG6lOFN zDIqdg*{m$UJ3SDzvDF#6>3!qPK{)2SmU6Oo-cYc5b0Ygin^6vcEB84|EYP#MeiwD# zbo&musRi_P--P&DoX!ukL_thMF8U4QxDCz1weA-yEXkB0cFlJeVOO=jwYf<1CBL|) z-`m-)Ae+Cv`KI9NU~-J7j@mYR(5gJ@Rupd(BgSAzVU2^QAhSN$MCu8f(XN%h>S?jR zT}W+kW?i_eoB-rTc%XfcljQnTbU?L|Yxm9o?|7X7gwh~ZdtI=!f+NmNnRjK=bj3@5 z|0CD^Csch*U;ktC%bx5YPOV92D*Kj2Bis%{y>-Nl`N!RBe$m)hY2|jlRG0Tm^Z^zI zl+h;37cNL*M)>5d4VMf3cnRA2$`7)?fToeX3(7h^d|gonbp?4<@gDbw!Yof^sWXG- zoykD`st41U=F%VU$8#=|=;9mZQ;B(3q`d`rOc>t{7W6X%;)3H8_!``QJ4W3|su%=$ zrOkW=8Aey`W-$h(Z4`Q`Y%=E@w&vDVh|GT^ft>HK{fFL4EY%`6!v07CrobJ*(93^W zd^rXqWUu@t0Z+FKlQ;8WkTb7C2%<`McIRdpwJXczak1Jd!?3cIOrFlqeo(n4&Z}0P z_V4d04bebJ<>5?uNiS2g7U4JwKk8gSsy}@;Nj}`BF;TtIJgv0QjH?O()Va8 zF;~?#nK+SgfVLclBiqd>MVF}}%0=_9Z%yRgHr@Zuy_&b`y!QU6!INDO@izv9n4X44 zwzu~?kVym=w*V@Vl+SMkjlKF*Aa$O*%dpwiZAwCaA6$@6Acl2)Zjf;9STQ)*g5-_< z-Jlu?ezcZAyTWBC*GSHscE#eFk1!%?>wC@=jT0u*f8*ntdxsCJsbz7;mnf$;3QFSr ziZNr(SSQE&E_QxT6=N8qz8|vP;fmt#kMFxF~w&A85n4M9c?*10+r7LeFK|Z z=0GGE=4;(9F9_$a@AZ2%|CE^&A-~bfnV#(8;wb9L)2=5zaEkfe0i+vYFy5L7_!f~E zVF4L5o@D}?QhPGSpD0KG{rI1U@UH#32~~nkbC+uxy$e#YTyRUuWm%8R{eyhOjV`>3 zY`f+bhG>xUs&$Uqf8v&UCkgaN&f77glT}mXq=M{y9OT21-6tO6vyXUTAe;}2RHx`p z-ZG=oH%vZ)SV2dgaR0@}$>4~0jSdb{!-|&KQ}rsS#sZ`;L!%U5+a~76wcdd18*TT_ zCJ5xJm@bmO&C>GmY0I>Tqti3?z$Ma@G%`B}X?KQ%G|0lT<2pO?mg9N?$f^j3} ztlqEsei@-@aTw7R(0h=^o!`T^_50>zfrCQ+N1%BNpA*}dOI{3`=9tEEi}4<9wdjyl zL#kDLlcE@ow`1mF+3xhyA9;%rS500Tw1V4#Q|Gu3D{bQ8k+=ES`^GS7C^U!$Di57} zBx!pw>G4LzndT1_>vmt3*P#>gyADH`+lklu+31;NY#Xr0EYTmpEO7QCL0g8%Y@P?V zE|(vVYneJ@SN4O4wBY@_5UY1j6`a&`&;XGq8gXeckI^or@7`$F23#MAmA4H3^@YfT zt8}3X8fw2mQKJ-%P2eY9dv(; z4tcm>;j~h&l-?Mpz}g@78=iX{R?wraQ)7L!LySAMe(w%&kZ*4VH|^g^EigXl;EQ>x zjd+j8Q&NuZZn-Q4-{=3)rLVfn&$gGV_TLT%|961sx>VI)^vzHm0TcX#n$JY?uj0+M zXuiFuLW^?|B`uUxcD#L0-qIFP>$8mXX5K#TclN83zE_AIdOY{2N;OJuf__rZ8)j)a zyEH$&(O&PX`rGYipVlrO_ziBKyAE?w&wenn0xU#I1=1K>UdCi&6MI%~Wp&kS?gO!o zL^IecMZ!wJ+u2|mB-E9!={eq)j*XCcC&WG&r!@#tdPFwsIjIT{mT)q9ax$P$m|ITp86NRaW<7i*jDf7b<*<4QBhT6A|e-Gx2r~P(1Br`hi z309Fm;U0vxQ=O9vqdBo?U^rZAsJ}|IT96 zZ6;~BD)huALLaE8bRylC+wFT#&`#zb`R*mN1rS4+;~!40sb%T7{3nMlmLTu}@SMrM zsbnFNO6Al^`DBC4ZR99OuV6x76)6fpk0hWPl-jl_o32gn27u4uqcqIfQ&2jGugM)Y zolMkGTG0*NLrMgper?!V3^Vrj2yP);GJvTLR9qXhmoX=aAH^i-g3@c>|2IsnlNL)n zw#$560$nd0&0@z{#t7m*0j03sy1>QG9oLW^eW>Q ze$1Pyb5kz*=3j$&w8mep#zBCE>>Ovmn5tvB*1?l&O81hxvYSg$XQMK@R#NJ&4e9NkmVuP=@DQZB zTa=JTQ`MBdYCGhJ*%bQEaORb@9BMCQiTWz*h zpM(uf5@?R&03W|6Yqygp#=voM8=FQ%HyhDYW#kp?YDRz^#x>Z&8rSl#RoH;(!;`^! zQ6y{VIc}96NRXthopV;nQs26CmCc$qS*M)30u%c+wg@sSka7s`NSm)cF30I?`c)SKYtGVL`x3!Vnpe|Fz)jEz ztNF*vhcrg0H>RKuggz39Q_2kZElD0C!6sVa>yYAN!rhfdy-chF2PzO}qWkY8P|}A< z>Z!#z%=%>4{=-6GC((wtJ0@Z$2aobyjNw$l{zia}*e2oZ0Pl?T)1!5BgS!znFrtMe zR*A=Gha{WZexd`mmG2Em^h)qaeVP}q`sR}%m?=GF*k&7)l$LLLv*RW_`xknIlXv*_ zL6eK0wOGkuzwV@5-h7oS+@LMR;?p9I4B;mC_c6ZdOs4wSBQlRGIxVfX=6lp1GwLq7 z-fIsME^za6B6sU)!YVK~y^kN1bTS;%-8FD1?P`SG2t4uRCuB!fsau(+%SRVHT&Wjd!k!H^Rz1+FAZ2z^TV5nPpHKcK>Zxz2 zh|~Xp(pq*&9hU{J(n9&1bw&+4>1F&ZA$}8U{AN!YS0bEdEB^c$Ra*O#c@3?h!Sw&!a&68=;Nssk0aNuxbRr z;Q;PCF?7)H?lWI{ck(uxh#8Qep?aM;DeHPEvU4+Z6VsAI26#Z^5!zRqvsP&XdMO!g zOeUURi|pkS|5hq|;5=w)s;shm;652|YU4S|^LBO61hq9(9tdSN^-cJ2`_1>c=W?;Q zWl#Qv`CgVPWYphbC` ze4PgB^8vcm_VG(yUY*uoY6-Fyxv3pLqS1IZmflqNwDM-o;REwnWq;A|>?yhJm^q|s z(m+zxPHl9Y-ZLg}hMM50ik`TFolh4C!-YBu!)haDE*cO!x0$M1(y01R!FT1w_etou zdelMej8gd==2^8>*FVN(eyDMkN+@dsZb_S+UcL;dQxBBx74Oj=e_s@l|E-OhP#?{k zpxFoy0Ch0rFO?1M(uoKzeQllXYQoS;31z2C;I~}Ou9ZX?d-YTvk(1MG>?&@MqTJX} zF}EwA_4&M0k;N=1%KvnW;eqi4@+|HyuT*v>STkOPN!RjY?^8k+VlLZ-{=>)Q9|DRN0(A4A)fe)sI(P?s-wG$EauY&46>@jLi89TLX z+{)%0p_=DMJjBq5W2Uzt(&igY*c;=yd}@Xk%Ce$1HP&qNoa+|+{o*Pw7a6AP;6EF` z_OHdq1mvO^=x0iSsxH~4=naa&f!DkG^1-sMb7!8idr=O-8#BYE%1EYZbUzu7n~fH{ z&_~6g7zYDEHN%s}laRd~|IFdR-^NiOkn7%f+N5{XF5u!sTFluGtyW2H zIC@!)AznBK@7k3AI5<(1US-QwvasRo0+^wgyS(H4>1=951Zdz#!8l%2Q&MClD4WJH zB(ce5H#7ftL*SOQw6>}r)V&57E2m!Hv3u3OBbfci@Z_qnrG4-5d$I8;Ufmh}z@Iyd zS;G&6aL%+b&5N~x_@Vl=IDSo7Ylt9Vi}wuC&4~EuZbweukrHs)SnJhu0<@mb)=v@Q zEAV;ji%eqjyejjI1n4zO1qzgo?CIp~vlu+1lL03yrW;%CIlr@DLM7MgG+VS}NsYk> z8vN{;MS?oc6MZdSwMnQAauR#jt0tPII3fV52n5d-IrH;Z00sELKR9~qJbnI!E5hC{ znm2Dcjwx6W=UseLnJwa zx|QWLb{C-8!H2KfY(e}yjc`aLFYHYQ#!X;`x4d=yZ_4zQTqzF=w4vMW_e`baJC(%4 zH53$R*5PA=-~zrjjXq&)5-ep}4oM27fG*dj-7d9Qo*dHyBvj1GR-3+)8kGoT0WuE_ zsS-zyjR9{vE3q&t+PH_)o?D#(&DF3?JQeMjH`5pQn)uv&Q5od)F@xD$aq@U=Y_H09 zTB<}|NKe=Rz-vC;x*#dBG#=n%m9%#Ri0MC~bwzsf;wC`otlUYyvH zt@GRa??p3JdaTVNf>EQ4SP5Z6ACy?JNs#7Ppua(V=KmJ>QWT0FGs(LD!h(z*w-LNg z!=c9sVboJ*D-*C#s@qhz|CH24cSwx&^6k)E;?@eCv!`?KWUC(=>r%hh`eMP$*a`1y zXO~?NqBCKi*LT!x->_16U0Jd61@tmFLwU53@~N6rrm#a1L~{_}XcoCU`hd0i$+2+Y zKr1Dp-LwvAHKljlBa8O?k3ah9h<}h@BHXl`wS7-c8cb-HowZIh5v*eT;l&A-^q)Lp zAyba~xpVD?#d|-@^qsV$ES{suv~9Q@Z+(iDOa6}*aFnDeMjiKFcWkgl#MjAp7!U2C zh}v7|dNc2__oe?=dUz>}zXII(>`U93gW?1oc^|9ta=s%)xDNnlEJBpBIoLrruVKAq z0J?`AYm%j#?*~FYa1+^4a-}zANj z`3BZljq5lTI^&Nk`}Yd8h_||~6tNlbI%VYHX+KSS#O}D6ArmPxF#xgvvz5CQA~_9# zOP#p*Dv=itOwWB?^=CIG(SQ^;F9;@1rqJ`hX2cmft4Cz4Kr2t5$QjQYL~{_&yiz_0Ya;ED68?I-za;TKI;fo%=6e`-z*>UVH4 zUmVN*Z-9hgC>$y7a0X4Ucf~Y|H(qknT7j4gT`{^3aM{*W9CqhIPsbUWd~cdfA}D;o zf96S)T^za79O?x$T_&E9H=ag?HLYZt4_J?ek(*b_RcQ2U?%>E>eJ$p@s(HafPc-~a zUA*?hOSWe1d_SJZb2^yU-(H+F`z+$wi?~G#RpU|K?8~^4%vi_i*>h{#S~ZJCoT~OTTv=n3IbtZ_Sk|gJ&KC zPNrFc=w008*Y`6h_<~tzC~9^clD(Z+92j;gYkYGN(j312gL5ai0359${_v^IX zflS!;0g`;Mm(QS``-ir`xgBFD%h?AE=3oUOLTrJ8Op#dL8@%y(Vdm~o4t%*y&*wGl zPff@dmkHbsGCCD`kn^`Z8%o)A=Ce*?2S(wIi(9YtgaU$g-;{F!Tc?+u%*M2Lz44)B z<@B;-5`0od7VhaP?_Dc0B7&*I!XH9y&7TJK9EPK<^MH+W;%535HiF$K1n6Ii(|JBA zd>h=LXRJaMp@^cjJ%8HX5<@U@!`cnaeTx9F-?rQ=dWK=~>%CX%#Je=o@iRUJomho} zpGx>kh;q8u*9}JMr@Vunf7YG(4jvkd!!+czm(m;!Tt9*H+nCL%ElF^FCWD=-Aathl zcz6-DP5P`5=g349=togpXeQl9M6=Wrv~sm>B;G^#6@j!MD$47e-0Gh`-_CX-4`GS; z8JKzg>Et(WP|$mWoVZNlBeJExnB`*P4`5eV!Pt?NA+r9r`UN`&?i%YPqZtqqi#f zh}*~spdC4IY}0d-3$|U@@bY2ZElN^Gnm$bdKI@0GvKu)rRb2(ODONbZ2ulc~IQ8ja zyx?vSEF|Qv`lTE!DK5_8W8J}oonN4cNn2ssiH!!L%-igo#OnjY#b`m9fS1oH0dRh( zwL;MZH!ub~%UYPt^Sm%F4I()VI44ev0-=(lX{G0(L4DBV`m|%Ez@-f2Wk2jNM2QKt zuKuo!3O;PBBm$tO31U^vJ%0dTAsn0RC|%`DjgF&?d&C{^D z#?2B^4BJj^E}nP2a_wNXM6pj~3g**1SfDyY`6j$tpeI&H`d(s*iyrVS#D2r$JlDor zSD_W?!g;;@nq`oLpnN+zyrn|quLjeWYlc5_p&Ub$ZeKPr)Lvl^ zhxzj5>r?LE_Uxwt%HR7_$u*CE&_oYas4<(ZxsK!}>Y&jzyw)Bv{YwaoS2+7Kc*O52 zsZ<6kJu0<@49QawjeQ9K$uQaZlB4bMNs z$`G#ub#GRDUt7okJCw#xQy9f&hu}OqGqf;>Ns?CtJPc-=nR4Hj7CUy2KO}S&EPMTZ zT!QfSO5F81aO9w-J)8im5$=SW_RTZjfQ^}v>|w9Ib7ns1-;k5p`kO2!z%hhlNSK?P z((71A&0f*(!AX5E73_D#pr-7wX{tLLO|KB=mNgm~9 zpik)f1?)oe~N;;3B-utySm-m7qw5#HSLCz+J)@< z@865w2?o}KCi%~>@6o?a{zPEHW2dmEbvYLH9j(fDSO#gjQdy)@YMW##^|x=!cd30}Ms`OtA17o)XFo2JW4e55 z$Eeg+i78^7)7>0cxcf1BRjWaaf3f`TbFrV>FFZBBFgY0aD$@Ad=qqtsYup?kO_Nw% zftFiusM6<~g>w`Kn)iDxm;~D*shf5Mtlqk-X-!8ntgsxQv_=uC`e9~LJTFJJd1CFC z5=Pt`^McIL4;Vg@?NHvP%#1h;i!jU$s|jWKAe%XmP{mC9nE?KST+_mPala^KIr5#; zwlet)w92+%>?s<&W)QBFm5dG%;HXqXXlC|3`@mh`K&+ZBj?$i3tuzLPMP}`{)7@AF zCOk8fCl2De?@%eSN5#I47C(Bdm`VUPzSXObTN3itL!uw~eBtjmciLE7W*6yFgsAw} z_fgntgarWnvqr+Mhr0L!(@jpqRJE?CNfm|KeQa99rxyYT*l(=-+yGAyGo zP&c-zO`2R435m4lAl|8X^1FXS<%*}@i#&FRbg}(~2UYrF7`xcCny~?NW8LV5Z(L@i zOXzcFu+Lq4a(H|KYD75iac7{dGewj|~iOsQ7ZR$!fOZvNsf0wU(;S^=mIzL@<<`I;jI zFBA*SW-42`Q&?O$i%G>4XDQ{)HvKy~Ww$ANNi}RF-tL4>UyOFok)3&6WMOD~)^CpB zKQWkgBjZ>bvgczsSzl9(Jq|cDE6II-Fe{59?|~A(Zb1{G$B_*2b%#&07xJ3Q;_;vu z2?nIyWjlO~Oq6*VXugqS7D5>^zRsJE$D2<-!@?{?;Y$r&!YLe^x$FD{+y-bSq1u%n z+B_BmWCLn3?3TwV3~ZN)_tzVp?kZ`XiJI*ZdZ(BD?z>H!R2V`Npd0KJ=+=@bv=;TX z>-;KK=>E^5$lrr*&#cqC0XD!kG2`&pnQmPQlGeh=nCtac!*Uu?6W#E&VYgP9E*gN@nvKmJhS8#9k#Vq`0_UY1;Vo zs864xmL^qwigsLPAUTQA*8nXyQRzz0k-j^>bdy|*S=m#)IDYWXiEg5Tzsw!Ba^-Ba zEJKB-27cCLVKdcqv&Xj~4LBbVH)cgzZIWvn6EFOd%0`RmMcpHELxRghg@0nnMj}CO zVCtfE>HZ#}gvzq^d055O$9o|Auc~XF$levTQccWiPUA_;eSksKN+;U^Dpb9bznx6muSLoP_Xj^TU>JN9dqPv)0*_=FZx_dTjs z9T}}tD<4C9&dl25$5N>9jJJ3?yT^d1Fj0_C?UK0l=J4&+m=U}0q0%!v_S?~xP^h4w zsn>q^(feb0OzLjpYqOo4n;tpVKrMeVpNYhYtUfA5mp&&=y@fQloO{MjN(us9RDC6S z0p7>M;{6qU^0LIJ2)#pkz!Vb80j>O)ZdgN$(PDe{x`E@_|YR<~?IhGVqHe;o)$oi<`!pZ2BRDexz;lZji_U zahD%3Bpd;}UVJewcXFO&5{nYcsM-q6ezaaZl!N|WeHSv3T|p>qEl=0CPS-t@@?sh^ z)JD1bv;o79OCjB^PQ)@g1HeK0HQf?_mLypNliSZZ^FEu;X7tKiib{`&HZ>8-p>kNA&DX~o{ao)$s(5Fa>1bokn&+3migffu7 zMe+ZcPHumCO@N12TPRUX*BuB+18$fkRAcRVQ+X1+E9N0mE;RmLoP3g7hAcy#r$|BO zVJ{yynvhvX(>YM>5z}w%H=D3u#ck`%*feD6<0@o?r4*QstH;q-rpq!N2yvJ7{MpF4 zZJXbcmlt53Rk->OyN$5y11=klx{j`RCI!N)U$#r9^la^Tk0+kHBud^Ha({Nqd6J4QFFmy|6S85=RS{@xe@_{x=7e_Dv*LAn4%#j`h8rsWc7@& zGzC5I8s0#mD{-y&e<*v)t~i>oT{H>q?(Po3gS)#A?ry;yfkSRUA_U{wDYR zQU;%2-lU2hqxZRA)VF>xDztypC)8f9^=n2?xF2sq=GkE!D1F4TcIqF%Ht`hk;Z1q; zx{j;!3+fks94}uOhJpZLu&S z0$&+&D5w&{_MUs&KNu`q5NIP<&SQ;?BC-2Z71)&4-xp`<2b7taB4bL#wYnMHQc;H~ zrP1T=!~ozsuWJP!Y`N0!EmJ?d_I!PxPPGxw+pR3RCaoXAVi@#DBYVRi|bxd$3x^&v?eR|!o0RTuSz%77jBiMBXRJn<} zX2j=94QN0E!)3x=50 zqJOL#+%fqLPg(bJl`x7mdBE9uo%#7YA6T`09QXP39~Qa&-iZ&*fx-_{T!KKhb56*n z4Y5CjBKRgh*mK?eU%1!_+~V!b4A0qg&gwUAJsi4Hcx{}ZDOas^Qy5vKQ=U5TE#8u@ zI8~icXVi3y|JMu}hK2Awh1?Xml1C76+qCQhD7pVjF^08VAt=xPx_$HCQJv1=>eT;~P+Nu^h|b0P!CD5;bk zdFhHIclD|TLS0vX@@!!={Bc3o9APJV&1O*|64D`d(Q=t*Ap!yxsDaknRJL@eWX*bu zZmvlMR3SU_mmX$kBv1!DX**#^V?yX0`GGC_xDHK5} zgXd0=9orX7Jx)g&NQ>hx^p9@QlW-7IzDkdo3`La|@!vj_p&1+q-x*gt$0ZXp7A-ArgOmo4Net%7od>*-ylvxh> zv5{a}wr(FKgtS3K>V>Ua)(a@p3by)S*l_u&#%azLvN74z|pJ@TJrjXqCK z-Bf$)TsE>KCkVH{ymtQT_A!K#_CRI2sEz z(@8<;h1ormF~ie>ks!SqAEN#H)&J-{O02?OL)Wm4>&gOZNTe^eS`W&l4rD ztw)xR;m>^IT!8>^9$f1M|6eOzG1#ygh#=EChxEx8H`g&2FySEote@wSRXZx$KmtYJ zx=JX*-z{$6R9V+;x1Z^?W>(IspMOsUS?X!n=S}SNHB!6Q&FKv;#v9}wVa?(hXL=~r zV=>gUxJjH+vhhmd+*t3GZ!IjCbxmx6TL^v9!tQc_t)nXCl&jG^&zza}>AX`VRkqo> znKiOGy{vJE;IrQs+by#F?jzo~W5egTddO5iev0qLe;F32SKDBGKlHN}$vg&z+d8v~ zGG?+R;7r%p3Dsz|N>K}|aIuvs^jQ7>htB`MoBL%KCinqbEWD22&y*9mibF6MNp=6+ z2=W%RUt)*<7@~isSJ!uef|6ng1n}T8WoF?P5z%02LW~sz;}=uJ;5d@o!UN;(6LgAh zJ(S&ftw(GleN;+QYcmh`o%Lwf)apmRmT`x$bL8rkKcMA0r_vvGHtz|)!bPoVN8Mt7 zm_B3BoI07{YEFo6H*C_7{t?wk9l`LurX)~yQ>MQ0!DPaBvO{u2p0dr>4@)oV4NMGj zFFO8}to#K&M5lAqrTgStDr^CN@~SOw{cZd<7&LzI^%hMMhji{h~U3;HOtdvcIO&&Tl!O z#PG3>b3t=TRK=&Uw;=1mqnUia)~p(wSN1oRt8d?Q!SXtYU%dG{ zLN;3OJ7S#_Bp~>hs+-q~xvn;BtvB^!x^}CR!JGmTrG!4jv<8obOy3ad#YY6?g#B!6 zP2rA9Y6UEzHI*Vl$Ndgm%B~e4bMP~au>4N=5FZ}T)|x{c>Ew#46GuP*S-Y4)Yxd#t zRRGGg|Cwjy-gjoU*9U~3wiZ_F!JJ>Jj3F?KHworLUZbn$)T{o990ty>$TGemy9<;c z+H0LK@@lP6yVE`7kIg8yb(84tJ?V++Zi>3Hy^v0<={QMY3%mb4W*u=-$@rPSwkvuw zZa(KK3JF0}ja2oyY=Y_s>0-&B-YM@Mu5{EP9Z`!k0LZ zs#o&AfbE|{iMT`c?nF94qrAH&{nyNCwr~{BNe#Ny?{D9;avt}k?%1tKNWY+?onPL1 zHqh)%%#(e#FznE%`5w)lcvcvDxKrN{9NB6y+LnsW{rcDlO|1nO%D#5C8AZ9%!LMTl zZ94i7b_f$G2N?8@rd|krqI~Awvj05_j^0#V|I?k~&2SL$5_vBg?dXLYCp;r4jv68| z?NZ-9gkv?s8wtst=$Ly|E}jPpgi)ot?kX> zIXk4&Vw3ejxm)ZyP+|)L5`_H%e;1yDT4i?eAUWO-NO$Ef5YBN~ZI6z8_3@WKm8?gO zP8S(c-J&^bw7Is|3DXvJ2et3JR2#$Gbd_jFX#(+iJ@Zu$6CsO1u7&A{C&fE4lKhIu z;Z>G3ngACwSPU&a0v#KNWaveyxoIpL^eQk4GSq`M@o_CiZQ13YSB{({K>dYTcPAWQ z`2f+_j>5;j5^IzbuP6`*mSfDgbyx^PH(>)=tN*RH2Al;k}@ z66f+=T>uU3JaB0BpW2;h!N}cLl-HVi*n5u6 zfaJ*gzwwW5?lfJRy!|f8$iwyicWV?#2=Bg(K3IIsWDlD4GZNxU8vM-uPa!8>0dMpe z$BKE^{tH*}r-FBw>bXy!G!@wKauB7y%q1WqY-cbeK)1{NQSg&rZ z7cwhp%LaE|J{~Z1u65acIH~p+zQ>it2-l)grl;pGvo;)AOdG6e|NW9v^yT3j$EI}$ z3bABQOpQ7BZT^aun}WJVhX*DVmO0e##;M!ahVU1Zk6jjysosyzt4w>#xQ(6di(E+T zASb;XRygY`w;>Ej}ef0Ocjz!Kp?a^JsiTbk)!Zq6e5r05xR_$ zbn?lr2TAJLKAcjU5MYn;ag~Q*CH5>m*5{0P^Wai=QENpPAaSU#YQIq)cD4ZXmnd^# zW%qG=9=CSUWApO-?WiSYX`Ix|HE*+Fb|k?U<+9DppnKpcgSxtRhLaz-Ij*yMac+59 zdwB(co%wH7W#iEoeE@MO_bG#(CpVSZ?@zO-x_28nPk4b3{1fCkgC{{2M{v!ToE~#J z@zVd3Q}6%5-hGcsP;)-Mm?%YB&idi^-i}{td~!CYvcr(OxYN&MmpxcVF%fZPu;;nu zIfC!y*(E;au^SZ$&G}45C*1H6ifTMLJjrTFVglylPF4HcnfzNufgJ0L6Qo#_n(`;@ z+7S2S*~~LQWpqPd0Sb+eGG99(4GDi4?y!%-R7X<2@p6s$Y*D#o2MF7HW^YAvP_eAi zPK(X7&6r|F@N2Wcy^Zf;(Z}6NpKM+I5VaGf0o}MLqXxy~fX)s5W1kKT&7MfyuTY6F z=mT~}C$e5|Uq09*K=UxV&X?8KWRp2lnFA)?V0Y`cotE|RnBma+55z?jkoL+j%?gMf zPIRBQVjcK-xcgn_kp~n_T&VUf5doSbAeXNty`|K-@(Inj9;%qC9k~*P?+F?QBcS)t z%p>i*!|Kx{quNxwwymwf|$gC(OQhVFM|`Np%G)cl3Z4w#r7DQ5lB?Y{{B;g=7FZs#a8frm~vcZ!vSh zc)juHzV!G$EQFWuKK%L-W&-3=anb((KqDRbBB7_vVJRQ6A?t0Rc`vNTEpl4XS}=;= z^7HW>Tn5eHL*8Mc>#SrvMfb`Q*drep&FK%K4jNa^M0OF60Ha`Z9D@e2o=HVn}nL z&dmiaZ^naRR-RkAs3F|e9fF(|QNMnB)$CcpWtIX0Y~HQPl~k~IUy?jom@QNQbA()^ zym%lbawVdx;)*BDbE0|v$$Jm)8Dl}e{%gY|^4jEv<^&TY*A97~S=o^@)lw~G6X8>x z;KCu2S06qR+9rgW*1!;ZTQMHEW6b!1`0Vf4t`$2s-Fd!Kz|qN26h1sBGWpOO7w-{Q zvbpHwH}nQdeeZJ+#t@N?-#9L*X^_kFvaxL8{XzI440?_&>!ovsJy)(`JvTKzr?@Ry zV19ROv9GNx-%HHOD*9^_jx_fuH=#?RBn0zOfBK}C&p5`5oQg|Mz?&{Px%YcY7QVZ{ku$&74EE}4oog#-b7}zWFPvQCpNVUvexpO0Xu*(6k6dw> zd*?Bjv(Q}E(!cXD!#X>A6PrKcra~I~DcWfxfzuzHH3H(LSoSfQG*@!?UE3LNWyK|| zy6$Abbg|3R&?|qn868U7V~XU!C^dL3RX(!L81nRe&&ywFB-VYHJKDyO3qr(vwj_sM zKxRddj`^FscEnD`i-fX|2T@TGMz2-*QNe2+{w#f$tQ;VP4&!V8iHxDNDLocRG4DfQz@TZr zI#Tapw636|YYkr zOXWl$J39{T9h}}iKKFR|rzZQEs?#jzO$TjBG^1VSt#@}D;lL%l)H(S0xKcaBaw#!g z=c4#B`UVKs5AjOm`aC4kY4tvzgLes65H&_1GRm8d>7vPb6u|V77F&?en?-utfsUH7 ze_I)SjMnL+f$rp&1+u;awObE^x?>JXE7GjRjyc77eS%l7wN1sT4G1xqZNR@TFn-l> zr@QE}>yh~Kp!@Tq7W_e$Lhov^B$rX^>F|rt6vPwWq_)i`+f3k}<$-S0?UHlbw#+?P zV6BObaxm>y7l6Vh{-uMgR%|<|T^TOamVGtwegQ zSuJ^|Q**a;m4%A=PrH=<$`^Z}V65CrY%BZguW^IBR1YDu?a>2C)XttWH3sKBIrGVC zDV(@RM!Kv&X3UeQm1iz4K8k(^fct1H2RVW(I%f9d!Cy~%IP!{9flL+IC!;FTCs zi&If}={{o3CMU-hFb1|H-+M=9rnav~P3#giTo$%~-<2=*A_s759bFw$_(dPGfzsA! zyWje!-@|DbbHEh}RCUn;>!}3tr7e}AZl zrU$1{`kP_mcY@ID&0!HXYrh=H1rbYRf}npmwke6G|MhY^8hSgXRSeq9i4sWq#-C~u*bVF-DgxDo$Bk*t2JgpvZsHWTpUXOS!UuO=<7;=^j-`ixfl#ET=eq4U zB4NqEIr64?QxIWZEx)8^H>+umQ5lU`O>aW95UB5d0e01tZnR+2$7!NwkJqVwKBDqB zJ#H2k+lb*5ju!JsR%dpY)@6fj$Z$s6IYu5G%~7<%$DQ?GXpIGdWcMH2M@<|H%uDC` zE$CA}fO`X+Rom`Foea0E!+xU~AYnYwCap$}{|TbGFsqId>j%}QZ9`2- zj#PtVqH99sh=S*l(KelGRIA=J{Wdz#8mp1LC5}ZyZr%L5QaRxL^?X5nDL*NS!YPi9 z?2k1o(1&Jky^a6YXpJOz_vOXKtqJ^_7QmY%ia#u5K=E5O_TyY}xmDHRR(W^@oU*dmyU{m6$`O*FgYFc&pnBT5jGpjCmWgFQ?$z&z8X?5ex1*!t{6%o z_;bI-x{`*G#tQ=0;ur+P=Av(c9269?z=4XQI(q&|Z!LQFlLeDnRe#uN7aPH$G{>#p_)dbnmY{WHSYa2AUJqfg znQwt~c5CXnJqd0zwNN0`*i=hA`Qaa265!n1^ zVE5J}57qH3*M(0+RBf&Iep0cGc&`0M$Td0#X7s2{;&!2O&k9brG3_~gb)vebx?k_0 zESzXV4eZ&^61NSetl{_zRMoeQ$olJWGB^-pm!l$6bY}0QpLVKR?-MCKJ)9|t&!V?7 zeHcuer#pOq0#L0GAu_UOS6&IKuOv7oHAWfO49pl`LD_Ws{c#ts|987HKxt4kK)-4@ zG<#?{;)753T5p~4IdZR~XxvlOUfG}niUU`?-F4TY!#z-uxkfjQ21hk-F3*FqT2)nB zAIc%oF0=xrtcTRFQVXfGHal+pK1AVj;a=Z-6nM9Nm*u6i+cJK!5$ch}v3_K}1+??v zF5MF*TFQ&k&-<}Qehf;ZUqA~Q%IKW><8d`?4m?sB52c@_T9e)uTUuVeRLDKU(6|p} z&H9<(vDV{3q0vi@c9uM8S*7GDFaR3yX>|l6Tm2brM}Bu95fKj_?Vp1&7sElLoo;{p zGzFMp7%FMdRbo6C*!;J=^XhUt8BDi7n8Vlb>WI1ea?kr( z%LfIBLAm^v0=Efmbv{4SRt%5Wb~KO9TF#9=Q)h{RB*)ktv*@jBXCI0?>WOV`vijdo z9*gy=<@%I&-*t05t|K{Z)7>Kj>UY^b|3Yj#>P?DYkDzQH)CC){z`sh5g-;nX-TAbM zj8YVKAN|OS^bt~6;o5O~Zn!x(H6<7`IM@r%lX^UhMBr&FoL&}LF|HMVkT;)+*1Kze zd*v>5>(iQHX*<{NWPUOJ+wfM+{a=IotkCCwZl_z&e=$Wqy8{mGAz44@c1Bi6Hf2l@ zi4@vc1U7yKcs_?b4%GJU-s_(j0_4tEY`rlNkQ(nCTQq zEzNvX*{*g`#$mo-9QU`WA!zdr2kpG>G?26BtaTC~ymV@lyn3)&5Lqnd$|M<5JoE@6SSb=oK%-fj-%Mkv^&eAwUj7^JzKuk?%BN7XA<1`w@x(U#^EJp2u)sPMCN^ zzZ@X(8zGfJ!)W-5Hp~!Ghf3h?f~KD5?nrH({tDU>nG)d=MMo>`^P2j#k663L2hs0{ zYdJGI(t4l>yC)XiQe@wparNKsVysjHP8^I@|6pWZw9SXmv2+5J8$gEO}s8&pm8*S>YMN65Z zFXka43L|Bm<~t3_wqi$_%o(FD;<>NR7VxtiKFE7nt{mSG;S zqXR1C^mP#;LMSByp?)PUn?#XRxA5X}8Z}#2kKX~)4OFBk6!k>J>aBKGKXBu5uL$D< zxNK2#j0(s#s|@R?)(pFzTcATZW2h$bg`$h&G#HcyfB4O4GKTvkl`)o8FtaFlf8 zmWGJI9`!BD&shCjU;L87xUwNF}71rQxOjtpqhNRr?mq*h3|`zsJ+)4+`| z6<07+l)=N&et30?mc8r=y;77T)YC&Klu0Qe?6m^Nw&8~Xp^(puumTOji{Q}FFV)`% z^sh(Pcpk?C=Uk~VT2Spnd4uZ2bK!%Z_0^bVL~k8UDZYc%|FT`v@f$SKPGCRVbN1Pj zI~;jVqFjllp6K4+Ud7p&q#N-U zH>zW_tYw{r{uPf<<_5TN>@u3;!u(5IbTKQh6+}d93=YJT081PkbnFfdtFMzQv4&k> z+x&IN#y`&~KW|FPhU-;b#oU}+IijkQ4YYkc%EsKtg_4*~E_fQ(&wl_QKWSw(KbC!$ zP`-$U3e$Cd_pce~AkF-iIReok?{nytlRYVt8v#*rd>Mh*(5ogKWlhjL8I99`Q}l>Q z2JhbvD~5tbC=5fWiKJ+^m>M`%{}Fc`V+Lpyq-w&Yx>%E87CjW66FwJfHQQo|i|4b! z|Lj#G)3!ILpF>GWi?lJBny4X2_B@z(AQ!w^H%1OnExkeeXr6yT-2o4y7`X213lelb zIi7%^^8R^8cZ27$qpWM+ZUb@t<%Ax_>4@xCaR=`fvh2nHyH2{EO{iJ1ESv0k3g2R< zWBC#*)%aEF8FyHKc;{%>mn$XCFIc}`J$zDia%Vm93saP(N=2ir^}2FnBid4L7*-1- zDI09twx&{X64Rz6Q`dxV?ks$v<3M%LST9Y{-4M!@=CMBh)S&dhQZFR4=rXD^@qsCu z0)<$qCV+cxm1LkhO=wrPFBZ%?bRYN1}s6 zglR|kfK!zgPLKQp@^03YMe^iv6&`b#Z*%IMJIPpD>9^Dn;+EDy$Y2bzIfLo!=Nq47 z-*TDQ#fYY5vSEadOmxv*Z(GW10&O{gmp2R~pUZv-@De@0(hFe{>z?LnjGSb&(KAp zj*TpSl>Mil=~)WmQ2|1hpGzTOBw3@eM6u7$dDwZej0S>W=3xE`SHtaizg~A^M%f($ z8CmI>c=$v=)>q_zH=0-Gzcj|*Y`#hPjh_ioGr_+m`njcar_umIuS;{;T*b5n#k!M5 zGdnM@dNxjXLjr!7lbdoMeDtjU)CJTA>timD-k4YWoE4P9S8j}@yM6-E(9k$X-`>~Y zKt=sm^6XMtZiKj<^aDSvmeM;zi zDVZ5qoW19!n(f%hy~G|{94x&XDsqp#_Y+4!H05nXRTHGmaU#(ku0#XLGi{%k~S;-J65XJjmd1P{vCAR=@;q^8O$EP zU82c(&Y9WIyUR~7#qqwD$IfJ}wJvu&Y|8YSRo(QM5Kksh-h4zvr4q3pnb?9#{#srI zsx=f^B88Y&`Cq9cI17?}F&F5aaOZWRC?~$<|W2y)~4@IvW+0~OU zX(;c@q#`_i)FeB=W(77JT|dU{v@v9m0NziF+PsKe33RlC3lfmr{zn^oh+WU{6o_X+ zgDrdvP`QoY692cT;IVR9GohCHf6D(eJ5(}^U2%P|3fA{dhx>`5o$|!s=hC*8ZmVrT zWrHg^wq6w{XfzQsk`f-2D_SSeqv*vx$;fSn2He3DK(Zo65(#ua+(UwyI}%BU^NSyn zoOkotfb~o=$Gp#zfEG-oM1sJHjbdqsow@jBPTJ> z7XWbXqX&9b#q+Z?SG7)~oHw+@{3!I4(5MtDa1bFMe5B^@Lq_;<2hom$eN>lS^KH^@ zj?1Pwd7tgeKR9uk)65^nn1D!z12{?~oN%Of0|MKbb*Vr1l9)}+eX^~#*Sa_XHgR84 z=$Zvv6voyN64Q9g5RXQ0EOGt|kMfrgX$P$?`8Y<`_dorhx*gx*BVf z#@;D}p^Iz8F<1vwO@Aw*4^lsqozH|JBJeYkp=ceQo(uGJt4H&NT(6(3m>?0`fepP5OaMVt7h%hQ#3YF3c$J?mi+|t#8M3 zFc~wbIPCZ`J{ZS21^diq|CGf)OsvzrT0mPb0av}@`h8a@701r)?W8t<0*X|t0l?cRYbc{f02_3xThIcc_hNDDhU{GwdF_qNdLqw!FK2dVk{w|gq};OFe> zfxnObXmiaLq8n}UH40rR3%V#5&Vs4g*!yp5aIIOhxwZ2D(1?f|Le(1wu@y|~?M^A} ziRF{gY3SK!y&8GMrr<_A4ei7Hjd!P-+n2ntfZlGHBRqyKLVlN)dWxdAU!H5(_AIu| zh98XbaVZU%iC+gBuCU2jPgL^|5=Fj47iKHY;O%|?=46c;XGw-u0x_?&;f3S3JA-xC zOzJ~X&}7u5=gYQ2LY!(DFL`y3B$(4UR6Fug{U_O{ry*_JdldeiG)Yci~L$9Z*2&;M~bc@#jDuq zK=q7?AFV9SX>Wyqc^p`{!YPV{`#YCSl%0&39aRnD%O4$D|BQJ&7Y7KNII^YlGsTkV z5YdJQKREklwJ5dvzjmhU8bqqu(de-~LElR)EvZp5KD2^?bqTei-Rt>hz7gPjgpTal zb|jY2n}6U>sjii{v8@e-b?E0z7 z+gE%Sojg9d-#f5dJI;z8pcekIN6?v_f(v2ovbN%fJok{3|AYV5@D z<)3Zxyk}fQS52^BI_N9i|&{X|e9{bEWZ$O=P? z0)qW8^yijV7Axxg@hGJ{y{$~c&h}ta(JO=~*E*IgLG+RfZ>mjQOf*U14k_(%m%eT;!~#1<|M zSSixojr`}*z3QVjkz#M0e`wOZ5;mC5MbD42!kT+^Bz$Vt%)3|zQ$!Kl`gLvAZm12= zx=%TBn^m)e6e!S4|9FmJ9^}rN>rAkb;N`*9neSi!BiddkvZ}VY4;pDiJdzv(d*yp# z3v+a&6_ryUaxdI59g5I@0kO3`GtU|D)+Q89uvR}hW0Z%=iteB3s%K`cq;h{?ve_+< zZH9@o$Ud(BtWNL|;oNCrh@|+VH^MW{67>4ums(%&cdZ=#JB!kCgV{X&<|OxPJ6$`SpXFR7w{K|0 zrJQNkqut8g%U}u0xcu`W(ABWA;ri%dFT#Z7n`a)G&-Ys2%U3Xy_s{SXyu=>N*Z6m? ze0zTW`w&`)aO?15K6WSj2i%7NX+>LhssWd2L}%aj=Wi)N3|?1_mZRVYXR_Yj2w(^g zpEfT=nwd&p4>>=4sbA48U5KSFFpN|rDK>g9NA9Ie5ny?-R^7!t|4 z@-1v%!o_@m)qh|L<0a(i-DBsUKM(Q))gRGd1B48;1CLwgmHEaUr|#UGuB+LNf8C+u z_pga8w}Mi=r7w6RF*=7I?o60kb`%AS(irzi6jIOM=>abc1c7Z5_*;Kf0YP^qj6Ad$Kj&g{XF_OMhiQRgBFg&~DEz zpEvA3x8#JN9M8Kkmz>zkoTd6CdGG?y;n~zJCmJn9l^Rm$W^+&YrAJev@8^Z1eE0r` z*1h+ylss6Vg}r2(;dPA@Cd_O?#A=)=>-jq#YaM!1tbg)dHgG7mjZ@dUAewdmxSN`> zq#vx+?Pq>0uZ^ChC`d!9_1FXz_%wOLg>`U@#9`<=5yH;9Pnssz+h|pNKj8(Lb7&R* z{9pO(tqdq+W*ZBrE)Y(SOpE#pU<<*WFIPfm&Cv_X~!xhH9qebY%<4k8gkg zc@R!$n)=Fp9v8L^-tmb+t5ib8%ZZZXjA>cXSV71_d{0d>ehqPBomjk0FC=A_@?^#C zc_A$B=Aw2HUy9J6p=A;z%MZ-YgY+Nb#zlB~HKC&XX8jmP+^{^?-|z5;*+e7{AJ*HL zX({hHvh`&>53xjk&ax-xc4^t1<^TgEM*`ckPvZ9gHVftO3mvj0akTDoAOfy@ls$^)>KVCm%idxBTTmba-B`W5lUD5Nz z(iSt|WPYM|Lg1W87MEsh0kXP^L^Z&w_o0I&iKOc>n3jZx8FM${5`^RUmG657EIW39 zCfoc808pwvpg6{0rM4*0k_~xpNm`sZw@}Lt!Ewh7z-5s6^8FWSxoJJ5JrUy!w-e7~ z_u{qkU>|${hteZ{>btwpop_OHI>v9=Od zsZEOB;LIhcJj|S ziY|jDLS$v#zB1Tk!=8msg&$e6w|{l<{Lwr58~x=`Z+-sfkHpj4b8|SI$mAo}a3)n8 z(XA7Xc|(?eGAE1z=J}Wz!sTlD6Vxpn>RZJG(mby%EsL(|T0}A830rnQdNJbLLh>8o z4{HqlCxGRSpTC%NYoj#4!}G~sE+HvKQE82Q0jR zv>*6OB4w6F07y55C^=v(^RkQO0<)%SD{h|9>)C%X3vyY+a)!JZ4dmdS`0PkU*_i~$ z;|@sMKzTzkbWKr1y=sv&Tq)~ljj`l!R`4{80=RW z{f3diAx~;6_&ImM>&HsQTcBJxm;rhIcrWFZ9FgGi=FefuF{CmjQE|zvivd3zxpsIH zsvA?Ru~_lk7SN+h8_Ck|nnYZ2nzGJc%B8jjWIW@UmKrg|j1ObY1m|hlBzRG&RYG8h*k4wDEqq`3fe)jEmlre!z2&bM*>Z8?})+i&C za78XQo=SGtG0mUCBb(g<28QnaAEPGLk&S<9?Z~8`N#`h@xQ~=Y*d*I9FnFKWG>-T=>?D*OI ziJy@tY`4+yr=kY#cwed$qGW8Mzu>>&hMs9af6xo}^;XWN!gc40# z|0%07hu&9y$J1hEO}pMKjfuZj?hDF?z9@6VTGaWlcnJ!}FPd&;73x@~OIC08MUTqe z0IE~oRW+Dg)x*YX1?q`Sum7bX*nR)+(v3t`JqvNVJIwY+tkm#MVZBx?(9OFBe~1qb!x$Hkr+~o+pT?NvdZvobUHn)$$Fpo%!?phVmA#|9fA8oq%vKjDJ;> z=j^rJPGPP1*kh;SrCO|qVi<|*H#{?biY8v(oS{hSa!ugqf=?3AUkr*9d`GsInK2uXT`9}+bRH705w;)S_O+^Lz%2j|_m4A5 zPup~}pnQo-{Ug6E9KP_kE*1lu^zq*q>^!@kyvx((C^nNn!aN`yhF+`nAE5$%_hk8W zSJeA)2LG*$XiGj6hu z0U1%zQ zr3712&xgocoJke?PC585>1Ym(-G1OoI9a(vfIdl0#rLZ_^qtZ1Q(LylOE-pwnBr;X z9P|k}=yb@HK2(h~clmxa!DClOQGaZ6Yoa>on%GJvlh_DXBYq>MhN}!Ikt9E zP8KD(0ZyQ))4K3(F7^bCY9kPCj2LqggbeJw=mme3X4KFZ_N>^w^C^_WdMC~t%a3J1 zLVyq5B-K2?8mS=-ZZ>koFFZK~$#$0bwnV#Pp6q0&Vnf-Tu??ft+4&!!!I zVhcET9;QapHdIqM2L2y-0VqtrnxaJ9(GbUn2mepVPR=Q#1@TP+sd#>*O694@Zu_Csw2O-{VD5y zO2utVh{f;@yHRSYE6*Z5u2>%GZ9eeAQ$qO{o_D_Va+LokFaTuSL~S9TbN0v2B$)cj;YFGqUB^0g0~Kn zk<{Qpv@#v5&zo%22WS(?@GgV`@r{;bw1s6TS9rLt1o@p_ry*k?nIQQJh z>E9)qp6*}%u-@a)FC~d1#hVf=L?M&}&6KG<>Z3}~ev}Q3YFK~?rI$gSD`y7v7F9He zC~H14BmYEJ>*igybvxg8g;F({iY8WTp`?@C5N$axLp>cEL&>*=ZwJk++`sTKFiV>v zVosx36N=HlK{n^saa7qn#T^xh2&?)$ow=9;*j*g0X>K$eCo0G*oz~TiEpq`on9@M1xqNHWYJ7ve`Xb8-Sh0Pg0=PvGXaWiOWsA!Zj(ShNjvPioYHuIzl z8f|!q9Zm0)0G`Bv8O@u-XCxmxu5%u?IV!W7bD<0Yd3{6Z;jrd}0&vnm|6Nv8n!LI* zOFE+qZhS(44o$8Pa)aoOKYCQ+5lgMDXLpZ zj(lk#F;tG^$gq~mWW8|oKD~j-k#)aYnna7p2KHOWRY9L$ z^y3CUQ@AO5lkfHb9^&a$RX1sF!K9a5ZvY?J`eI5aM0SA9pM5y`nfRD8< zUhh!>qpxwLE(TG)ms=j-e8IP;jIie`Q)+|i&?k@jzugIjZ_@!_R)6O`49;lh^W#7N zYq-#Jd6)otMQUlmfsnp%rsCh<5Bdc}-bL5Ez!ep{fV)Pay{1`!Ask(m94ZLp$*2@Y za5N@?sQP(9WMs_{)t{xTbk6xDtmiRi(Jsqd7yu>`<6p>Nf79$Fw48CC6mD#YINHHDSMRrLq+;OX~FJ6a70B!=hs$uCv zmuXkbCSgdeA00V$m^H>iIq-CMv7>yK-$$s}X`KRJL1}A!v2Z)DQHg9$$z#N1KS*X?;S-U6h?%J_2tPcBLJsfH9d*DU_ur*rhjrH^mBDGFYA;UA6 z5LL;9;l9q#TMWW-;4e?vXnr#uNH_cD(P{YpNc0x}z7?rKt;asxH38XvG<(0rUSz{W z+V#{ZvLp7iPd9OBrwAq;0r-9Tr7gw=x|oGCEv{O7koR~U$zGG)aP*Laa{?`O(b$>` zF0hYyhYL%=|4kOL!shnN-N|>4^*?)0evP%$mR99KdCJr#Jl53)13;z&Eryix*xf5* zh?g)y6mz0Q@hTBJj5)tBQQ`7`l^b`xF_1dde&vi7n=Q;UYog|q*ahdZZz*{VZj-hq zBG@r#!6M1El2vADIClD67|!GO??ib*(KtGB?e0(a6Dfr=03d}SO6dC48C04CjkRIb zPzQhhj=b4!|64GRDcLYr+QoUcJ;0xEV{M0qypWwN0WqY59o4q`r=oVP@d3jSVg2qP z(I8s5*UMeT_|}2Mb@0k+rnTxTuTTb@wkTr(iJ+-%fg4WiY%qk9s}6ICJ=|7l!oamz zy(d42HmB&`2WPf5X0)%w7(EKtv|IeaLrL-~RpFQ&XUUzw`;tZo9MJ3YcxjC*=e*#0 zmtr>pc1(v-%%GGRbn@l?bpl0vLerTcO`st5r&!Po1(8C@ovh?2f0^5{CBuy!A$)Y* zmmy{-;EaBF;#Ou)JF*)-1YV~TrVaw671+HTI?)!!GxK_TS&|#_inSY|zZzfvwabdGv! z$d($A^9j*yM-9v>LOZgg<$wVQ?eWqY{9lw^V_RkI+n**)wl&$dZQHiFGbY=fY-_To z$#zY4J2$y@diMQ%ga51bb{*HT)^*~i$roDpHFz{Idmktw1A-)(*p<5yAO@FdG;>Nkh0bvhPc_ zey~l74+fn@N&tFFd#)Rr*z#DeV@4YCw1zZlP#UUpk@KW?qaL&WTBsb=<^IJ*)^+m3 z%JxT*e`d#53j^vSZq$G(^$P_7>j=g{z0?r9UpoIf1lIbQB(WRL2Sdbj6luiLX0l=A zD7lPpBvnTlqH`KR zV5f~>hu>fh5Hr(ZW-k8Kx4A9wbbh3fYyqnbFn!CP8T5Q_Fem;ZlH*Biu+$Ja z@`lT~VMZ=ccvx-DclEMU$3rOo;T+$hqNu`>nD{mebbAyXc1p^Bl)u6L?7+7;8_I{r zb@L%je}o_fFLT|6f+t|kXg(m}QIm}-unv*9>gCC6JXwbNXPwARQQDBZBrkw8v$)^B z&7wEbC*bOJa9o_q%bW0iv3qxmzsz8?&R%z%xyQxr{XieVRf1=UzRfy6-W$g!Tck6Hb$!f^+@m z?;L31T>nsxfSxL_*-MwUm-d?(S0B+huF#=i5y7=TIO!Za=uR8F>|O%hxHFya$9vPB zSWN5dqhO(x4WIb1jZKHyee5EqZV7*cMN2gFU)k>Pll&7}>xoA=P*}K8d&Ipqyj$w? z9O%!>yA^nypjU|R{d;h8p)oRVzSi91clZ#WYOb_6iD9H{-0zus_eHLt=p)PrV0Crt zfl(3*#_@C2nud)273&ZWM!Ph`$VN18gE7Hs-dgs332Rwn}Bld0Pz_%#ineqF( zGq?qM4CMy5AG=Yn1E(IwgA8H63z-yx&o;RnBhup7boxLT1d;tMYtVrCZ37$v6@PV$E z;~sk#pC{UiT*8-Ljh=RSR{!t*UT4JcG`b%ePbhfY;u#w@^NDSx4z^F}ysMhKU*<~t z)!Pw5Y8>>>3@V&(iv9GyYYl5gZ$f$@VyQfn#_HdN?wp}Cs{!rM;U0RRW2ig>feS|dD$4q`1KHf67FcABFnb4)r@vgL0 zQC5Gh*HLS4juUEw6SIJH{@ZeM+d__E6`fvvMagg(&%qnF(s8^_+Xs`=XQ~&VItEY~ zei|BRM4=a>wQJ3c*V9w?fr!~3H^=@8!|{vTW8L+T z3x1zbhN=#`Vw#34j;`z!#q|I}gW#8S#UVsD;$Z?5mb&{`Di_J)I0B6h_U-^6_T|;p zoc;BiYs$#Po8?0jhbdmuLAnIIm-MS2@!Iw#I$`G&g1oBR@ji)bXhezAqCb2ly3`ip zAmvYiAT~>ikAeDze!R_h839;nFYs?VY+V3WYl0kz%6M}Z!TGi|6>P`99hqdi^Az6P zzt8Ebd9<9+|Kia77SW5a`Jm*v_eXrwMs9Eob)B|-7Eo$qE)=d$=xRzWOZ3-=B{x$~ zX;5u}1uIiV+?884-BnvsVz%Ezn?W2LT~5$5iAfmtzcbObv+T^`!{Kr$6%}3>Z6mOP##y$uc`tS?hhq z8=iK>CYhV|g)YB(h0oNDt5!IA3TFDZZ3+e6_i}>|qXW+_OZerk`z^AASTAaWn_967 z3sxlk1m1C1uc@Y#s1lj!VQnPK1Lv76)pTt%^uF6$Nfbf?P+y;~=iVS-{L`GM%P}oh zhg%@%BR48)gl%?U>&Re)Vu>A1wbitp5V8XxBZPa&0}s1kwwb}MG(%0Xxe95w@UD9Bpkhm2DP+eP^7qr+suaXx7j(#%~E|~!6MXh?&#~#Gp zIT@xq-21Kax}`fS11m-erS2&KtyOmt1%8xr`F@_ z#8^G~EqXW4P+kjM!<}!Y?{*s%jt}pk2IHqflqv*%$BsVa-LKe87YW0Hbe5pCW#}tI z%LHVDN;Ba!9lHYYcCxKE|MB_ir$Fmy8MozT%SC+eJ(*l`X z{Xrk2pbl!1APEVH>-Vg!v8(EB0%fX=722xVY-Vz8xP!jUSzc|ofY;E@<@Bx0E7!tKB)i0BRYggQRQU!_%0^}UU#fLmA*Cq>}<6Tp`iNuxTYhe z+0o#MWAV1_%3D);;zX-A1tc{=LF>~wSfE2)xu5MiUST`1Nqas`a8ZBx4{N)|Rv4rb zN*vSu`XaYE_J`eiwS2ZoHq73B-k#s}MJOrY_h}aJJvO{RJ@6ShQ8MV^T)Bj700@>I z0yj6G>^}mct*KrUsi}Kb?~egs2m3t);yYmRPD5s2q4U+htfzmc;tBSVhCh&C_T>z4 zrcZrkMx_ne|4g&rBX%@B-pxySPH?c7q!F@lAcs=t=9iP0}KJ_cFvR2C$Wh1I=FC5-gC%vb?=iUCZ9C(q2 zJH4GRT%S~2(=Pu6Rx^Q)?D>w@REldfsecj%sjlzZ!G_b<#=~pZu4tJI5AH{Jv(tey zSH;(O&R(LOk7efa@7ZK)RK50WB?Xj@LfVDt@y+ne(yJct*S@y^=p8_P@#S>Q*ecWi z%0i^U;;rsZ_ z0vp!s9l{RRhQILxQCca9T|km1=og_DVxh;s9kcnu!@8{P-8!5Q^Y;wj48h=B=lmI+ zA9jWg>^5!*)ia6sD_?(WQq>I*<(;C~1v}Pqik-V^Bh3GyfRs|TBZVig;>%R`t0k_O z%Q>kQP+3qLzA2jG4;$z(q@Go^x8|UdH-N9zG1W92h#AJKp^!Zg8H2+}5|6U^o`G-Q z6jqf^^+!v)V)ifJ*>h(FQf(yRr$)XPkL7tvqOeI#ZAmYA0>WYC@BPYi5#C*%d}05B zpsXABa#&c|aW6UPXkdF6hzjMG_969m_BN0#M?F26FX)+^iMc7lj%xC^})hvD6M9$z*%2w_%?FR9ASE|mVF|Jzn{egN>9 zPc~-)-%i7B+q~Yv?&~vPlcvt&Fhp?p0R$hdEuvNiF4d?ysR0xw>Dx(M-xoTlZ#g(A z`FGhB>57k*{wcgZtT-u=ajN3ce&~pc(^35#Y(~goHeBfY3l=;XYzMEf5Ku+QAN=Wk zzBKo(Rrk7OGEn!)IAWoAQJnS_;wrU}t%p^41k2}Vm4xXg$)voeSj&0OK0x^d1oMRf z&NO$0FGp{95?feO=*zZUfAvuMMH*}w{v>~WN5D2i9+F_!hFz2JZ(SO;8g?AFO(qv^ zeJKsA%$5-&rub!LnZubsI-C7xLVcp17-rUeGhk*l4R!`g`2hXxfrV7W|q5XOeK|63gNRec!-hG~{~2gEv|8(2qX7sT80o zBL0ssO3Q6ZylD#k^=Ai9y9ucq4p9}O)ghmJb`6KYKApI<`?2LqF!RU)G!)I6@0Q$yTkAFb5LZ}n_ z%py0u7)Xh^inJd$8slP%=&N1#`jv*^<8M@78~m|g>)~bNHJN1D5(O=NX*trdSNEvp zS<}iba+Fe+E2gVQ2o-8-TuDZqJo~(G8M2B+&O?k9j8kBo>rd7@NIzDkEJdvZ=VP4So=?pKwiP^bU+`wf{Wu>X_TQuF{scI$HB1Ly zGxjl-KWG;b-5buBd;t|tG8OH20jx-P>t0)e*9#nS#wrFbPO}A(`!fsH=C;Hz_FlgV z$^vNatuwdpTID1)mLYs*oo4Xs2ejl;iO$tSq|rAYo9*N`Kdyf|n_cXfwk5MrpuxlaeI?@U>wU{a_ zDZn{#6}Rq!vG%L)-8M1Mo=&6cAhV}ls4I}ax<833S|BvyTb>;fU)zu{j>2O&x<<6p zY!(-14w1X=B(4C~5pV#oooQ>44@TKsQiHkyij_})`&U-+Z}=E;6B~~mi9DnNw~gQK zHNldF>yM*IFeh?cy1+K8;BEXr{NXs>FSmi@miXdhni*Wan^C+IA1{_xA)tI0U`hN% zBqWRlUUJVLUWLK9g;(I1t8u@N^dJZ4Ba6Zgt9ZmyeX_pvXqOw={4=%}8L(a`@?p#F zl;eE256LE5j^zmSau@WL*cm5eUF`!HvS{V<{)`9|NCVuzuVzg^6+gZfxDpX=_f&|^ z82>Wj5�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%0Dv^hXxv{yFUC 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 }sk}9?Q*=@Z#GA$0dIYdr3H|&OUIDuC@ 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%0A#> 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�BZf;){PM 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 eS^wIzj;GMG>dAT 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%0AW`6ftCJJO#<6mMHtz@ezOUKH&&^|GL`+l= z9zP(g2ELL=3EZQFOMc~aW*M2|T$}FcHI!i6 zBEsLBFC1xM89F{^2eu6v-@pWUbRvP$UZK?^ZYNVq8EVp`={=!gx#aq*MG7j=Ll+&} zI&$fq&31QUc)W^1-=m5}@Dwbagk6yqm73#jG%EK7&)G?``7oG&$Vm=Mc1M%fMKJ zkC2Cb+nkV2kyhK4@b!KUX75<_wgfo_1au6(s`W7)o;pCjCtv(psL)RSZ;%x>MY);>feZ3HKV0 zrcIZz{Gm48sFkQurGf}TL}?e%e0ZNSmX_9j;m)k+p`aAH%ok^KD5E!BDBSse@{tc3 z0|;3*>3;lzbQ3XJKpS(mY6s%9~u955SHvKR&vN?=jc#3Pj{O;+5_q#Q6RiIYk|Cv4~tPk1rJ?QAu zqulCnHjjo?_Wu8R!;Jt7OS64w8Ux(1IN_n_2g0TL&!|wW3=cYRdF5W%YR5f?lPoQ< zQ-Oa>rS=YPvOXR~gEQB8i!S8JOt1SVdqWuE-&q}RX|&qY9Pf1TDeHiFD{WNO5RVm3dz*)KJZ+ag-4?P>PzY#HO5<@|SaDd?}54V9Cj+ z5%^bplvPKx6G){df1oT*CAfP zwZCCUuhMS1V>wdU!Q3A`F)os8aCT~6-S=l8QZ4B-!-6r5^30>4|sQ(Ic<%K>JhngU}{rb<%;{z#;-cH)IU z3C0o#Y$CXtC&?gZ_1T2P)j94q+|7lOO@_X6?hKk8Ss6vfNDV7WnkI^xg7K(lGxuze z)B^YU3dNxADwTqzrFCJ6vnRj#w%hEcP7w z7XO^K*j&kUZrR>DyICgw08AsiY@4*OvL&ULnG5WljE>LhOhYKHPTNh(6RguKvx<*o z((fXJd8PR{{wRZ}1p^2fBNDhZ=7?fXJs4Wv5^_mJ≠2HmVj;jP<2VFmI1$qMVo{ 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

    oC``2u#KNQtioKN{~ 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

    9i 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%0D!z5x9P>jMGJC%QSszi{{k3YYE=ue2;#>~ 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ÏL;b;_hUSsGolY)3sN?CCaESf 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 literal 0 HcmV?d00001 diff --git a/docs/assets/neighborhood_attn_2d_vis_light.png b/docs/assets/neighborhood_attn_2d_vis_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4c987f53931501aa413b1a10aaf179a37639733f GIT binary patch literal 2224460 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ⅇ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

    G(9|c6B(RROn?6KWnD$Hz*pCT!)Mc2 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⁢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

  • 5&X^$;#EEgr|qI9%lz&D0OxaJ4o#Dr9ynst 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 z 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℘ZMNx=&$bA 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 z z1ZvFDo<;wT7+%5q$yHi%hu8KMAp z!Njt0#vSN{ac7TL-*)abIteo@u_BpBPXw$Y9Xbhsy^k~$wSRo?g?172$+T}N%(uQS0m?#X zWNXyse%w&8Y<>(gWL9JyY+VEF8ov3|5Y=Z*}U0 z8zdT`1E}K1pNm9-PgE=`WBOq)kI?7s8H)EL_d1PzY9M3|6;yk3(q*3V5&9ec?RXwP z#U9u3;K8eeHduu1O$~w3SOMWG^TGTxz771Y<9A6L33ETk@??8Cfc?PPC0mc{Cca#- z{^NN0Xkpi7iJwH;%*CvUp>6Mv+ZDPt{fak7;shLWgvH6Eg0C%a86HO+nst@T>_J%l zV7FHBWT(7-faJr;Gmwzf*7Scay&>UUu{GE8{KO$=%P1RXUMN$i-1>pRjh=qtW`P;v z?-|wGxz*xT1W)m^d6DdHs)I#tY1Dk(sKNB&L{IiChE-K=*+}O-8^|=Y{2VSuB~va0 zZ8+W*2|+~ zI+UhQSREBeqZglwoO^rk9jg^OkM)+w^R$iVDkdzHrV_pX_bxS<3kRr#!=4XwArF3X zF4GH^9NUoH$a+HN8l>*sUw1d2g$Zh}7&T=CEfrb%nSVvS~JRRnV5;}FVJv@>UWXv!e6qmk^fu!+_{l9X1ficS!u1OLSw%z>Divs}02 zS_!1L-gJ7jl8a(iuH8?_9xa;L$K@MiU*BaN<*%!7s8@Evw!S1i9qA=8|EHK{2np`Hd3SuFvzl+wY)H#Boh|+EY^V{+z)ZS`_x-_m1#aHA5=`k9M>?D7dQB z&PrT*yf2q#_xLD#n#aolhvNROPMBqZlew-Bdtq}i&c!xpx}^j{h)F(~PdF;aG`~;* zGv`98mi#06D6k5~+(CL^RYkXrM|Hn9HAinO=wfph)5_l4rrVTaM%Qo-px|y`brCN{ z!*VGE;?HFzPW-=>A}0~#EBw;UM#Fc*S!F8+1L?bBSu?*wSoDP3dbak%CMCh$cqGz1 z5cx;3AcsbU%rTgf1zzTbi3!y%ns zn0+p}QWTG#O2<*5RlnIKac#d1%4z9@swHWUyi7U90dG*iuZ>$KzofGa zjTxdp+?VgPm%?`EhJNm4Ou5jr+G~EtPRo-tJCwg3g`{?H1UGET?5JtD4sPp_RfvQUglhLrS{G_TW8Se-Lq^